From 7620787814f14abad26dd115ab5432b72228b4b3 Mon Sep 17 00:00:00 2001 From: "ucart@co3050-12" <dawehr@iastate.edu> Date: Sat, 21 Jan 2017 17:18:53 -0600 Subject: [PATCH] Cleaned up git repo. Added FSBL projects, IMU logger project, deleted comm_dev. Put bootimage and Debug directories in .gitignore --- quad/sw/.gitignore | 5 + quad/sw/SDK.log | 0 quad/sw/comm_dev/Debug/comm_dev.elf | Bin 628910 -> 0 bytes quad/sw/comm_dev/Debug/comm_dev.elf.size | 2 - quad/sw/comm_dev/Debug/makefile | 58 - quad/sw/comm_dev/Debug/objects.mk | 8 - quad/sw/comm_dev/Debug/sources.mk | 20 - quad/sw/comm_dev/Debug/src/PID.d | 5 - quad/sw/comm_dev/Debug/src/PID.o | Bin 35424 -> 0 bytes .../Debug/src/actuator_command_processing.d | 105 - .../Debug/src/actuator_command_processing.o | Bin 130316 -> 0 bytes quad/sw/comm_dev/Debug/src/circ_buffer.d | 3 - quad/sw/comm_dev/Debug/src/circ_buffer.o | Bin 31656 -> 0 bytes quad/sw/comm_dev/Debug/src/commands.d | 96 - quad/sw/comm_dev/Debug/src/commands.o | Bin 214364 -> 0 bytes quad/sw/comm_dev/Debug/src/communication.d | 60 - quad/sw/comm_dev/Debug/src/communication.o | Bin 115952 -> 0 bytes .../sw/comm_dev/Debug/src/control_algorithm.d | 107 - .../sw/comm_dev/Debug/src/control_algorithm.o | Bin 136756 -> 0 bytes quad/sw/comm_dev/Debug/src/controllers.d | 87 - quad/sw/comm_dev/Debug/src/controllers.o | Bin 122744 -> 0 bytes quad/sw/comm_dev/Debug/src/conversion.d | 3 - quad/sw/comm_dev/Debug/src/conversion.o | Bin 17216 -> 0 bytes .../sw/comm_dev/Debug/src/iic_mpu9150_utils.d | 51 - .../sw/comm_dev/Debug/src/iic_mpu9150_utils.o | Bin 104752 -> 0 bytes .../Debug/src/initialize_components.d | 133 - .../Debug/src/initialize_components.o | Bin 143748 -> 0 bytes quad/sw/comm_dev/Debug/src/log_data.d | 68 - quad/sw/comm_dev/Debug/src/log_data.o | Bin 120284 -> 0 bytes quad/sw/comm_dev/Debug/src/main.d | 138 - quad/sw/comm_dev/Debug/src/main.o | Bin 139420 -> 0 bytes quad/sw/comm_dev/Debug/src/mio7_led.d | 42 - quad/sw/comm_dev/Debug/src/mio7_led.o | Bin 88708 -> 0 bytes quad/sw/comm_dev/Debug/src/new_comm.d | 90 - quad/sw/comm_dev/Debug/src/new_comm.o | Bin 129224 -> 0 bytes quad/sw/comm_dev/Debug/src/new_log_data.d | 1 - quad/sw/comm_dev/Debug/src/new_log_data.o | Bin 15208 -> 0 bytes .../sw/comm_dev/Debug/src/packet_processing.d | 83 - .../sw/comm_dev/Debug/src/packet_processing.o | Bin 119476 -> 0 bytes quad/sw/comm_dev/Debug/src/platform.d | 16 - quad/sw/comm_dev/Debug/src/platform.o | Bin 40716 -> 0 bytes .../Debug/src/send_actuator_commands.d | 107 - .../Debug/src/send_actuator_commands.o | Bin 126400 -> 0 bytes quad/sw/comm_dev/Debug/src/sensor.d | 98 - quad/sw/comm_dev/Debug/src/sensor.o | Bin 130352 -> 0 bytes .../sw/comm_dev/Debug/src/sensor_processing.d | 111 - .../sw/comm_dev/Debug/src/sensor_processing.o | Bin 135200 -> 0 bytes quad/sw/comm_dev/Debug/src/stringBuilder.d | 6 - quad/sw/comm_dev/Debug/src/stringBuilder.o | Bin 36748 -> 0 bytes quad/sw/comm_dev/Debug/src/subdir.mk | 103 - quad/sw/comm_dev/Debug/src/timer.d | 90 - quad/sw/comm_dev/Debug/src/timer.o | Bin 121204 -> 0 bytes quad/sw/comm_dev/Debug/src/uart.d | 94 - quad/sw/comm_dev/Debug/src/uart.o | Bin 129140 -> 0 bytes quad/sw/comm_dev/Debug/src/update_gui.d | 65 - quad/sw/comm_dev/Debug/src/update_gui.o | Bin 107884 -> 0 bytes quad/sw/comm_dev/Debug/src/user_input.d | 78 - quad/sw/comm_dev/Debug/src/user_input.o | Bin 119868 -> 0 bytes quad/sw/comm_dev/Debug/src/util.d | 76 - quad/sw/comm_dev/Debug/src/util.o | Bin 127720 -> 0 bytes quad/sw/comm_dev/bootimage/golden_boot.bin | Bin 2302804 -> 0 bytes .../golden_boot2_fixed_pid_and_mixer.bin | Bin 2302804 -> 0 bytes .../comm_dev/bootimage/modular_quad_pid.bif | 6 - quad/sw/comm_dev/bootimage/output.bin | Bin 2368340 -> 0 bytes .../the_real_golden_boot(final_demo).bin | Bin 2368340 -> 0 bytes quad/sw/comm_dev/src/circ_buffer.c | 79 - quad/sw/comm_dev/src/circ_buffer.h | 46 - quad/sw/comm_dev/src/commands.h | 87 - quad/sw/comm_dev/src/main.c | 120 - quad/sw/comm_dev/src/new_comm.c | 204 - quad/sw/comm_dev/src/new_comm.h | 26 - quad/sw/{comm_dev => imu_logger}/.cproject | 0 quad/sw/imu_logger/.gitignore | 2 + quad/sw/{comm_dev => imu_logger}/.project | 2 +- .../src/Copy of original lscript.ld | 0 quad/sw/{comm_dev => imu_logger}/src/PID.c | 0 quad/sw/{comm_dev => imu_logger}/src/PID.h | 0 .../{comm_dev => imu_logger}/src/README.txt | 0 .../src/actuator_command_processing.c | 0 .../src/actuator_command_processing.h | 0 .../{comm_dev => imu_logger}/src/commands.c | 366 +- quad/sw/imu_logger/src/commands.h | 72 + .../src/communication.c | 0 .../src/communication.h | 0 .../src/control_algorithm.c | 0 .../src/control_algorithm.h | 0 .../src/controllers.c | 0 .../src/controllers.h | 0 .../{comm_dev => imu_logger}/src/conversion.c | 0 .../{comm_dev => imu_logger}/src/conversion.h | 0 quad/sw/{comm_dev => imu_logger}/src/gam.h | 0 .../src/iic_mpu9150_utils.c | 10 +- .../src/iic_mpu9150_utils.h | 0 .../src/initialize_components.c | 19 +- .../src/initialize_components.h | 0 .../{comm_dev => imu_logger}/src/log_data.c | 0 .../{comm_dev => imu_logger}/src/log_data.h | 0 .../{comm_dev => imu_logger}/src/lscript.ld | 0 quad/sw/imu_logger/src/main.c | 90 + .../{comm_dev => imu_logger}/src/mio7_led.c | 0 .../{comm_dev => imu_logger}/src/mio7_led.h | 0 .../sw/{comm_dev => imu_logger}/src/new_PID.h | 0 .../src/new_log_data.c | 0 .../src/new_log_data.h | 0 .../src/old_log_data.h | 0 .../src/packet_processing.c | 0 .../src/packet_processing.h | 0 .../{comm_dev => imu_logger}/src/platform.c | 0 .../{comm_dev => imu_logger}/src/platform.h | 0 .../src/platform_config.h | 0 .../src/quadposition.h | 0 .../src/send_actuator_commands.c | 0 .../src/send_actuator_commands.h | 0 quad/sw/{comm_dev => imu_logger}/src/sensor.c | 6 +- quad/sw/{comm_dev => imu_logger}/src/sensor.h | 0 .../src/sensor_processing.c | 0 .../src/sensor_processing.h | 0 .../src/stringBuilder.c | 0 .../src/stringBuilder.h | 0 quad/sw/{comm_dev => imu_logger}/src/timer.c | 28 +- quad/sw/{comm_dev => imu_logger}/src/timer.h | 8 +- .../{comm_dev => imu_logger}/src/type_def.h | 12 +- quad/sw/{comm_dev => imu_logger}/src/uart.c | 71 - quad/sw/{comm_dev => imu_logger}/src/uart.h | 6 - .../{comm_dev => imu_logger}/src/update_gui.c | 0 .../{comm_dev => imu_logger}/src/update_gui.h | 0 .../{comm_dev => imu_logger}/src/user_input.c | 0 .../{comm_dev => imu_logger}/src/user_input.h | 0 quad/sw/{comm_dev => imu_logger}/src/util.c | 0 quad/sw/{comm_dev => imu_logger}/src/util.h | 0 quad/sw/modular_quad_pid/.gitignore | 2 + .../bootimage/golden_boot.bin | Bin 2302804 -> 0 bytes .../golden_boot2_fixed_pid_and_mixer.bin | Bin 2302804 -> 0 bytes .../bootimage/modular_quad_pid.bif | 6 - quad/sw/modular_quad_pid/bootimage/output.bin | Bin 2368340 -> 0 bytes .../the_real_golden_boot(final_demo).bin | Bin 2368340 -> 0 bytes quad/zybo_fsbl/.cproject | 172 + quad/zybo_fsbl/.gitignore | 2 + quad/zybo_fsbl/.project | 26 + quad/zybo_fsbl/src/ddr_init.c | 291 + quad/zybo_fsbl/src/diskio.h | 51 + quad/zybo_fsbl/src/ff.c | 3756 +++++ quad/zybo_fsbl/src/ff.h | 541 + quad/zybo_fsbl/src/ffconf.h | 188 + quad/zybo_fsbl/src/fsbl.h | 477 + quad/zybo_fsbl/src/fsbl_debug.h | 98 + quad/zybo_fsbl/src/fsbl_handoff.S | 115 + quad/zybo_fsbl/src/fsbl_hooks.c | 173 + quad/zybo_fsbl/src/fsbl_hooks.h | 90 + quad/zybo_fsbl/src/image_mover.c | 1301 ++ quad/zybo_fsbl/src/image_mover.h | 166 + quad/zybo_fsbl/src/integer.h | 36 + quad/zybo_fsbl/src/librsa.a | Bin 0 -> 12806 bytes quad/zybo_fsbl/src/lscript.ld | 287 + quad/zybo_fsbl/src/main.c | 1516 ++ quad/zybo_fsbl/src/md5.c | 484 + quad/zybo_fsbl/src/md5.h | 129 + quad/zybo_fsbl/src/mmc.c | 1181 ++ quad/zybo_fsbl/src/nand.c | 304 + quad/zybo_fsbl/src/nand.h | 101 + quad/zybo_fsbl/src/nor.c | 153 + quad/zybo_fsbl/src/nor.h | 98 + quad/zybo_fsbl/src/pcap.c | 655 + quad/zybo_fsbl/src/pcap.h | 110 + quad/zybo_fsbl/src/ps7_init.c | 12655 ++++++++++++++++ quad/zybo_fsbl/src/ps7_init.h | 139 + quad/zybo_fsbl/src/qspi.c | 724 + quad/zybo_fsbl/src/qspi.h | 133 + quad/zybo_fsbl/src/rsa.c | 353 + quad/zybo_fsbl/src/rsa.h | 187 + quad/zybo_fsbl/src/sd.c | 191 + quad/zybo_fsbl/src/sd.h | 87 + quad/zybo_fsbl/src/sd_hardware.h | 158 + quad/zybo_fsbl_bsp/.cproject | 15 + quad/zybo_fsbl_bsp/.project | 76 + quad/zybo_fsbl_bsp/.sdkproject | 3 + quad/zybo_fsbl_bsp/Makefile | 21 + quad/zybo_fsbl_bsp/libgen.log | 21 + quad/zybo_fsbl_bsp/libgen.options | 3 + .../include/_profile_timer_hw.h | 292 + .../ps7_cortexa9_0/include/bspconfig.h | 15 + .../ps7_cortexa9_0/include/mblaze_nt_types.h | 51 + .../ps7_cortexa9_0/include/profile.h | 127 + .../ps7_cortexa9_0/include/sleep.h | 58 + .../ps7_cortexa9_0/include/smc.h | 124 + .../ps7_cortexa9_0/include/vectors.h | 90 + .../ps7_cortexa9_0/include/xadcps.h | 566 + .../ps7_cortexa9_0/include/xadcps_hw.h | 506 + .../ps7_cortexa9_0/include/xbasic_types.h | 300 + .../ps7_cortexa9_0/include/xcpu_cortexa9.h | 49 + .../ps7_cortexa9_0/include/xdebug.h | 61 + .../ps7_cortexa9_0/include/xdevcfg.h | 385 + .../ps7_cortexa9_0/include/xdevcfg_hw.h | 400 + .../ps7_cortexa9_0/include/xdmaps.h | 317 + .../ps7_cortexa9_0/include/xdmaps_hw.h | 299 + .../ps7_cortexa9_0/include/xemacps.h | 716 + .../ps7_cortexa9_0/include/xemacps_bd.h | 737 + .../ps7_cortexa9_0/include/xemacps_bdring.h | 242 + .../ps7_cortexa9_0/include/xemacps_hw.h | 603 + .../ps7_cortexa9_0/include/xenv.h | 177 + .../ps7_cortexa9_0/include/xenv_none.h | 41 + .../ps7_cortexa9_0/include/xenv_standalone.h | 356 + .../ps7_cortexa9_0/include/xenv_vxworks.h | 258 + .../ps7_cortexa9_0/include/xgpio.h | 203 + .../ps7_cortexa9_0/include/xgpio_l.h | 235 + .../ps7_cortexa9_0/include/xgpiops.h | 262 + .../ps7_cortexa9_0/include/xgpiops_hw.h | 158 + .../ps7_cortexa9_0/include/xiicps.h | 394 + .../ps7_cortexa9_0/include/xiicps_hw.h | 388 + .../ps7_cortexa9_0/include/xil_assert.h | 195 + .../ps7_cortexa9_0/include/xil_cache.h | 84 + .../ps7_cortexa9_0/include/xil_cache_l.h | 103 + .../include/xil_cache_vxworks.h | 103 + .../ps7_cortexa9_0/include/xil_errata.h | 117 + .../ps7_cortexa9_0/include/xil_exception.h | 241 + .../ps7_cortexa9_0/include/xil_hal.h | 71 + .../ps7_cortexa9_0/include/xil_io.h | 254 + .../ps7_cortexa9_0/include/xil_macroback.h | 1069 ++ .../include/xil_misc_psreset_api.h | 286 + .../ps7_cortexa9_0/include/xil_mmu.h | 87 + .../ps7_cortexa9_0/include/xil_printf.h | 47 + .../ps7_cortexa9_0/include/xil_testcache.h | 71 + .../ps7_cortexa9_0/include/xil_testio.h | 101 + .../ps7_cortexa9_0/include/xil_testmem.h | 173 + .../ps7_cortexa9_0/include/xil_types.h | 160 + .../ps7_cortexa9_0/include/xl2cc.h | 180 + .../ps7_cortexa9_0/include/xl2cc_counter.h | 117 + .../ps7_cortexa9_0/include/xparameters.h | 539 + .../ps7_cortexa9_0/include/xparameters_ps.h | 334 + .../ps7_cortexa9_0/include/xpm_counter.h | 580 + .../ps7_cortexa9_0/include/xpseudo_asm.h | 64 + .../ps7_cortexa9_0/include/xpseudo_asm_gcc.h | 183 + .../ps7_cortexa9_0/include/xqspips.h | 790 + .../ps7_cortexa9_0/include/xqspips_hw.h | 381 + .../ps7_cortexa9_0/include/xreg_cortexa9.h | 599 + .../ps7_cortexa9_0/include/xscugic.h | 318 + .../ps7_cortexa9_0/include/xscugic_hw.h | 641 + .../ps7_cortexa9_0/include/xscutimer.h | 365 + .../ps7_cortexa9_0/include/xscutimer_hw.h | 292 + .../ps7_cortexa9_0/include/xscuwdt.h | 384 + .../ps7_cortexa9_0/include/xscuwdt_hw.h | 187 + .../ps7_cortexa9_0/include/xstatus.h | 439 + .../ps7_cortexa9_0/include/xtime_l.h | 96 + .../ps7_cortexa9_0/include/xtmrctr.h | 309 + .../ps7_cortexa9_0/include/xtmrctr_i.h | 88 + .../ps7_cortexa9_0/include/xtmrctr_l.h | 435 + .../ps7_cortexa9_0/include/xuartps.h | 511 + .../ps7_cortexa9_0/include/xuartps_hw.h | 432 + .../ps7_cortexa9_0/include/xusbps.h | 1091 ++ .../ps7_cortexa9_0/include/xusbps_endpoint.h | 521 + .../ps7_cortexa9_0/include/xusbps_hw.h | 531 + .../ps7_cortexa9_0/include/xutil.h | 154 + .../ps7_cortexa9_0/include/xversion.h | 98 + .../zybo_fsbl_bsp/ps7_cortexa9_0/lib/libxil.a | Bin 0 -> 923574 bytes .../libsrc/common_v1_00_a/src/Makefile | 28 + .../libsrc/common_v1_00_a/src/xbasic_types.c | 137 + .../libsrc/common_v1_00_a/src/xbasic_types.h | 300 + .../libsrc/common_v1_00_a/src/xdebug.h | 61 + .../libsrc/common_v1_00_a/src/xenv.h | 177 + .../libsrc/common_v1_00_a/src/xenv_linux.h | 241 + .../libsrc/common_v1_00_a/src/xenv_none.h | 41 + .../common_v1_00_a/src/xenv_standalone.h | 356 + .../libsrc/common_v1_00_a/src/xenv_vxworks.h | 258 + .../libsrc/common_v1_00_a/src/xparameters.h | 738 + .../libsrc/common_v1_00_a/src/xstatus.h | 418 + .../libsrc/common_v1_00_a/src/xutil.h | 154 + .../libsrc/common_v1_00_a/src/xutil_memtest.c | 1173 ++ .../libsrc/common_v1_00_a/src/xversion.c | 344 + .../libsrc/common_v1_00_a/src/xversion.h | 98 + .../libsrc/cpu_cortexa9_v1_01_a/src/Makefile | 23 + .../cpu_cortexa9_v1_01_a/src/xcpu_cortexa9.h | 49 + .../libsrc/devcfg_v2_04_a/src/Makefile | 41 + .../libsrc/devcfg_v2_04_a/src/xdevcfg.c | 909 ++ .../libsrc/devcfg_v2_04_a/src/xdevcfg.h | 385 + .../libsrc/devcfg_v2_04_a/src/xdevcfg_g.c | 30 + .../libsrc/devcfg_v2_04_a/src/xdevcfg_hw.c | 119 + .../libsrc/devcfg_v2_04_a/src/xdevcfg_hw.h | 400 + .../libsrc/devcfg_v2_04_a/src/xdevcfg_intr.c | 316 + .../devcfg_v2_04_a/src/xdevcfg_selftest.c | 120 + .../libsrc/devcfg_v2_04_a/src/xdevcfg_sinit.c | 99 + .../libsrc/dmaps_v1_06_a/src/Makefile | 41 + .../libsrc/dmaps_v1_06_a/src/xdmaps.c | 2091 +++ .../libsrc/dmaps_v1_06_a/src/xdmaps.h | 317 + .../libsrc/dmaps_v1_06_a/src/xdmaps_g.c | 34 + .../libsrc/dmaps_v1_06_a/src/xdmaps_hw.c | 122 + .../libsrc/dmaps_v1_06_a/src/xdmaps_hw.h | 299 + .../dmaps_v1_06_a/src/xdmaps_selftest.c | 116 + .../libsrc/dmaps_v1_06_a/src/xdmaps_sinit.c | 110 + .../libsrc/emacps_v1_05_a/src/Makefile | 41 + .../libsrc/emacps_v1_05_a/src/xemacps.c | 401 + .../libsrc/emacps_v1_05_a/src/xemacps.h | 716 + .../libsrc/emacps_v1_05_a/src/xemacps_bd.h | 737 + .../emacps_v1_05_a/src/xemacps_bdring.c | 1010 ++ .../emacps_v1_05_a/src/xemacps_bdring.h | 242 + .../emacps_v1_05_a/src/xemacps_control.c | 1084 ++ .../libsrc/emacps_v1_05_a/src/xemacps_g.c | 30 + .../libsrc/emacps_v1_05_a/src/xemacps_hw.c | 132 + .../libsrc/emacps_v1_05_a/src/xemacps_hw.h | 603 + .../libsrc/emacps_v1_05_a/src/xemacps_intr.c | 229 + .../libsrc/emacps_v1_05_a/src/xemacps_sinit.c | 102 + .../libsrc/gpio_v3_01_a/src/Makefile | 28 + .../libsrc/gpio_v3_01_a/src/xgpio.c | 264 + .../libsrc/gpio_v3_01_a/src/xgpio.h | 203 + .../libsrc/gpio_v3_01_a/src/xgpio_extra.c | 174 + .../libsrc/gpio_v3_01_a/src/xgpio_g.c | 32 + .../libsrc/gpio_v3_01_a/src/xgpio_i.h | 93 + .../libsrc/gpio_v3_01_a/src/xgpio_intr.c | 301 + .../libsrc/gpio_v3_01_a/src/xgpio_l.h | 235 + .../libsrc/gpio_v3_01_a/src/xgpio_selftest.c | 116 + .../libsrc/gpio_v3_01_a/src/xgpio_sinit.c | 159 + .../libsrc/gpiops_v1_02_a/src/Makefile | 41 + .../libsrc/gpiops_v1_02_a/src/xgpiops.c | 604 + .../libsrc/gpiops_v1_02_a/src/xgpiops.h | 262 + .../libsrc/gpiops_v1_02_a/src/xgpiops_g.c | 30 + .../libsrc/gpiops_v1_02_a/src/xgpiops_hw.c | 171 + .../libsrc/gpiops_v1_02_a/src/xgpiops_hw.h | 158 + .../libsrc/gpiops_v1_02_a/src/xgpiops_intr.c | 741 + .../gpiops_v1_02_a/src/xgpiops_selftest.c | 140 + .../libsrc/gpiops_v1_02_a/src/xgpiops_sinit.c | 106 + .../libsrc/iicps_v1_04_a/src/Makefile | 41 + .../libsrc/iicps_v1_04_a/src/xiicps.c | 326 + .../libsrc/iicps_v1_04_a/src/xiicps.h | 394 + .../libsrc/iicps_v1_04_a/src/xiicps_g.c | 31 + .../libsrc/iicps_v1_04_a/src/xiicps_hw.c | 116 + .../libsrc/iicps_v1_04_a/src/xiicps_hw.h | 388 + .../libsrc/iicps_v1_04_a/src/xiicps_intr.c | 106 + .../libsrc/iicps_v1_04_a/src/xiicps_master.c | 876 ++ .../libsrc/iicps_v1_04_a/src/xiicps_options.c | 455 + .../iicps_v1_04_a/src/xiicps_selftest.c | 140 + .../libsrc/iicps_v1_04_a/src/xiicps_sinit.c | 107 + .../libsrc/iicps_v1_04_a/src/xiicps_slave.c | 585 + .../libsrc/qspips_v2_03_a/src/Makefile | 41 + .../libsrc/qspips_v2_03_a/src/xqspips.c | 1558 ++ .../libsrc/qspips_v2_03_a/src/xqspips.h | 790 + .../libsrc/qspips_v2_03_a/src/xqspips_g.c | 32 + .../libsrc/qspips_v2_03_a/src/xqspips_hw.c | 228 + .../libsrc/qspips_v2_03_a/src/xqspips_hw.h | 381 + .../qspips_v2_03_a/src/xqspips_options.c | 434 + .../qspips_v2_03_a/src/xqspips_selftest.c | 159 + .../libsrc/qspips_v2_03_a/src/xqspips_sinit.c | 106 + .../libsrc/scugic_v1_05_a/src/Makefile | 41 + .../libsrc/scugic_v1_05_a/src/xscugic.c | 716 + .../libsrc/scugic_v1_05_a/src/xscugic.h | 318 + .../libsrc/scugic_v1_05_a/src/xscugic_g.c | 31 + .../libsrc/scugic_v1_05_a/src/xscugic_hw.c | 567 + .../libsrc/scugic_v1_05_a/src/xscugic_hw.h | 641 + .../libsrc/scugic_v1_05_a/src/xscugic_intr.c | 174 + .../scugic_v1_05_a/src/xscugic_selftest.c | 119 + .../libsrc/scugic_v1_05_a/src/xscugic_sinit.c | 109 + .../libsrc/scutimer_v1_02_a/src/Makefile | 41 + .../libsrc/scutimer_v1_02_a/src/xscutimer.c | 289 + .../libsrc/scutimer_v1_02_a/src/xscutimer.h | 365 + .../libsrc/scutimer_v1_02_a/src/xscutimer_g.c | 30 + .../scutimer_v1_02_a/src/xscutimer_hw.h | 292 + .../scutimer_v1_02_a/src/xscutimer_selftest.c | 140 + .../scutimer_v1_02_a/src/xscutimer_sinit.c | 99 + .../libsrc/scuwdt_v1_02_a/src/Makefile | 41 + .../libsrc/scuwdt_v1_02_a/src/xscuwdt.c | 219 + .../libsrc/scuwdt_v1_02_a/src/xscuwdt.h | 384 + .../libsrc/scuwdt_v1_02_a/src/xscuwdt_g.c | 30 + .../libsrc/scuwdt_v1_02_a/src/xscuwdt_hw.h | 187 + .../scuwdt_v1_02_a/src/xscuwdt_selftest.c | 132 + .../libsrc/scuwdt_v1_02_a/src/xscuwdt_sinit.c | 99 + .../libsrc/standalone_v3_11_a/src/Makefile | 72 + .../libsrc/standalone_v3_11_a/src/_exit.c | 50 + .../libsrc/standalone_v3_11_a/src/_exit.o | Bin 0 -> 2332 bytes .../libsrc/standalone_v3_11_a/src/_open.c | 62 + .../libsrc/standalone_v3_11_a/src/_open.o | Bin 0 -> 2848 bytes .../libsrc/standalone_v3_11_a/src/_sbrk.c | 71 + .../libsrc/standalone_v3_11_a/src/_sbrk.o | Bin 0 -> 2860 bytes .../libsrc/standalone_v3_11_a/src/abort.c | 51 + .../libsrc/standalone_v3_11_a/src/abort.o | Bin 0 -> 2716 bytes .../standalone_v3_11_a/src/asm_vectors.S | 205 + .../standalone_v3_11_a/src/asm_vectors.o | Bin 0 -> 2268 bytes .../libsrc/standalone_v3_11_a/src/boot.S | 448 + .../libsrc/standalone_v3_11_a/src/boot.o | Bin 0 -> 3824 bytes .../libsrc/standalone_v3_11_a/src/bspconfig.h | 15 + .../standalone_v3_11_a/src/changelog.txt | 147 + .../libsrc/standalone_v3_11_a/src/close.c | 55 + .../libsrc/standalone_v3_11_a/src/close.o | Bin 0 -> 1992 bytes .../libsrc/standalone_v3_11_a/src/config.make | 3 + .../libsrc/standalone_v3_11_a/src/cpu_init.S | 88 + .../libsrc/standalone_v3_11_a/src/cpu_init.o | Bin 0 -> 1420 bytes .../libsrc/standalone_v3_11_a/src/errno.c | 59 + .../libsrc/standalone_v3_11_a/src/errno.o | Bin 0 -> 6920 bytes .../libsrc/standalone_v3_11_a/src/fcntl.c | 54 + .../libsrc/standalone_v3_11_a/src/fcntl.o | Bin 0 -> 2348 bytes .../libsrc/standalone_v3_11_a/src/fstat.c | 58 + .../libsrc/standalone_v3_11_a/src/fstat.o | Bin 0 -> 3456 bytes .../libsrc/standalone_v3_11_a/src/getpid.c | 59 + .../libsrc/standalone_v3_11_a/src/getpid.o | Bin 0 -> 1968 bytes .../libsrc/standalone_v3_11_a/src/inbyte.c | 14 + .../libsrc/standalone_v3_11_a/src/inbyte.o | Bin 0 -> 2456 bytes .../libsrc/standalone_v3_11_a/src/isatty.c | 64 + .../libsrc/standalone_v3_11_a/src/isatty.o | Bin 0 -> 2652 bytes .../libsrc/standalone_v3_11_a/src/kill.c | 67 + .../libsrc/standalone_v3_11_a/src/kill.o | Bin 0 -> 3136 bytes .../libsrc/standalone_v3_11_a/src/lseek.c | 69 + .../libsrc/standalone_v3_11_a/src/lseek.o | Bin 0 -> 3316 bytes .../libsrc/standalone_v3_11_a/src/open.c | 61 + .../libsrc/standalone_v3_11_a/src/open.o | Bin 0 -> 2844 bytes .../libsrc/standalone_v3_11_a/src/outbyte.c | 15 + .../libsrc/standalone_v3_11_a/src/outbyte.o | Bin 0 -> 2596 bytes .../libsrc/standalone_v3_11_a/src/print.c | 31 + .../libsrc/standalone_v3_11_a/src/print.o | Bin 0 -> 2592 bytes .../standalone_v3_11_a/src/profile/Makefile | 65 + .../src/profile/_profile_clean.c | 33 + .../src/profile/_profile_init.c | 80 + .../src/profile/_profile_timer_hw.c | 346 + .../src/profile/_profile_timer_hw.h | 292 + .../standalone_v3_11_a/src/profile/dummy.S | 50 + .../src/profile/mblaze_nt_types.h | 51 + .../standalone_v3_11_a/src/profile/profile.h | 127 + .../src/profile/profile_cg.c | 146 + .../src/profile/profile_config.h | 36 + .../src/profile/profile_hist.c | 53 + .../src/profile/profile_mcount_arm.S | 33 + .../src/profile/profile_mcount_mb.S | 55 + .../src/profile/profile_mcount_ppc.S | 58 + .../libsrc/standalone_v3_11_a/src/putnum.c | 41 + .../libsrc/standalone_v3_11_a/src/putnum.o | Bin 0 -> 2680 bytes .../libsrc/standalone_v3_11_a/src/read.c | 100 + .../libsrc/standalone_v3_11_a/src/read.o | Bin 0 -> 3432 bytes .../libsrc/standalone_v3_11_a/src/sbrk.c | 76 + .../libsrc/standalone_v3_11_a/src/sbrk.o | Bin 0 -> 3160 bytes .../libsrc/standalone_v3_11_a/src/sleep.c | 89 + .../libsrc/standalone_v3_11_a/src/sleep.h | 58 + .../libsrc/standalone_v3_11_a/src/sleep.o | Bin 0 -> 2612 bytes .../libsrc/standalone_v3_11_a/src/smc.c | 146 + .../libsrc/standalone_v3_11_a/src/smc.h | 124 + .../libsrc/standalone_v3_11_a/src/smc.o | Bin 0 -> 3020 bytes .../src/translation_table.o | Bin 0 -> 17043 bytes .../src/translation_table.s | 141 + .../libsrc/standalone_v3_11_a/src/uart.c | 159 + .../libsrc/standalone_v3_11_a/src/uart.o | Bin 0 -> 3728 bytes .../libsrc/standalone_v3_11_a/src/unlink.c | 58 + .../libsrc/standalone_v3_11_a/src/unlink.o | Bin 0 -> 2700 bytes .../libsrc/standalone_v3_11_a/src/usleep.c | 113 + .../libsrc/standalone_v3_11_a/src/usleep.o | Bin 0 -> 2816 bytes .../libsrc/standalone_v3_11_a/src/vectors.c | 177 + .../libsrc/standalone_v3_11_a/src/vectors.h | 90 + .../libsrc/standalone_v3_11_a/src/vectors.o | Bin 0 -> 3568 bytes .../libsrc/standalone_v3_11_a/src/write.c | 103 + .../libsrc/standalone_v3_11_a/src/write.o | Bin 0 -> 3484 bytes .../libsrc/standalone_v3_11_a/src/xil-crt0.S | 166 + .../libsrc/standalone_v3_11_a/src/xil-crt0.o | Bin 0 -> 2016 bytes .../standalone_v3_11_a/src/xil_assert.c | 139 + .../standalone_v3_11_a/src/xil_assert.h | 195 + .../standalone_v3_11_a/src/xil_assert.o | Bin 0 -> 3356 bytes .../libsrc/standalone_v3_11_a/src/xil_cache.c | 1499 ++ .../libsrc/standalone_v3_11_a/src/xil_cache.h | 84 + .../libsrc/standalone_v3_11_a/src/xil_cache.o | Bin 0 -> 21832 bytes .../standalone_v3_11_a/src/xil_cache_l.h | 103 + .../src/xil_cache_vxworks.h | 103 + .../standalone_v3_11_a/src/xil_errata.h | 117 + .../standalone_v3_11_a/src/xil_exception.c | 188 + .../standalone_v3_11_a/src/xil_exception.h | 241 + .../standalone_v3_11_a/src/xil_exception.o | Bin 0 -> 4016 bytes .../libsrc/standalone_v3_11_a/src/xil_hal.h | 71 + .../libsrc/standalone_v3_11_a/src/xil_io.c | 350 + .../libsrc/standalone_v3_11_a/src/xil_io.h | 254 + .../libsrc/standalone_v3_11_a/src/xil_io.o | Bin 0 -> 6412 bytes .../standalone_v3_11_a/src/xil_macroback.h | 1069 ++ .../src/xil_misc_psreset_api.c | 531 + .../src/xil_misc_psreset_api.h | 286 + .../src/xil_misc_psreset_api.o | Bin 0 -> 11796 bytes .../libsrc/standalone_v3_11_a/src/xil_mmu.c | 189 + .../libsrc/standalone_v3_11_a/src/xil_mmu.h | 87 + .../libsrc/standalone_v3_11_a/src/xil_mmu.o | Bin 0 -> 3892 bytes .../standalone_v3_11_a/src/xil_printf.c | 256 + .../standalone_v3_11_a/src/xil_printf.h | 47 + .../standalone_v3_11_a/src/xil_printf.o | Bin 0 -> 10800 bytes .../standalone_v3_11_a/src/xil_testcache.c | 224 + .../standalone_v3_11_a/src/xil_testcache.h | 71 + .../standalone_v3_11_a/src/xil_testcache.o | Bin 0 -> 7620 bytes .../standalone_v3_11_a/src/xil_testio.c | 304 + .../standalone_v3_11_a/src/xil_testio.h | 101 + .../standalone_v3_11_a/src/xil_testio.o | Bin 0 -> 7492 bytes .../standalone_v3_11_a/src/xil_testmem.c | 1004 ++ .../standalone_v3_11_a/src/xil_testmem.h | 173 + .../standalone_v3_11_a/src/xil_testmem.o | Bin 0 -> 16608 bytes .../libsrc/standalone_v3_11_a/src/xil_types.h | 160 + .../libsrc/standalone_v3_11_a/src/xl2cc.h | 180 + .../standalone_v3_11_a/src/xl2cc_counter.c | 174 + .../standalone_v3_11_a/src/xl2cc_counter.h | 117 + .../standalone_v3_11_a/src/xl2cc_counter.o | Bin 0 -> 3364 bytes .../standalone_v3_11_a/src/xparameters_ps.h | 334 + .../standalone_v3_11_a/src/xpm_counter.c | 304 + .../standalone_v3_11_a/src/xpm_counter.h | 580 + .../standalone_v3_11_a/src/xpm_counter.o | Bin 0 -> 4936 bytes .../standalone_v3_11_a/src/xpseudo_asm.h | 64 + .../standalone_v3_11_a/src/xpseudo_asm_gcc.h | 183 + .../standalone_v3_11_a/src/xreg_cortexa9.h | 599 + .../libsrc/standalone_v3_11_a/src/xstatus.h | 439 + .../libsrc/standalone_v3_11_a/src/xtime_l.c | 129 + .../libsrc/standalone_v3_11_a/src/xtime_l.h | 96 + .../libsrc/standalone_v3_11_a/src/xtime_l.o | Bin 0 -> 3544 bytes .../libsrc/tmrctr_v2_05_a/src/Makefile | 28 + .../libsrc/tmrctr_v2_05_a/src/xtmrctr.c | 531 + .../libsrc/tmrctr_v2_05_a/src/xtmrctr.h | 309 + .../libsrc/tmrctr_v2_05_a/src/xtmrctr_g.c | 30 + .../libsrc/tmrctr_v2_05_a/src/xtmrctr_i.h | 88 + .../libsrc/tmrctr_v2_05_a/src/xtmrctr_intr.c | 239 + .../libsrc/tmrctr_v2_05_a/src/xtmrctr_l.c | 85 + .../libsrc/tmrctr_v2_05_a/src/xtmrctr_l.h | 435 + .../tmrctr_v2_05_a/src/xtmrctr_options.c | 223 + .../tmrctr_v2_05_a/src/xtmrctr_selftest.c | 172 + .../libsrc/tmrctr_v2_05_a/src/xtmrctr_stats.c | 121 + .../libsrc/uartps_v1_05_a/src/Makefile | 41 + .../libsrc/uartps_v1_05_a/src/xuartps.c | 673 + .../libsrc/uartps_v1_05_a/src/xuartps.h | 511 + .../libsrc/uartps_v1_05_a/src/xuartps_g.c | 38 + .../libsrc/uartps_v1_05_a/src/xuartps_hw.c | 201 + .../libsrc/uartps_v1_05_a/src/xuartps_hw.h | 432 + .../libsrc/uartps_v1_05_a/src/xuartps_intr.c | 452 + .../uartps_v1_05_a/src/xuartps_options.c | 805 + .../uartps_v1_05_a/src/xuartps_selftest.c | 176 + .../libsrc/uartps_v1_05_a/src/xuartps_sinit.c | 104 + .../libsrc/usbps_v1_05_a/src/Makefile | 41 + .../libsrc/usbps_v1_05_a/src/xusbps.c | 437 + .../libsrc/usbps_v1_05_a/src/xusbps.h | 1091 ++ .../usbps_v1_05_a/src/xusbps_endpoint.c | 1384 ++ .../usbps_v1_05_a/src/xusbps_endpoint.h | 521 + .../libsrc/usbps_v1_05_a/src/xusbps_g.c | 30 + .../libsrc/usbps_v1_05_a/src/xusbps_hw.c | 128 + .../libsrc/usbps_v1_05_a/src/xusbps_hw.h | 531 + .../libsrc/usbps_v1_05_a/src/xusbps_intr.c | 476 + .../libsrc/usbps_v1_05_a/src/xusbps_sinit.c | 105 + .../libsrc/xadcps_v1_02_a/src/Makefile | 41 + .../libsrc/xadcps_v1_02_a/src/xadcps.c | 1835 +++ .../libsrc/xadcps_v1_02_a/src/xadcps.h | 566 + .../libsrc/xadcps_v1_02_a/src/xadcps_g.c | 30 + .../libsrc/xadcps_v1_02_a/src/xadcps_hw.h | 506 + .../libsrc/xadcps_v1_02_a/src/xadcps_intr.c | 256 + .../xadcps_v1_02_a/src/xadcps_selftest.c | 147 + .../libsrc/xadcps_v1_02_a/src/xadcps_sinit.c | 109 + quad/zybo_fsbl_bsp/system.mss | 291 + 537 files changed, 111624 insertions(+), 2987 deletions(-) create mode 100644 quad/sw/.gitignore delete mode 100644 quad/sw/SDK.log delete mode 100755 quad/sw/comm_dev/Debug/comm_dev.elf delete mode 100644 quad/sw/comm_dev/Debug/comm_dev.elf.size delete mode 100644 quad/sw/comm_dev/Debug/makefile delete mode 100644 quad/sw/comm_dev/Debug/objects.mk delete mode 100644 quad/sw/comm_dev/Debug/sources.mk delete mode 100644 quad/sw/comm_dev/Debug/src/PID.d delete mode 100644 quad/sw/comm_dev/Debug/src/PID.o delete mode 100644 quad/sw/comm_dev/Debug/src/actuator_command_processing.d delete mode 100644 quad/sw/comm_dev/Debug/src/actuator_command_processing.o delete mode 100644 quad/sw/comm_dev/Debug/src/circ_buffer.d delete mode 100644 quad/sw/comm_dev/Debug/src/circ_buffer.o delete mode 100644 quad/sw/comm_dev/Debug/src/commands.d delete mode 100644 quad/sw/comm_dev/Debug/src/commands.o delete mode 100644 quad/sw/comm_dev/Debug/src/communication.d delete mode 100644 quad/sw/comm_dev/Debug/src/communication.o delete mode 100644 quad/sw/comm_dev/Debug/src/control_algorithm.d delete mode 100644 quad/sw/comm_dev/Debug/src/control_algorithm.o delete mode 100644 quad/sw/comm_dev/Debug/src/controllers.d delete mode 100644 quad/sw/comm_dev/Debug/src/controllers.o delete mode 100644 quad/sw/comm_dev/Debug/src/conversion.d delete mode 100644 quad/sw/comm_dev/Debug/src/conversion.o delete mode 100644 quad/sw/comm_dev/Debug/src/iic_mpu9150_utils.d delete mode 100644 quad/sw/comm_dev/Debug/src/iic_mpu9150_utils.o delete mode 100644 quad/sw/comm_dev/Debug/src/initialize_components.d delete mode 100644 quad/sw/comm_dev/Debug/src/initialize_components.o delete mode 100644 quad/sw/comm_dev/Debug/src/log_data.d delete mode 100644 quad/sw/comm_dev/Debug/src/log_data.o delete mode 100644 quad/sw/comm_dev/Debug/src/main.d delete mode 100644 quad/sw/comm_dev/Debug/src/main.o delete mode 100644 quad/sw/comm_dev/Debug/src/mio7_led.d delete mode 100644 quad/sw/comm_dev/Debug/src/mio7_led.o delete mode 100644 quad/sw/comm_dev/Debug/src/new_comm.d delete mode 100644 quad/sw/comm_dev/Debug/src/new_comm.o delete mode 100644 quad/sw/comm_dev/Debug/src/new_log_data.d delete mode 100644 quad/sw/comm_dev/Debug/src/new_log_data.o delete mode 100644 quad/sw/comm_dev/Debug/src/packet_processing.d delete mode 100644 quad/sw/comm_dev/Debug/src/packet_processing.o delete mode 100644 quad/sw/comm_dev/Debug/src/platform.d delete mode 100644 quad/sw/comm_dev/Debug/src/platform.o delete mode 100644 quad/sw/comm_dev/Debug/src/send_actuator_commands.d delete mode 100644 quad/sw/comm_dev/Debug/src/send_actuator_commands.o delete mode 100644 quad/sw/comm_dev/Debug/src/sensor.d delete mode 100644 quad/sw/comm_dev/Debug/src/sensor.o delete mode 100644 quad/sw/comm_dev/Debug/src/sensor_processing.d delete mode 100644 quad/sw/comm_dev/Debug/src/sensor_processing.o delete mode 100644 quad/sw/comm_dev/Debug/src/stringBuilder.d delete mode 100644 quad/sw/comm_dev/Debug/src/stringBuilder.o delete mode 100644 quad/sw/comm_dev/Debug/src/subdir.mk delete mode 100644 quad/sw/comm_dev/Debug/src/timer.d delete mode 100644 quad/sw/comm_dev/Debug/src/timer.o delete mode 100644 quad/sw/comm_dev/Debug/src/uart.d delete mode 100644 quad/sw/comm_dev/Debug/src/uart.o delete mode 100644 quad/sw/comm_dev/Debug/src/update_gui.d delete mode 100644 quad/sw/comm_dev/Debug/src/update_gui.o delete mode 100644 quad/sw/comm_dev/Debug/src/user_input.d delete mode 100644 quad/sw/comm_dev/Debug/src/user_input.o delete mode 100644 quad/sw/comm_dev/Debug/src/util.d delete mode 100644 quad/sw/comm_dev/Debug/src/util.o delete mode 100644 quad/sw/comm_dev/bootimage/golden_boot.bin delete mode 100644 quad/sw/comm_dev/bootimage/golden_boot2_fixed_pid_and_mixer.bin delete mode 100644 quad/sw/comm_dev/bootimage/modular_quad_pid.bif delete mode 100644 quad/sw/comm_dev/bootimage/output.bin delete mode 100644 quad/sw/comm_dev/bootimage/the_real_golden_boot(final_demo).bin delete mode 100644 quad/sw/comm_dev/src/circ_buffer.c delete mode 100644 quad/sw/comm_dev/src/circ_buffer.h delete mode 100644 quad/sw/comm_dev/src/commands.h delete mode 100644 quad/sw/comm_dev/src/main.c delete mode 100644 quad/sw/comm_dev/src/new_comm.c delete mode 100644 quad/sw/comm_dev/src/new_comm.h rename quad/sw/{comm_dev => imu_logger}/.cproject (100%) create mode 100644 quad/sw/imu_logger/.gitignore rename quad/sw/{comm_dev => imu_logger}/.project (96%) rename quad/sw/{comm_dev => imu_logger}/src/Copy of original lscript.ld (100%) rename quad/sw/{comm_dev => imu_logger}/src/PID.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/PID.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/README.txt (100%) rename quad/sw/{comm_dev => imu_logger}/src/actuator_command_processing.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/actuator_command_processing.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/commands.c (75%) create mode 100644 quad/sw/imu_logger/src/commands.h rename quad/sw/{comm_dev => imu_logger}/src/communication.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/communication.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/control_algorithm.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/control_algorithm.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/controllers.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/controllers.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/conversion.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/conversion.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/gam.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/iic_mpu9150_utils.c (92%) rename quad/sw/{comm_dev => imu_logger}/src/iic_mpu9150_utils.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/initialize_components.c (92%) rename quad/sw/{comm_dev => imu_logger}/src/initialize_components.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/log_data.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/log_data.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/lscript.ld (100%) create mode 100644 quad/sw/imu_logger/src/main.c rename quad/sw/{comm_dev => imu_logger}/src/mio7_led.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/mio7_led.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/new_PID.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/new_log_data.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/new_log_data.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/old_log_data.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/packet_processing.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/packet_processing.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/platform.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/platform.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/platform_config.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/quadposition.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/send_actuator_commands.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/send_actuator_commands.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/sensor.c (87%) rename quad/sw/{comm_dev => imu_logger}/src/sensor.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/sensor_processing.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/sensor_processing.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/stringBuilder.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/stringBuilder.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/timer.c (76%) rename quad/sw/{comm_dev => imu_logger}/src/timer.h (84%) rename quad/sw/{comm_dev => imu_logger}/src/type_def.h (98%) rename quad/sw/{comm_dev => imu_logger}/src/uart.c (81%) rename quad/sw/{comm_dev => imu_logger}/src/uart.h (91%) rename quad/sw/{comm_dev => imu_logger}/src/update_gui.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/update_gui.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/user_input.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/user_input.h (100%) rename quad/sw/{comm_dev => imu_logger}/src/util.c (100%) rename quad/sw/{comm_dev => imu_logger}/src/util.h (100%) create mode 100644 quad/sw/modular_quad_pid/.gitignore delete mode 100644 quad/sw/modular_quad_pid/bootimage/golden_boot.bin delete mode 100644 quad/sw/modular_quad_pid/bootimage/golden_boot2_fixed_pid_and_mixer.bin delete mode 100644 quad/sw/modular_quad_pid/bootimage/modular_quad_pid.bif delete mode 100644 quad/sw/modular_quad_pid/bootimage/output.bin delete mode 100644 quad/sw/modular_quad_pid/bootimage/the_real_golden_boot(final_demo).bin create mode 100644 quad/zybo_fsbl/.cproject create mode 100644 quad/zybo_fsbl/.gitignore create mode 100644 quad/zybo_fsbl/.project create mode 100644 quad/zybo_fsbl/src/ddr_init.c create mode 100644 quad/zybo_fsbl/src/diskio.h create mode 100644 quad/zybo_fsbl/src/ff.c create mode 100644 quad/zybo_fsbl/src/ff.h create mode 100644 quad/zybo_fsbl/src/ffconf.h create mode 100644 quad/zybo_fsbl/src/fsbl.h create mode 100644 quad/zybo_fsbl/src/fsbl_debug.h create mode 100644 quad/zybo_fsbl/src/fsbl_handoff.S create mode 100644 quad/zybo_fsbl/src/fsbl_hooks.c create mode 100644 quad/zybo_fsbl/src/fsbl_hooks.h create mode 100644 quad/zybo_fsbl/src/image_mover.c create mode 100644 quad/zybo_fsbl/src/image_mover.h create mode 100644 quad/zybo_fsbl/src/integer.h create mode 100644 quad/zybo_fsbl/src/librsa.a create mode 100644 quad/zybo_fsbl/src/lscript.ld create mode 100644 quad/zybo_fsbl/src/main.c create mode 100644 quad/zybo_fsbl/src/md5.c create mode 100644 quad/zybo_fsbl/src/md5.h create mode 100644 quad/zybo_fsbl/src/mmc.c create mode 100644 quad/zybo_fsbl/src/nand.c create mode 100644 quad/zybo_fsbl/src/nand.h create mode 100644 quad/zybo_fsbl/src/nor.c create mode 100644 quad/zybo_fsbl/src/nor.h create mode 100644 quad/zybo_fsbl/src/pcap.c create mode 100644 quad/zybo_fsbl/src/pcap.h create mode 100644 quad/zybo_fsbl/src/ps7_init.c create mode 100644 quad/zybo_fsbl/src/ps7_init.h create mode 100644 quad/zybo_fsbl/src/qspi.c create mode 100644 quad/zybo_fsbl/src/qspi.h create mode 100644 quad/zybo_fsbl/src/rsa.c create mode 100644 quad/zybo_fsbl/src/rsa.h create mode 100644 quad/zybo_fsbl/src/sd.c create mode 100644 quad/zybo_fsbl/src/sd.h create mode 100644 quad/zybo_fsbl/src/sd_hardware.h create mode 100644 quad/zybo_fsbl_bsp/.cproject create mode 100644 quad/zybo_fsbl_bsp/.project create mode 100644 quad/zybo_fsbl_bsp/.sdkproject create mode 100644 quad/zybo_fsbl_bsp/Makefile create mode 100644 quad/zybo_fsbl_bsp/libgen.log create mode 100644 quad/zybo_fsbl_bsp/libgen.options create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/_profile_timer_hw.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/bspconfig.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/mblaze_nt_types.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/profile.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/sleep.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/smc.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/vectors.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xadcps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xadcps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xbasic_types.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xcpu_cortexa9.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdebug.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdevcfg.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdevcfg_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdmaps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdmaps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_bd.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_bdring.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_none.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_standalone.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_vxworks.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpio.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpio_l.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpiops.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpiops_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xiicps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xiicps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_assert.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache_l.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache_vxworks.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_errata.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_exception.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_hal.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_io.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_macroback.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_misc_psreset_api.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_mmu.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_printf.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testcache.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testio.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testmem.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_types.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xl2cc.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xl2cc_counter.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xparameters.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xparameters_ps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpm_counter.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpseudo_asm.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xqspips.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xqspips_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscugic.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscugic_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscutimer.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscutimer_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscuwdt.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscuwdt_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xstatus.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtime_l.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr_i.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr_l.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xuartps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xuartps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps_endpoint.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps_hw.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xutil.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xversion.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/lib/libxil.a create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xbasic_types.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xbasic_types.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xdebug.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_linux.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_none.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_standalone.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_vxworks.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xparameters.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xstatus.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xutil.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xutil_memtest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xversion.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xversion.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v1_01_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v1_01_a/src/xcpu_cortexa9.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bd.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bdring.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bdring.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_control.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_extra.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_i.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_l.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_master.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_options.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_slave.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_options.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_exit.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_exit.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_open.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_open.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_sbrk.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_sbrk.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/abort.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/abort.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/asm_vectors.S create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/asm_vectors.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/boot.S create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/boot.o create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/bspconfig.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/changelog.txt create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/close.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/close.o create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/config.make create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/cpu_init.S create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/cpu_init.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/errno.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/errno.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fcntl.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fcntl.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fstat.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fstat.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/getpid.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/getpid.o create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/inbyte.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/inbyte.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/isatty.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/isatty.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/kill.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/kill.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/lseek.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/lseek.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/open.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/open.o create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/outbyte.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/outbyte.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/print.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/print.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_clean.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_init.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_timer_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_timer_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/dummy.S create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/mblaze_nt_types.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_cg.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_config.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_hist.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_arm.S create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_mb.S create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_ppc.S create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/putnum.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/putnum.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/read.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/read.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sbrk.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sbrk.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.o create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/translation_table.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/translation_table.s create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/uart.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/uart.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/unlink.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/unlink.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/usleep.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/usleep.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/write.c create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/write.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil-crt0.S create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil-crt0.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache_l.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache_vxworks.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_errata.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_hal.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_macroback.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_types.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xparameters_ps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpseudo_asm.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpseudo_asm_gcc.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xreg_cortexa9.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xstatus.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.o create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_i.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_l.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_l.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_options.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_stats.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_options.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_endpoint.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_endpoint.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_hw.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_sinit.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/Makefile create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps.h create mode 100644 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_g.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_hw.h create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_intr.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_selftest.c create mode 100755 quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_sinit.c create mode 100644 quad/zybo_fsbl_bsp/system.mss diff --git a/quad/sw/.gitignore b/quad/sw/.gitignore new file mode 100644 index 000000000..97d34666e --- /dev/null +++ b/quad/sw/.gitignore @@ -0,0 +1,5 @@ +SDK.log +test.log +.metadata/ +system_bsp/ + diff --git a/quad/sw/SDK.log b/quad/sw/SDK.log deleted file mode 100644 index e69de29bb..000000000 diff --git a/quad/sw/comm_dev/Debug/comm_dev.elf b/quad/sw/comm_dev/Debug/comm_dev.elf deleted file mode 100755 index 4df52521f1166a0acb7c9ca5a658baab7cf7dd21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628910 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�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 H+fDut>OPL< diff --git a/quad/sw/comm_dev/Debug/comm_dev.elf.size b/quad/sw/comm_dev/Debug/comm_dev.elf.size deleted file mode 100644 index aab0779e1..000000000 --- a/quad/sw/comm_dev/Debug/comm_dev.elf.size +++ /dev/null @@ -1,2 +0,0 @@ - text data bss dec hex filename - 166044 68080 119152840 119386964 71db354 comm_dev.elf diff --git a/quad/sw/comm_dev/Debug/makefile b/quad/sw/comm_dev/Debug/makefile deleted file mode 100644 index bf8e8e207..000000000 --- a/quad/sw/comm_dev/Debug/makefile +++ /dev/null @@ -1,58 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - --include ../makefile.init - -RM := rm -rf - -# All of the sources participating in the build are defined here --include sources.mk --include src/subdir.mk --include subdir.mk --include objects.mk - -ifneq ($(MAKECMDGOALS),clean) -ifneq ($(strip $(C_DEPS)),) --include $(C_DEPS) -endif -ifneq ($(strip $(S_UPPER_DEPS)),) --include $(S_UPPER_DEPS) -endif -endif - --include ../makefile.defs - -# Add inputs and outputs from these tool invocations to the build variables -ELFSIZE += \ -comm_dev.elf.size \ - - -# All Target -all: comm_dev.elf secondary-outputs - -# Tool invocations -comm_dev.elf: $(OBJS) ../src/lscript.ld $(USER_OBJS) - @echo 'Building target: $@' - @echo 'Invoking: ARM gcc linker' - arm-xilinx-eabi-gcc -Wl,-T -Wl,../src/lscript.ld -L../../system_bsp/ps7_cortexa9_0/lib -o "comm_dev.elf" $(OBJS) $(USER_OBJS) $(LIBS) - @echo 'Finished building target: $@' - @echo ' ' - -comm_dev.elf.size: comm_dev.elf - @echo 'Invoking: ARM Print Size' - arm-xilinx-eabi-size comm_dev.elf |tee "comm_dev.elf.size" - @echo 'Finished building: $@' - @echo ' ' - -# Other Targets -clean: - -$(RM) $(OBJS)$(C_DEPS)$(EXECUTABLES)$(ELFSIZE)$(S_UPPER_DEPS) comm_dev.elf - -@echo ' ' - -secondary-outputs: $(ELFSIZE) - -.PHONY: all clean dependents -.SECONDARY: - --include ../makefile.targets diff --git a/quad/sw/comm_dev/Debug/objects.mk b/quad/sw/comm_dev/Debug/objects.mk deleted file mode 100644 index 24a8ef289..000000000 --- a/quad/sw/comm_dev/Debug/objects.mk +++ /dev/null @@ -1,8 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -USER_OBJS := - -LIBS := -lm -Wl,--start-group,-lxil,-lgcc,-lc,--end-group - diff --git a/quad/sw/comm_dev/Debug/sources.mk b/quad/sw/comm_dev/Debug/sources.mk deleted file mode 100644 index a7c54c38a..000000000 --- a/quad/sw/comm_dev/Debug/sources.mk +++ /dev/null @@ -1,20 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -O_SRCS := -C_SRCS := -LD_SRCS := -S_UPPER_SRCS := -S_SRCS := -OBJ_SRCS := -OBJS := -C_DEPS := -EXECUTABLES := -ELFSIZE := -S_UPPER_DEPS := - -# Every subdirectory with source files must be described here -SUBDIRS := \ -src \ - diff --git a/quad/sw/comm_dev/Debug/src/PID.d b/quad/sw/comm_dev/Debug/src/PID.d deleted file mode 100644 index 17a0d3982..000000000 --- a/quad/sw/comm_dev/Debug/src/PID.d +++ /dev/null @@ -1,5 +0,0 @@ -src/PID.d: ../src/PID.c ../src/PID.h ../src/type_def.h - -../src/PID.h: - -../src/type_def.h: diff --git a/quad/sw/comm_dev/Debug/src/PID.o b/quad/sw/comm_dev/Debug/src/PID.o deleted file mode 100644 index d163d1b3076c261cfeb5640470fc973689033c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35424 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 PF2+BZM~^Y<qzwNrOf0g= diff --git a/quad/sw/comm_dev/Debug/src/actuator_command_processing.d b/quad/sw/comm_dev/Debug/src/actuator_command_processing.d deleted file mode 100644 index 06851086c..000000000 --- a/quad/sw/comm_dev/Debug/src/actuator_command_processing.d +++ /dev/null @@ -1,105 +0,0 @@ -src/actuator_command_processing.d: ../src/actuator_command_processing.c \ - ../src/actuator_command_processing.h ../src/log_data.h ../src/PID.h \ - ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h \ - ../src/control_algorithm.h ../src/sensor_processing.h ../src/sensor.h \ - ../src/user_input.h ../src/util.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../src/controllers.h ../src/quadposition.h ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h \ - ../src/packet_processing.h ../src/conversion.h - -../src/actuator_command_processing.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/control_algorithm.h: - -../src/sensor_processing.h: - -../src/sensor.h: - -../src/user_input.h: - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../src/controllers.h: - -../src/quadposition.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: - -../src/packet_processing.h: - -../src/conversion.h: diff --git a/quad/sw/comm_dev/Debug/src/actuator_command_processing.o b/quad/sw/comm_dev/Debug/src/actuator_command_processing.o deleted file mode 100644 index d74f2d34ca57cdb3a3d7af422c275208b105837b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130316 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 WuT)NNSE+o0+$u4Z)7QJHpZ^PT{HI(1 diff --git a/quad/sw/comm_dev/Debug/src/circ_buffer.d b/quad/sw/comm_dev/Debug/src/circ_buffer.d deleted file mode 100644 index 52a6a5bc9..000000000 --- a/quad/sw/comm_dev/Debug/src/circ_buffer.d +++ /dev/null @@ -1,3 +0,0 @@ -src/circ_buffer.d: ../src/circ_buffer.c ../src/circ_buffer.h - -../src/circ_buffer.h: diff --git a/quad/sw/comm_dev/Debug/src/circ_buffer.o b/quad/sw/comm_dev/Debug/src/circ_buffer.o deleted file mode 100644 index 1ff124ee2498055d449bc5bf030c6a8b5fdb71eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31656 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 L!+SJ*jfVd(yKk2k diff --git a/quad/sw/comm_dev/Debug/src/commands.d b/quad/sw/comm_dev/Debug/src/commands.d deleted file mode 100644 index 8a58884fb..000000000 --- a/quad/sw/comm_dev/Debug/src/commands.d +++ /dev/null @@ -1,96 +0,0 @@ -src/commands.d: ../src/commands.c ../src/communication.h \ - ../src/commands.h ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/new_comm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/mio7_led.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/timer.h \ - ../src/log_data.h ../src/PID.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtime_l.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h \ - ../src/packet_processing.h - -../src/communication.h: - -../src/commands.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/new_comm.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/mio7_led.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/timer.h: - -../src/log_data.h: - -../src/PID.h: - -../../system_bsp/ps7_cortexa9_0/include/xtime_l.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h: - -../src/packet_processing.h: diff --git a/quad/sw/comm_dev/Debug/src/commands.o b/quad/sw/comm_dev/Debug/src/commands.o deleted file mode 100644 index 63ba9b4b21830f7ef7e9e5957874cd1170401182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214364 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 Q&`zf~pE$J3DIQAvf7GjQo&W#< diff --git a/quad/sw/comm_dev/Debug/src/communication.d b/quad/sw/comm_dev/Debug/src/communication.d deleted file mode 100644 index 05440bd60..000000000 --- a/quad/sw/comm_dev/Debug/src/communication.d +++ /dev/null @@ -1,60 +0,0 @@ -src/communication.d: ../src/communication.c ../src/communication.h \ - ../src/commands.h ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h - -../src/communication.h: - -../src/commands.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: diff --git a/quad/sw/comm_dev/Debug/src/communication.o b/quad/sw/comm_dev/Debug/src/communication.o deleted file mode 100644 index ae1c9825ae549c3f3e1ed18985ea16a729be9125..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115952 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 B{Qdv{ diff --git a/quad/sw/comm_dev/Debug/src/control_algorithm.d b/quad/sw/comm_dev/Debug/src/control_algorithm.d deleted file mode 100644 index f2d73ef75..000000000 --- a/quad/sw/comm_dev/Debug/src/control_algorithm.d +++ /dev/null @@ -1,107 +0,0 @@ -src/control_algorithm.d: ../src/control_algorithm.c \ - ../src/control_algorithm.h ../src/log_data.h ../src/PID.h \ - ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h \ - ../src/sensor_processing.h ../src/sensor.h ../src/user_input.h \ - ../src/util.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../src/controllers.h ../src/quadposition.h ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h \ - ../src/packet_processing.h ../src/conversion.h ../src/communication.h \ - ../src/commands.h - -../src/control_algorithm.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/sensor_processing.h: - -../src/sensor.h: - -../src/user_input.h: - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../src/controllers.h: - -../src/quadposition.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: - -../src/packet_processing.h: - -../src/conversion.h: - -../src/communication.h: - -../src/commands.h: diff --git a/quad/sw/comm_dev/Debug/src/control_algorithm.o b/quad/sw/comm_dev/Debug/src/control_algorithm.o deleted file mode 100644 index 31be2e31395f34d8c3ee1a357647da709464cba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136756 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 G<bMNXDMx4k diff --git a/quad/sw/comm_dev/Debug/src/controllers.d b/quad/sw/comm_dev/Debug/src/controllers.d deleted file mode 100644 index 46b5605ee..000000000 --- a/quad/sw/comm_dev/Debug/src/controllers.d +++ /dev/null @@ -1,87 +0,0 @@ -src/controllers.d: ../src/controllers.c ../src/controllers.h \ - ../src/util.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h ../src/PID.h \ - ../src/type_def.h ../src/log_data.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/quadposition.h \ - ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h - -../src/controllers.h: - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../src/PID.h: - -../src/type_def.h: - -../src/log_data.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/quadposition.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: diff --git a/quad/sw/comm_dev/Debug/src/controllers.o b/quad/sw/comm_dev/Debug/src/controllers.o deleted file mode 100644 index 4495548808e028b2534e97a478f9737006dc0a1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122744 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 T8AQbVtWY*T8I*0lp!|OTp0uV+ diff --git a/quad/sw/comm_dev/Debug/src/conversion.d b/quad/sw/comm_dev/Debug/src/conversion.d deleted file mode 100644 index 384a99d90..000000000 --- a/quad/sw/comm_dev/Debug/src/conversion.d +++ /dev/null @@ -1,3 +0,0 @@ -src/conversion.d: ../src/conversion.c ../src/conversion.h - -../src/conversion.h: diff --git a/quad/sw/comm_dev/Debug/src/conversion.o b/quad/sw/comm_dev/Debug/src/conversion.o deleted file mode 100644 index 995e69ebcb7e5a2a821f3692ba585a25176d2044..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17216 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 BY~26= diff --git a/quad/sw/comm_dev/Debug/src/iic_mpu9150_utils.d b/quad/sw/comm_dev/Debug/src/iic_mpu9150_utils.d deleted file mode 100644 index ce69f34f3..000000000 --- a/quad/sw/comm_dev/Debug/src/iic_mpu9150_utils.d +++ /dev/null @@ -1,51 +0,0 @@ -src/iic_mpu9150_utils.d: ../src/iic_mpu9150_utils.c \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h ../src/type_def.h - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/type_def.h: diff --git a/quad/sw/comm_dev/Debug/src/iic_mpu9150_utils.o b/quad/sw/comm_dev/Debug/src/iic_mpu9150_utils.o deleted file mode 100644 index 3fb0f042257fb943dcd30861474a2ad0bf0850ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104752 zcmc$H2YeLO{_mdI-4N*@3JU6o3W-v7(?d}<$tGDzV|N3=HiR?+A&DsvK&;nZ0Y$L_ zO0$9}76cLOU9n)Nh+QmKuUEZS-}igY%<OCc?|tv{fA8g9f4`ZtGiOfu{eI`y&f&aZ zQN9quW&H_Pk}G!Sa^00G@4RX9fh5-ju5;z@e%$kyR1>G0IMc-0CLV3#u_ivn!~qlM znmB0U0uzT!Jl@2`CN4Gc1QSP0TyEk?CZ25K(@lJ)i47B1nz+iuH72ezalMIWn0Tg% zn@oJRiCazF4lMr)hkxl=d-d+b*Nb<LKV|72S61nsL|?bPiN1k**ZQ{a5}EGZE>~oa z+vVzt=l8f=<M#aV=bv9ExLjX3@8$FQ_FW2Z+vRdCmCw2KrMp}{yyqLY$E9DiH+H=! zcI{iV*MtA8`n29lce(K%zti2-ZEtt9g>CS3YJ<zSb5CNYc35>xKWgcogx;#HF5gnL zf9WpI>*II3F5C2l%j|O&`aA>eJioVU>t${s+srbzS#~6@6U^&@xE^3$55jeC^EwmP zXtR9RdA&3tagQ*^i*4Yz_CkBJeB*bsJ?tOKcL`T3`*x(&c2%zW_FFGiFUM8*F4}F) z&7l~NZ~pxA{e$(5eHdr9$=T=L=riX;;JZEa@q2sv#_yemwr%i@-_^r+I_8~ar|<0o z%=>nH$Ln(4%xkNC7#rF4Zs-fk`{Eh!))n2&dJ^^VyEphw2Ms8C;e2Yk>PP1}7=ZTl z#vHRf1N3ft`#9Ru2X(VO#B2w~=w@D9^;+#<*?-dpVYb29w%)x5?j4{H+{-cV+&1z= zSBzsXa~ykj(c~O=H|LM@4>~o=PT%WATf3nx3BX-}Ifh=~^L@FyuN&26-{%AWxzE+@ zAN!ULtlT%a+b7>H?e^3@*T7%)E$i02&*qD6+rCXW$UBGq#XDUN@=oGkykqzGdmVhu zzbWG^-r&3pz`WS)8o2#iSGPa+O&R#pzTUt6un!L($uZ;jh)&}}n(U3fW4^uumb6a( zu*SbP+Dd-@<<CF6TECOu63nseh2Pz2OLw*Ee}2Yi-M$NVS@da@lSWzoDCm}BZk2a8 z%O6MiKR|=_xLY!)+jfk5<-VQse%UtwJax$2ZQuU$zj&@Ip8M^;c&;0sv&R*3M!RzO zx7{IMlQ5n>jAs(Y1N<jtp$Gi@SJ!LxZM!r)!*?hzMq`Y6nq!pY=<`ss&zsTbA&&AB z%<{GV@w<+9lpkl7KZx=_9DTafq?Jnte)278l4In<7`f4>@BOi{oNqpNUZ>|gc<x8X zbFJocvpYTK#dE6O?caWW#Ut_?p1F%;nP=|yZ->quD$Bgnx63jw%2v&--8XdZ?0uhi zMVq=!_=dFS>lXM%@AiD$z18L}<~LZM^$oZA4fp@RH|pm8AlsOL@92)PJ;of{hcLEB zJIaqT%Qv8WkfVH{S^g->e{zi7FmvpNaqI?8*{AN$w&%o!@BYK_yly_Po6l3e?CchM zUf}tEI-c)mKHtxLet^7>J+I+;Yi;TN`uN@2m7Bhi>xh&SYsUfYEWP?hsz>MF*mxoF zmSw>Wr_{<n-#BC3TZ0QeS-|pfyXLk@oOth5^7*k{R}tgy`zLeD$_;;qUf-&>*0kwu zO?oIL*Vm(~D^}jv)aLwc#E3{uTU&i&o!;0q8xP_y7!H?)^`!d7`Zm6uJW3DYvc9sR zelDMrH9DSaZL4f)D=sU~_NVjNnwFNP7QLyes=cMATAw|wzM)31Ge1!fDAubh+bVn5 z->9$hO=_uct4Y>J>A97SY}{<#v*|50b@i=nH7$B&b#+TkYwIxG*KtC}D7~q@O>e5z zr#7`WR=1+bR(nxbxTdliZ7^$U!QFpdi_7&H7G{kdb9uzmJ)qxK<w3zsmL;wZXhznb z=IK%l3Geo3BB5j+UJ{9EP=Gbfdj|xurgiycF6!`j>l@o#TB3LOTPRHI5_uNL<2~vI zqAuTbNc7|FKqB$}<v@v^4G*)>Ga6bn?pEFAa(Rz|CZJ8DI_-V`E?iEhhV0#b3@&Gk z<K^kRY@j}x(4Ly&(#}U6xb$bZv<vQ#msu|D!s~I><@Q(6=zB#8uD!>$qly3e1(%7Q ze*+#Odg4o6eYotp1;Ev<yGMv1%DU(G$D^8f35D8muI~Hp#;sfMA?-L%_W%aK<1ud& zU0uqy<K8Q4>o&~OUF>ERzdVD&9<n-C@jg1?>1n>xz58te-1ahWdv|{mO0}ntd{H~D zU-#g<xb17+4(Pso3T_XTozRXO)V&3ozNepgt9Rd0h}*-(H?ncZcW>B)+x~*R(vC|) zSKq-^m!pTHbby$Emi6#?PhWva?>Tu424%`6@<CV6Q&!@xQr&rac3X(Msp>AV=h!cB zSEuf}_ta3gcbdBE-IL?ztyg#bdOo)TcQe%8fS%WWh`R=LH>hXN4{+C_?)07l_J+4j z-5uX^D6AfDyShv2Ih=R1)ZH+bH*^SY=l+DY_Yyl!1(hDj`Q+bE3c18r=uq$9pT%!S z@lspR*1P^(+zs1_C$t647za{DFLCDKC>_K1`R?nea~QBla=To8>RlqjU-)+3bd*Lp zPTGPzS6^{8Yn#gFzrcSLeCJTna39b#!IBO<`8Sqchno7m4j`s+<h2D&{XW<jyKC&- z4+fl=E=g;_tUgoQYh7XnU&2>ihw+uAxH%l3hqZaAcz8DOJi+Swp?oci1=ON`Im`J2 zNljbOpguTHeQ-v<x%cxo)s<@X!TE6?JeO72AMAr0`9YVfzc_Cc-o2LJ>WyMdAcO)g zR6`f=62sYhIXFTrRNtH3dzIsER_}WqckQZ6t=1Pbbm=Kjw^$)q{TYxyiRglO3pWGm zDre#cUTO=fdj~0xR=qFp8hW3Zj=R;U8NbcyUF*1O>)qtIYr#x&*5pWjg_mW=ysjg} z@>fv9i;`{lSxUDwetHgW)TdumpDybC+i56&S$(Xr_em$l?izacIX!kay|-&R?p{$( zPV4<EWR7)L+j}O&f^}EjdjY0HyvC1d3!<*WD4j0Hjci^I*O39(ZsPD;P$Ik-d&($E zq9b2E3nl$YVP^S}b8p4<fb;N(Rib^?xn%u=ol0Dyk2s;{q21g)2lnhE`ikBOOL7v> zl;d69x}A(tNXcHfgpe>xFgo7DUGAQvx{dA@Iuzm+H;L9w7xNb{e@Wzvyg1}AF|@nD zMOUwj_uUQ^-MZlwFUz|3P?h18tgaA3=5O8jTTk;h)WY9-jS#1Fx4z8Aj!RgaBP;Hm zX17SggMDyowu!fWN4Tu_?6+L5Lu0iK?QWOzv;DkrwH+oz=unm)ek__l5@XRn_G;XV z1Ms5byGO(x8`?c|XxyVm##($zcQ#V~fh@7?&UX=Gpn080Op&Cy=CN4*@&2FqkIxeS zOI;@tQxrL$<^5Z-Y`(-h)O8{;$;bID@4r#MOZ>gMP9&zJaX!oYb7a|kiO*NpiNur= z&S!Z)K$gvyc#yhIBqqB%pXGf&SvFtd0qQ!DnEdH{miJR+*?fts)pa8AG<DsZm^|%# zZ;%`>06Egc>KS##Qgi~VBZ1o`+&vP!17A56*GF~n_IOJtQzXhCJ?`Fzc(rHGL5ZiU zcg*j{;a#`4oA>b1Tvyd24(J}-UEO()pOA-lPUvCQGQ6j^+bi2p(xZ#V-Lsds>t={| zclX}jgf)9{(WQ@i&g1UU*Q_A#j_2`1(5%n=lzYUX@@Ko;o!?JAub_MEVR5%T5BHw5 z7weqI-K)R1`(p*Dv0qoKu08|Yy^e@`yzi0TUgH|@P+!fg?@*8TVc{!8(Izp_EZZyw znO9E=w|TWi9OWH*#!fs}aI|;aVdc089plc{&7Vgft1dk5QwMvsYp3Gp#N*804mn<4 zxO<viRd>}Vcs%Z|*6?*3V7{-A6T16(y@$Ls!k!Her`#(p0Y!Mlz(s_od`|cT2HGop z{Rw}2pYYl$!V``syl^IA_qPapZYCV}BH;`76D}P<xDuklE4~~<I2|g7S9s84uQ>8C z!gpUMyeEtBhWUg$jv^eHL0EP-q01n=JV=-cp7V-Pw-MIMdO8;Kx{v%y+sV9sN!GJo zKC^K*OG3929)AR3rEF(M39koWj?nTq2oF1&a5u=<E2gCo9s&X66=P=*UMKq%{DRkG z#uA>ii?9%jiC1)amGEz}&2KK?_4iQ7y<*E2!dqqg2cN*}>*Yvtu|yx6317#;?G?-A zh<!DU*JrFDyy;CstTTXboJIH`7H+RtvYzn62w_CF>g@@<K2g>)_b^_+qRQcm_KM-q ze*xv34wK_E@*b8<SVH*JxrEoRBy0!~E{2+dnO#R%A)i0(d0w|XOgQ;C!Y_LgzV{5_ z&r!n1I^?yS$Jgb%Sx2$tJ2{dg<@n6UqU{ycat5EA!t243em;>i`}jzf>|98wK?U@R z56&P=znU=XXu>Y?tuy8GZ?0g;4et^DOU~nAl0L`fvm}s7I9$Tf^7*3SEa@ZZcCeS% z9rqG`Kb^2aj@VM!+T$e+yzvps*T|mkgBIfzMI#7bJ%Mnh?9us<5?)a*zvAo4>o+Bx zuZO<j6&sTY6D1c^RP*|>8wmT$I`{10^*1XBvn72_khT3T%SSxM@?^;!Ck)~Bz>^5K zO781k!0UON32(fLaEk2vqPuvVC&wf*i`T!;Av`=tSp5cJcUfCd&h-k}uVs?PHeShJ zw?0F7s-&?a<-0*iId2}y^3p>H*GW2$%6E^+W=Z-^!i{eeCdm<)Jy@2=HcXK-a=aYj zKP6lzTlj8YJ`=c>@Z>dw4^1Q-DW4CP^7;cgZq<-|;QBp;NwtKp%dxuTZeI64oA71H zr~V{f&ss{jT#nTs7y({!j-pIS!(TnelEcyn#d5;0Um|=?&f^aG?v8;hxk0w)#Fe~0 zO!j@%7GA$KnQ)mLtNyp}daF)2MN-HSmAuZGOSo?_;XC&d?$rnvHW1#_NH}x~;VSw3 zXRq-3IyvJ%%K81n#gf%-!lzCnTyj0(o1+Q;kYj7eHhkU0k^;#E7s<Cy9mkTfd4%<| z32&3VYkQa1#zw*h+49o<@>fY+qvYKEy*EqduOR$J_DDa5*KP9&9~ne=LNZ~ptl=0b z|L>M<p5MmuL`mUS$~Lcih$V|YAsiMYELuhQ%ml)<as<{a;PuV&>-R}Mnmm*xuiZqr zuAXqctZndiUJrVfaCkSuOCBUFlV2&96n>U`rn{uZuRfK(N{ZSoTR2_LW4U~H)d~DH zRer1L8eSWcenv|=nJlTaR|U)8lcW914ZQwY@?GYMydJimaF!gywQ{b<m9XRyNl_2o z%4@f*xv%W+f@LhplXB*yD|mgItpDmGd0j4P<FZs<|0!#@_bz!YM`^$&UiT4%>jn@$ zC42qFqrBFu2``oH`FJ<4XB|h_A-`M0{<<n|BD`}6;q)-!(Wqap{fSHXT+dJ%;9<+y z{{g>}Ka(yv6fh-&bCz-GDS+9vY|WTgW}9z5Dw5BI#j{yxTTs4L<Z?LQ5&ikC_r)tD z=v`vgedg2syODB6^d}s7ejT9igsp&SS){J?S2_SQ1}_E7?8Ujr`XL=Kdk9B<)UvUF zqhH7X%vnoX%H7ljFwa;A7(AVPTJST+p>Q9^GxRj+bNse90ZYCmA5Czvo*C0$20VAi z;bxnT$!AZGT`<YK-zXNIgMueS*-oHMVmAiKyIDL-E_+h^aV*dlQS}1QQ{oGLVyoyz ziLg!Vrr>{CY$^kKMm)v_Ju7~=9OyYQi`{u%jNxxDh$+*7UKACirPoAXA4c$NaXxBE zSmOSuO*JH8a6=FLJoLP&X2TNJ-HrRczmRMPt!V}vB60zJ8yW$}Y)1#YB_nzQ)=Vu% zRjuRDRyn<zMz-xXs~oU<3)#6xhy>7c#}>d|7o85+y9dd&&-Hx(`|h3xcxdTNz<xRh z@UYxd0T1_MWMqvWX}9Cmgip0eRdJ2>_P&F&+V2Wh7F;<PaHY85d7wwMOCAS$R4ds9 z^qBS`D9HP`w)kwIjoQ!Th9|TVlI|w0FPr;<cH~f?7qvggi7#o7Yy(>4Z6Kem^44qs z+Ts14L%ukn@=Tx`6V8tU-IQ?8yFg14=CYQX6V93jbW6hJ4+GtrP<uSk?FmJsqB{~= zIf_dY-Xqs8OStGtpydhk$pv>NoL>WUSHiNhfL0`gNjfVN%AWvQl`wDt(CUN@?*Oey zh_(XVozU}kpnDSTI2!2Qgv|!feF=Rqo8J2qj(82|frOv<g|!LaMu65O2#(8x35yN` zTA$F1B>GUo**kz9PI#dfXj8%<PVF-Z84m%yoA3ue^kKpv41t`5{?mt{V9a84Tiz!n za3+(NJPCNx%U1yozkxJ#rAQhDbd}i7*}YmkcrVa3VkepOT5&AVb>i};ffk7FobH8U zA8JlmCN3WWq)5|ynf5;C_Hr$SHD964IT7ee?Uy@%uF@LG7*}gIvzBYL*(9B7wF@5u zx=tHT!dsxN9tpHi>q_2Tq)pEPx?c0L@CNM|KC)QrkI727Q=41?v_q>$I}@&PuOO{1 zat~jFJH;Q~+udJcU=?xK9fzNL^h*Hjx%^JRUYA@A*n7k*^NF%g$#s)fP^MNq$^n@& zn9{WV1@dO&JCrN0ie^&cYoca2(7R$d`|*LOxF6^vQS}ATXX0tn$roY>TmGd;9S`)C zIC~t>*CLpM*8L=2c?0NYarnz9{7rcF0{tm=;L8agySI+9n*0Up>+yF!bl8pgX6Y%t z=i+``BIhWuc?4k2+fxAZp4<Z%?9Q>w|A}l<kn|j2;q7FoQ1t_Vr`~!L;P@*zc}1t5 z3|M^KA%GL=`T|B<Jb-l<zYjR=hAn{gBj*D)>*oSqA{saXSBbOu{e|K_e(ol5F^BaQ z5k4H~c2SoMbeGu2>Q;%!bwGEEFlTauxQxAgL<}VbJSuQQ3Au<}d`eVo1==b`kaAuW z^Evo0c#b52zT}zy6wo)GQB6RXdk20Aw8Z-<r(u;h%%0riJ?j*pd%am+p!>Z4;P>wL z_Fxazc~dar-Uq!Gv*+u*AASt<gm-=ypiSOuKsnxR-qR?@p7j=O271-|{V_nVdEbYu zk(A>v=P-`CpcmlDIa2|1zT$`S6Sf1MdZz}sO#I_kpp{|^DPfhk_E4bJf*v978u7(5 zKzEBTIDYqu%uj&UiscJ|9ufu%9}z?N<m1912R|zY`G8&$n;L-L73-G+eIWjs2K2EA zodNWTn6(IKkNDwCpwGmLH9%jA{vQH;BcAIA^qp9{7U=Kde9r0$?XtIke%5C2>%X`& z$WOn!yVL_M_WV8==tj>U89+CAQU(Dn@eJhb-R!BRh`Ghnos4sbXG}MsWuD*Jz~!EM zNm_S$-Xm?@<!NVSD?C@Q>Xn|RJAhVsZXO1-+B4xwpf#R5R{`Dad6;7I9?u$z^Lsrv zky`HaEanK_@7cE%=mF0^Qi0Zb>M7ONc?J{#J?PoSSzqtD|8<~;Jj>XXhdtwu2ioBI zpb%)Q$Fm-2n<t%Lc+PV;Uw_^+C<zDzRRi>*=X4N;oY`@M`lFy^9XnHc21z3P5{W;u zdNpA5p3eZw-@ONL;tewaCp}IYs2DW>aI%+FaoTO1=+oCt20SBd0G^pP2k@-r>i~^w zMgvaixCXHD=MKQBpOUnzR^|a#XH)~$+!Y0^-4Fq+yNP2xZS|>u^>=m$oc{0=fHOY0 z4X`2M48WO}kWw1w6#zCJ$BAy<G7a$T^Ej9-P1ggqE}sF|R?A^(|8OVZte#x#=Dd&t zIQLk#>Tlv0GVsOXV$$*@V&W@6my0(S16?7!Hv?TMc9NQ}5+{BDbhWtnRiNv{N_J;~ z*u_>Z6kpB<S|qL`9o{Hhw*%cQ(%ONRi)%P6cZxR7=v`uGE6@sYTnW%hQJ)C3N?gM+ zUM>1916m_4Cmr4`TG-Kh#JonJd&R3mfbJ7pNL}}fTgku=h%-(ES}SV!y>;T#Q9uuh z{_N^{@kJHTL*lD<fF2fpPWlFs&H;NwB=Ge|#oKJ)W8zlM`Qu^~scWMs;s`z=DmmDj z#D(nNX7SNbpeM!EByotVjX+O{jMIR&ik+0f+r)-rfSwlR?Cmomm$de*=)-Y&PP|Pz zd|tf734cKxaTL&tqL8hANqq1a(97bjG@w_+(Q|=b6#-7#YvRMJfZi0}@xAThl;?ro z5_2kn-WDgl0rZY2{0Qh>@h=T%hq$T^=sh7;0=+L5tOEK#WU}fH#mZ!$kHmRw?#H5) zP5MNvy&Pz#=*8*ZCGH~)?G`Jy1MLx$*s@Q>;3YtN#iQi;&%}Alfj$@O$PZtLk52*m zQoP2w{Yq@*Ab&0TayGva`|^Rl6^D~-_KCme0(~c%t_1pCT<-?@L9AkPe-s}d0rYn< z?@^$i#Eua_KZ}K2Oa37)<AD4kcHar~Px0>4K);ID%7A_oZ*anY7ul<U{v}Q<2Ku*n zE)nPtG5#c=KgFhpfzH=nV&gB+(!)R(YQ@umF4BJA1oSuUwy8iDYkBPLCEEFH*`->5 zqkEY)?@XY}wT$P0uF!5}r?1qO9}jeucJ7TpS8L~StgqANybZKKE4>Y9p?1P>pha3e zY3X|HT6S!SHj-R?vxX`mO0}DZ0NtwH!4bSoE8wi$u6;^&ze5|x7nW-4+JTm77qQOe z+NJ?OcWU!>pu4n%_W`ZY9_EuPwSF^zR%ufw0<G4*KMH7#_AgG=-P#5&G52T>a~|&1 znhJsL*CrMKt<zE-2YOI@gFLog3myjakT(BWpog_#2|yb(-v*#ZwDYM;JgQ}})sJbz z&<QByuRIC#gr@Pc&uUxl0(wrn=S_6bgUdc&;>z3iB=T|pKiG;RKP86`JoR(HLAP>d zk9yMwc-)Df0v<nr>~+GO<$yz8dI9hx!7(23^m~9KKVctzEn5Kn?{alX$!4>&27LsW z-K!aJ)bE_c(bG}^$1J-EF!!2mfO$#701GP)1q@ZPU&S3`0ZXnT4~A!RWF!3>04F{5 z31G!p*8!g4c^dG{$0$tC+B*TzcxDjbl#9qTm5+n~r~a@WuxiB|!0Pk&0M=|GvD6=# z0yzEoMSzWaNPSH=vq!CO^2xSj1F++K64{)VX8`9Pxf}4@9oqpf6dxr4T_o=2JYFi^ z$^g1dj9`DR5{EPaT`h`^1X>_|XVamEu{Vpv!WBT*i*=;v8^qz0fEJ52M*!U@LOp?Q z66cc$mx%2r0^Kaiy8_)Vp3s2q5N~b*S}ML`Q<jOz*+9!h14;Q#aoR^fcZrY5WGh4i z+p<zjrF>c?&L?TzBmR9V(7j^A)j(^-bPne_@eQTb!(vn|&<2sp*?3&savab`k$)`E zlj8PsfVPO~hXXw=N|pjWBmAV47sSzhfnF5eOrTfANzVd7EV7pEV(t{6x5Ow?-wsh% z0rZ|2N9y@Ve7XzhV=?a`pxxprlG+{->;U>)^c)C;P~B-j`^29^fPN4^a+H1)zuXD* zckw-`=~pq7#P*w5PXYS7IF00Xf%bfNpucIoNK6-NH*=~k(Ylb+uh4#F<FC~At^>MC zJLhPih1yDXY>~F-VW8`^#KAx}Y9pgSH);BEpe0)2%RqN%t4U<bwRc_vx>H+nF3?@t zN$&%#(4uVhN^KI`xk|h53!v57No>R#Er%p}w|35IpnJ4k&jYQ~_Ra))P<!lSp!M2L z&dNhtO%>3?+9=ZE2JIO3_7UyeJfKH4&zV4vX`gZ+AJ<ML3vbaDtp(bqRki^=tvxS* zp3#0`oiAw{PX~HgEA9vMiuO@G&~{C*5$|YUJ_z)#ww83ZLpz0p@}9QvZJ<xI_c@z8 zwJ#R{?b2@f5NNlivt?gsmn;GLTHDCBe4|a}-M3n<8)%>Q=Y2rmX~(4k{j7aj1oRIr z?QEc5v{PRN`lmLEBIH-?s!E_s-D6(@y272H16}D}L}7B3`!<gC)$aA{ffl(><aAu` zKJ*lz8{7?N0WEg7Z~|_1cbN`!hkFp;Tk6*N-ZFRED4<pD9VFV-?qAsWHSU|p^AEUB z{SxRw_rtdXt#>EZ0X^j2#*uj3-G$S?(Or2t&=c;hZ2VStIY0D_yMf&CtoxCTK+m~L zP5^q|y|@tQ1@}M-q*vT)mjS)%K9fT5HTNb?@$2p@?*MwkJ(DE-u6t1v&<^(|FVK7L zT5|FG?*0pbK5)CA0{Yl}Y%9<w?x$7(?R0Oy6=;`x*9Snm-J7}sec`@<lk>Iv*AUP* z?soFux9%(W+uz-#5ul&k7lna-cAwfE=y&(@yMg|2AH{k9(|utw(D|N=Nv4;0E@vYy z^_)#2y3F%1n|qDt7D}Q8p3&z5-RL>-ewSJ<(hn^`K~5!SH@{p1EIHyuz|#9y0+uy% z5+nWR0Y)$2C`{f&COz#(_T`KVUjaO`e=*=1@#8H(8^m>4Krf09#{qpV{JnuL&>lP) zXpy$^E%U2myRya-@3DZT?N6GeqaSF%eZg}nfQ54p0j#UL8Snyem>=jS@yPK&cZ+MT zHD5^2<)r0R9RnEr+fKmz&G!Npl=J{B9J?4W^c@N5)HB(&@s}k5mR&^R4KHBh%g0>@ zIO#*u$K*N^{OOmGEY5g89q_Cx*pw;nuxC?ulijP9JqlR!^gV!eORom3FD8>tA65_8 z@DEZ}(+<vC%axx4w$_sQ+RhpW*q+)4aNZT{#D$`GB+x}-A;14Ov2iKTCE{}u@1^3A zn}Dtsd93qVaXUw1fjFOJaJ~40O}ar$O#@mi64>=6;+-0x+r%lH#iioCqk--cO>DqQ zac(QnYSEjlbB{RsA)p6D35RK&c#oBB5R2M@9u-$}ydD=lUjW)9MzTrpqmr<<i8=W| z&x%J_+4JIUPU}nJqJcoKitk?sdP8Kr1N5#a)q&m@iJXED#7}#GJ`@8v3?GRHNLn9@ zZlsY<#Hizd_K5M%0qqq_xH5buayamxi?aKGz7WlnC0~lO`P*0GUCO8L#JMEp@5Rj1 zfqoDxUj_QR`1JvxpT+kaiC;v*E}&n<1H*uR7YjL%{}#*HvOk5!j$NP~E+;_SN=m#~ zJNa^;%eC9t+v~ImQ-Bs~^Eobyv|on;-Kf1wMp~j}?*+O=JK-~++q5Cmfo|8{+6;7u zws|MeGHpvS(4E>L9GAPaSIDEQwE~jzz1mE^aGy4E9MJvRcuI%|w6j^+TJ5K?K<l(W zt_51J9Wol|AuXG2*`Ph}2GAo~-%o)a)rNEcJ+6%*!*A9$^aa|cML0^&YZaA1FKO43 z=ibzAJP&BQHvMs+ceSEKpbxY(O88H-&18o?+B+nh&$Zhq3BJ|_ass~7Ugn4Xu1(?4 z{iJO<1n6fi@j;+}XdkZ!`c3<B5zy~i)dxWT(uzI-`nUGj0-!&%vljwg=>CCyztlZr zF3^?k!&d@b<MvGey3YM+2xyVJE8Dr){T+LIllx-6cdNVkT%bGL*;|2@xobI_cez(_ zZdbW~1M^8$cWl2?QINNWJP;gJ2$(;80ARtZye|Bv7hvd2mYh0<?H`{%3$W;eF93_X zQr47wOqMTQ&6bp%e+%G*pV^J@)=_|w=+%JH@7@EPlraym;`o~ZCwC)po)&!u@boMA z>lw3?0nZ#d2=J^bzGa94z$pt1z{)3T0jGAn4_NgZOR7J76R_slNr1IKk}2wcE(e^R zbr;}_x-S76mb?ZyGwWTz#;zX%Hnnk;Xzp<(;MptrYs=9m0=6E>I@@O43fNv)1vu;e z=K*Iw_$*+@dD{Tzy;uQw&RK&2=id?mJog4p=6OMW@qBT5GtdQMburL|;^k#P7l|`T z0~d?Nw}37Ym-Yj?OmvI~x?KFL4(JNe@&M44;?`E61!5az?LzTXHqat*G>Q9q@#svT z8^og|{2RqJ{Ou-@`ZmxKk;O5;S^P>yyG0b<33RJ?i<5PmIELeUhd>Wq5NdrnN6W-$ zwq?1vn3dfrzIhsGg;>f*R*GF=pjD#Jkw9z2;kiKfioVwa-6z&u2Xw!9G7D&}IOAHN zb>hXxfgThK5`or>c2e#~;)(>IkHvhp<rA@?KhRFGjD6oFv<{%%;(_5nd&E1Z0evdo z;C$>A$t!?96K9M9`dp-u3BM4pJ_Pio=*=nkO04IceJ%RT2Kr7MN;+hc8qg2onJCat zqNy9uZ=zp!px?#mtAPG3zC0A@5AhVI^8#%R`*)!>@Nl4uwU_q*U8=q42f9p~?E|_( zyYCF3tF#(Q<g2w?Q-Kz0e_jQ&NK4-Ybc1&IeL#z~SM~zkq#ZT_Xo+?tyK=L3HwW?- zt#J*|ZCcq;K(}kZzYBDSRx<`@srKznK+Clb3X40n-|hxltzA<Mv_{Kb3v`cm0jcLc zZ40IK1KJt)0Ik*Dmt(D+d<X6x($Y8*4{N8AmNsZiYKCn4wHMH1nsE-$<Jy`wpeMA+ zq{vO$*g-&>wGQ@Si?;1Jpr^ETyMVT8UnK)=(-w^fdR9A*^!}W7EeY&-t>pxu7qpTZ zpcl1|T7X{CB4mJ9v<8m#tJ)W&kk_<?JfJtUZ7&18sr4xZ+O9qL3eY>+Gvv`7+FFvv zds@XDpii`w1A%sGYjyzb)~22Zv`2Gs<UiANGTP_b2PC2|w1t#rUuxBN0ez?adJ@q0 z+T_tdKWahB#J_9Lb20l_TSy}MMJrkj^sAP58_-prg04VUdv<dAukkD+4PNURcQ4R& zp4I%`0#DH~Knpz^Ir2AneA|H*dt76I;9(|(+~k>bHqa8!MPMs<m>aJKy2aCPD$uQ- z-&p5up2tYLw|kzh2D-!3#RIh5v+We1J3V!$0^Q|V5dd1@8O2Vo^gOu)Xq9IuM{u>L zek9Nu&j-ta?)E(LInX_x^X><_*Hdvc(0!hHeEoh;cM{kGo>>~uTF)#4Xr1TY$ABL6 z9K*?hzj-LoL!Lz>zK1>2`P&B1Z8rct;yG+G(4(H{VxY%7pRo^5cs}AxZ}OZt4QR9H zN>b00p7KdRTRfv!=Tn{)PXlfB%<BN!=JAk-p7xx;jy>bKkc{xG=LhobbDnqEvFAPS zb68*SG`s-xqUSdD=q1m%g+Q-*dXpbs^Ss5%UiT!nf}1&DV-j8j9DmY#fJGmXqD%iF z04II^6yO<sUjjVSlL2UWHvmpqv=gxU*@=MlKXdhKo5wE9ZsR1*oyK7}x8qpAOT?ri zplifvc4Lv4F$-vkIFjF3F7%B+tHh_*nC;MRT!(^S2`3|eb}?XRG1}-o^>4=mj!)ry z6n(xGuy_b(qhwPFVCh->we0$(fR)#N1Xy*+F2L%d6@WD_4hF2vn-5sGdNbfO?0ZDJ zPopfF{yxWN#+CqJ!`p`e&b)UM;Mr5iOXs}$8Q^&zbOF3hjAersh*77TtxYVy90fhB zNPm2IGvU7sH%?3>XHCvx7tTPYH-`Am9_9y*N&Eu$`qn-!ml?euxs<fw>&A}xza%%M zzT6C$zF{0-LytnhCLd?MWy_&}?S-!Zc0}GcYm9tG(v0R&3Y3rGU^KRJ4lWYq3xIAE zllKDMEuQ}n=uvS5zwoTMi(~he*ghO+xA+lKO;SzSS7)JM!fB+A@KX-}My?A1Mw|Nq zmOqPG^-eq-jrUHvoX=D=uLqpGtpM<}>PG>q{}={XQ}hmC?P0Zmb#I>wI4#8kSl>4c zIQ`$OVaBaX0cW0dBVf}X&j6nNuU7$EeRl)S8hJC|dAmq)=ZmlJ0=htKtOL4GJVuhd zNZfZ7(AA=xGGMV-NDA95bT)B|_+u*2R&nMwpr^&g`+%Mm*I>+GJS?FMe^Dfk0(wb& zM(TQ5Oo;-$D!OyfUlZ>?0km8E%E{UzHoAd66<5vy`b9)I-j``da9A(bCOiyuo%Rd+ zzCe5A1fXTwPENpjt+)(mtM<}(pzYd=D}i=vLq7)kNqY^%D2M!I@f^wJ6_Ll5zbft# zK(C1x_?7p?M{M~AVhjiAL$P}b&_`m|0HBY>QJ`9A2y4aw?G)FZ0klgTyBTP=_<_=L zk67>+(AVN`?8i4E@g|_vS|}H2lXicC*@6M@zkz}yviZuO#T|f0J@XXc(X*ceJm$gC zfch7c0FPbqB;epbI6B9TSqC^|`|W^3*KuS|EbR+;QbIN0@XbR2M<gEt=-bN<`tLs* zFwM6EFny;NFyn|+z{~)D&6-Yv%>JJBj2_Q#jk%CDkKObk;K>VL20Uffr-0*rCCnK@ zBFSwY1eo_2M<@6wi7J02MM=T*Ou$ngs{kDT@)dwZ|2!J7_|sK@CGT;aD1DMomW|=` zPZ-a+2~RBnjGo2zl>Za}JZ<4wfM?uKMmTc@>p$yF44QY!%|ihzzh)n&ZWxTBA3QFX z<~of~{NA&NOW+U1_)m-&F|xI#$_2!$IoOam)0o=YJhHhp)2M1{X{+g|%r<-@>l>>Y z+N*0^Bb%DrMpo1})HimF^rwx;92trPjl9UnVBYwVb&c&KD_drc#E&DV;y+Z_P(O8K zT~!r}hj+-ghSyY1tsjXuN2Kxr`~RJv`2Y1mj=}%)UXGkuSv9S`@qc)D|E~<8S?TcF z`i`1vm#e<M%9z>Q&dsq#ds}@&>xe3nRmarIR{YX7r@5we#5B;Js{{LJ+uE%gyw+@9 z^BJSMrWTLk#n!g!`X*dLrWuuut@Y}%v1T?XNnKYpHP+VG;TqIjUsF?4+l*^4Y;6td z$39y13+hpILX6<LvW0Kpx}~P3u}wW<w+<EA*Qkh%scdg(bCxwURn1UuSzW?Q)+OGt znvK%dhMF2S34NYf*)|PVUC{gH%9hHRHQ4QIjX<oxutsA4v6MpszOkFafy8ZPYimsl zyCLs6md3Q%)@_3!N02`?x7M^*H{tP_=8xEOY;(0)6nn-1r^YI2Zo&Ru&I&53VpnmA zS!r!UIS12ujc!BM;6azmeT1l=cE=@kmp+lWsIIQ0ZrR9b^>xMgufBd-L*2%@qM%Fj zh=kgN#*x#C>wG)LUtG7ju6Re$j`78H%j-(s-B{F6SA56#@x_S?_`hYBy_-@u9^OE_ zblZ%j8#iuB9E<;*TzY5X;$_y|I4$K+E$y(48#gDm<A1Y!+AxT?ig2*N$Sw1y8_{S^ z*sl+6_NQZy^)USe{HIr?5a7x`*cE#+R1%3A`N2T6JRCH9onNuu^Wl}UK-egYWE$mx zaMbV{p^|7=uPBSidwFYw@?3^d6v)jjFE)Z@kx)@-iD6)mx4&$7s=sKw<Ey!W+`^y{ z37r<iOXf%YRy*ZK0r1g+$>CDtG$SVzi0Hl%zO?jO5*~J>>q$m97%YhnKiN<P$@p}+ z`gDFyD2ng;Gf)&L%Z(VRDZF)6v}1m=T*ZNCp@A*t!HV2qSyWHKQ~5=ufv7R5G@NJP zzhD@T8|GC}C>kva8o`phPyoH*SI~2#C>V%DQEzde0uQI9WT$0kWTs@Nmlvsls)$B& zF*fP3VM2l5NZ~!lsUj5O?~$Uw#Gp}(aVjl~hDu8?SiZE_P#2ViN)4Zp6Nm%@d3j;{ z8ua;m0sQC6FEdUHhD*`>nYG}CmZW4oX<j?zM_nU!>7%21%dE<V(dY+wLH1`>Q$r=> zRgGaJ>4Rssv>rmL;Hzge4#sBv!DCwn>q&emSx+8qzCAzLl^-aI1a+UQ0(6oWoEXZ* zl%e6#(z3E(o}PjJlIrryBDrBBTwI!m?gS#^^`umN%oyESj9E!`l>|yKb;i{8`Uad) zU^G@X)+P-eoSYo%b2v~8>WUbFijcG8`S?S>eVl-Zn&;w>B(D*^@<PxSMzgHA+-DB3 zo|@@W6k-%*qy>ze^8BRcwiXPML?9bT*b#;jjz&X9S|!?4>uAP=NLdI&Ul=MVbPRnS zS|LXQ_2q+3qNSxqq&QGir2A7i^AQY0K_JU&L>A{#m0293XOQ4bN)6eRYSKe~D8Ce= zTox@P`C8{C7(6dQjdMX+*zeO@{1^vtSAhc2$z?&kp{cP>0((M2c^H9-=5+Wv^34e` zi{*5fpT*SWg(ey~Mx-#5AJwzeY*Yk`10+%(s6QA5t>Q7iuXrkCFP`@6>70znBrveA zBZX5_-`d{T)B^UbsZOdKHWh<y7&RSjHK59-M$ll=JVVO$rdrToWin|~AFJbvWJ-Z6 zf53Yn5dJU~Kh!o?H9+{+*Umv@cxUWb5S2kPI_I4DAMu|3<LLR4q#{OMalj^tGzx_L zqNrqAKYCSBhDN1kp|rJDo^p}YOacJ}ebhEo*0t(G(3S{<MY4YESltKu02hSHLirXe z1WN)r6c6%*jr7!Xi~Z$b`K+fnMDo=@v^ZBiY~+@fLli)M=zhP?Z@ow1Du=ui&r8w= z*&7uGXw6kvUJx`UlI|SLG_Ad^#sL2|B%$+VMWvC5jvnV0mFA8&qK0k@2U3bT!%9k} zm=6`6rb{Vr3a=C_Bf0o#ypbOcPB02jQ!jB12;_%sCUvk#ewNRdEm_1~iE>M^PLviI z(IBLF6qJ(2uHX+Mu)eCS)d<&A&B~e6R+AKJgu>KVRZ~Vbou{7|S1|l!`CNM~CJGPe zC!ItBY0pYFYY8=`rX+QGBUkB7IhCz70d?Srev)odd|n_LFiP|DBf%($tka8DlX7t& zNt-@=_-K8;>N;ewQ5-CGN`+JkCj7Z@BuZ6MEeHtI#A~C)T%v}7Oet6(G$%)l+-SHc zPOf3d<Zyr-^UF(;8lf}|Yi?<3Yf9F6t;=gyTT?^R>>5;QRPhV(T!jLQdq@xRi4Kkr zuSetTnD*vooVtSBj%5859t6|IN;>r6`q02o49d{Tp;!Uza&V8N)@X4U%{8K-Vu-r@ zK&S`;-=C6_Av;qZ$?-co!j&l%|GB_0(Y#!67FJxF3`!u-b8~|c41gkt&YA{Rf4vGI zg_?%s+e}M}W~MtT%EiiCf?q)V2EI}hDuEs`sdH_aSlRq(vNj0YqN4n8AQz0Q#H|l1 zK!I$!VTyKNsx4hJ^p*@4j%qO4(2=}gu0JKq;6kH>MbhvLe_D#vHSz+6sc7JkmWoi3 z5r{xgM2%9YKTs|(QXC1W6P9$83utiwG8se%SP+UtF|MZQkn0CkF^qQwmaE8Q-Jj-j z4j~AyG(6eX)lxe5S*lGK!HmK9FqM>yG=nPxX2M<@VnP5kzz*gVb&`fY2!C@yht#S9 zn_7Aw7iOQiFc+4kN+u}HjbjGM30NazFM&$-Uqw^MFKA=l1ZxO0Or@v7lz)DsFc5)W zlou>EC8tB@NJ%TgQq$U8SyiK`osbM*G&D8MXm6H<LyQQgX;N+>)K+sCYze439|>3# zfwdNbSZaZK>WDO7N>)m0T4v2jsadL>_Jf#e!@vofov1snv^W47u_zoY-g$CTP2C$h zEvN!|Z)v_-yP-Tvf|vS+QV#WWOgng>AXw}-CI!Yr;gU+Do@p-3l)wc=r8$8j#hTWv zIM$5(ENDwulpUNSMP7cO91CD13VlD)xs9+Dq<vs1`xTfxxfVGjJh@y>UyQZOg5i84 zcQP1Lt!cq<=Zdq*jTiyDVzulzYzP$iluaR(W0G72mTr8#1hxcilt2lj2ee(A9C2!u z(+a_@rD93hMcsw6nk<8LveaC5bwAo)ggGdShVw%C`I7n#J;k4vnU<BBk(LP)w$9*@ zR<agT;mwh2Xh|v96RUQfp2`{;Yig<u0}HOvfK#nd0FeZi)(r!0p(;l?#9>}A-zWsp z(3otjubSDc^P&nX6Rurnx8qnV0tlUgl5#y)m);^&iHS!;E&3(dss)<VBBurqC@aiC zKX}i<S*g4Qo0FkJCHbL}P;{~+U$h++8Vxm-t!=Pm+UNy<N2Z!``@lS(V)ML{((?0j z<pL&Eqfjo?rK0?3kfO|7F?^X^F)*b(vrMW&N)6kuMKPKxDJ|PizDb!5DuVec2S(Xo z{tR;pQ&TcCpz}*!QC68_QmY!~Ccz^TXCqZjt8DpeBMEQONIJpa**=1`L}N+Thy_+z zT39qKwd_Dz8I>}*qChM=7nIa2tS4$#l}+ei3nx*xH7Q3#Qfsn)T&ularRgmYAoe<| z7RFGtD90!-A=P3b>f{E<BAe4MfR)x<vr0-!CYFZsl4?4dc`h5Yb!uSswR)$Lihy*( zM5JR23WnqTAe1D%rlGY4FPe`*4(CH>FpOb3+yY#v4Gh-7>af;L3}+48T8+AoHA3;S zH11Ft?2tHZJBw_H)m@o`vDFw7wj?JX>n?>=%+#J}lm*J+yj5x+e)dD2qIUANsyR<j z$u>1{%2<jRX+0<w!>wgYD96NP<(L=_&xAj%7LypE#vBu5dK#IJo;0Jf>g@LVmYO8q z&@Re_`@rCs)2N_2GTA89@pPah5~BVT2p2$L=q@PkmZZ|<2cUV!sa;a#rrH%V<swBB z=~0koxEuoxgSC)PDu(KjtGpbkPW>%2BPdmKmywU}he~x9m$M>6x?sZaKgeYZN(s6Y zflZC^qw1<iSNetIQtyxqa;@MaH0aAhaNwl+vr>K8Sy>stnc2RKOn*9v7b8(xmJ<l) zfOjcF^Ng}^s5A^Y1=9$!19Kcv3Y^2@54$44;CKid*c2|Tl2{>am5M^nDaEjo7*Ieh z?}aqRED0Bk76!vKZ{w|8Uon?Hn7Ka78t!cNI67+2fl-_Tsl=g&RYw<%DR6^UYbtUB zCGm0_1vXJ(1p%L6IIvuRUGgyfwhGD)=7kC%xl^6|9w@Ic{=0=8nxVb^s-+d?X(^bJ zO9(uFrq*pYMu{YPpk#v`-L-vCCdq{&VFypyDhEpQLlaES0=1;szraChnS~|Auq2gX z=(8-LdN`CJXRshPBy|j%^Ve<!STwX`VC-~2xWo*hB)n%BbNIs?{BW$(H-Q(1;kRUc z$Pj51>0`$7*<{meK;=VeD82(5#=iXwW2MuXE0Mz+X!)Qf<wnBM(&8LC&H~ZkU$~-X zSGBgZHO-vb3cqG0j?sjsTh~(AJWVRKZ0-J<Zjw=Uj!}M&QFM+`f<;DZ7Bidc<5Udi z3IPIBY9Os2m}H$7hzwH?geev+E|bIzn-9&gPX#rZ-YH9<vBz9xkR@5tC?-+SBbFhT zWk@?L(TcEa5;R?kc_2UxJh`khySkuphw`N450!8o(P{o-g`fh1&>K9Ox)F#*!=aq= zXb=t@IEor(SI%j*f9BH5>I20=m|SoaMwD<hpl#)1Rfy&m76m6l*nzuTc{Q`@t7<~k zE-YH+(xT)}(r{mezYL!2qVcgSF6ssF%LFjJP=2JjA+<&LOoGz6Ed9m#koQnk4rGYL zrp985C|vQ1C!np$KNr?5xK}3`(LyPT%P^F2%evIBrS^_lQwm?q1D}*s-PAs{p(Z(H zL`sS;EiJ>BmYtIBOZBJvYlizXiY)zOKcx}{F?m281MbIky~VW0ag(CAI8<_ag;EdT zx&>qBa2>EMAKEiCeBhrC7t3LH=$w#<PQ@O#F~weKNSG>ApbTfZz&Y$9r<LlES>`yZ zHWXO1Wlo3GtHBj?`R0}u7Y9o6%-a2axNB{~JlI-s;KiaM0RKds2bt?crr%zQLF&%d z7M3X<I=D@(cq!H9B`gFs&%n`}n_qzM#jSF-UWj!fR1|<MWD^e70~Hps!Y!GDUG*td z2$nJ07^_(t7UVi`r)6k5SUo>i8vW8v#<YUQbCckJs>0lsg#!iB-=UT>xKN@c;6Sd0 zcDo#F*ME>kT)g<23@N~#ba9m|FOf==^qMJuSrXJaC{Hl{)!0BrMM4E7@D`PpBg8X4 zR8$0)H5eY0>Y$IzY~`19$#_^~a!D@SW>b@_S};|eC*R>0g;Olu<WpN)HK(DBfg||o zEeA2xOS|(EgSiejR40D6qIKvu1(B%$$#9deB2x{z4a<gSq!ty0$zkv@O8HX=4#V;T zT29NNpG!}YtTGi{QVqy}cer#SjQ66_Nf3LnW|_`4+7QJP1MzZ3uaf2imI#<()LSc{ zw_+}2Fb>i$2w!s`l1sltEaqbArlAU$vZe8gDf~@_F~N2OnahJ*2H<S939c-Tk^E-I zUC7HYO4^#HwI=1kWKY(4A8f3yuWXFWu59*asA7-;7T(-)1FnitS)m+rC?wKHqU2I6 zrU!4I9OIO9r`HjR85&*&moe4F{o|ytP36d>4MtR+=VddJ;0!BpW)R}TSA8I~7<Uz= z<T4aWL7_rkPS%1C$8?qDgbE61QbRi~C@H4&Gn{&<<WVW959ADB=d$)&dT9Q-3`86$ zhMjAa>c3NoiSeBgrvHQXYk35^t)7&^pi+uu!CI>~me-gvK&eMBxkV(!2$+=oM?GjJ z)~iNK2O?KdD~KSxEyE^^-3IfZA*ZJxbOMKI=|nV!Iwr_F_OMi@^I;*vrIs0IEUHfW zDr^oiFA%9t!SiOUI=_tKK(ESHv12-VxlEKxPqyx3jgr^sRH0c_9*%@229spOYM3(h zsKwP+$$%^ippW`SD_+C$iAWx40W+T;N^y!Kj+qSeR$y&{cT&zk@x=Tv$fQi_21#kj zGUR|+MCexrADEKS=#W^T_yVXT@k@eoz2pT;O2fs{4*@?tJf8lP?5wnmwA7TeEPp1n zg0yrM=XAQ!WVl`lGUz1?S*h5tgfWsfgVr=FboNc&bH!)a8^eb++{lB;K}9Af0C{0m ziD)UfL>cp@s~*CE7BT$ra9~lMNlJ|=QmxaFuodsrrYjzcco|F^elsG!GZ~EMH~*l? zLLF*@F73!5Kmj#5c=^qaICa}N*#q4+Kw_b3F1^dTtD(9jsj`~E<yZt>y4?RV1dq4q zT{`^)|CtB#FR@Oif5|ksU|Hn^;>0NCgYA(sL_Yyd7)!(M#ENNbyL{pR^kM50`~PMw z5cs%^@<TyIPDY2HE5B);+wm1CZ>c*vR#;k%8B*H90IC4Lu(3K=O1T+gNgi35wJ>@d z;Vvrl2eNu-@+2pZ9Si7E9(YT&P@Dqm9h9TS39>=Pza5NZ{)~PonITC%x3maC1DO~$ zRr;jhkRsI5Y~Wfhr0Qr{5l~`{U?3+1q3m}R8ErG05xLXp`=Y+X1?7N5<ro|i6*UNJ zkYORKRk-{=dh)RJNEIOz3<lvnaAd2HU951o3SS|Zg)-Ari6Ew%3+a|li_!8)TQ2Eh z2)2S0Bd8nJ6)Y&-C+W<&)|<MOonC>o1f4!N@Hw3CPB$=Q3|(txHiWIjW<j=M(N>Pd ziB0v@0cpBHrooSB{{RX&kSo#tJ?4?zKM-d*6dA>JtaSUYh^869&<K<obIPFk$%Lmk z89-Y0Nj|c5Idff74$9o31IIw1(@FEJ9KmPPUCGFo3WS%o!woO{EU(a3y6u(E$8Rbl zim+9h4K2i^lq^$h!Tq6w{*F7Y1OLf9B?wKp^<!3`KR7%ikKBqMLdaRMs<te0<??`Q zMyZeSxd2QlJ4h~o9G>`qof#ZK!cBF3Z7rf2wp>y1KznV#t!-dZn~eDxRghU4e-1w3 zz-N<Bl+Z98u<*b7vgv=7VvlA}eALL+PlE_#7X(XkCoAETl1_raT$q9jb74r0nJf$0 zmZ|=+mRdfAh>9)Vs%OG7&<~VZr6&!>j}+(p-{6@wGn-oG3{Ezii@2_t$d;0d=GxW_ zeTD@{N>hnbnX$wvvs{TNu+F5ss8gg;OQ7K)*)6{)5RrLp_@`d{V00)a@F!4vX+mO! z%ZNZ2GOew)8i}Pdjn-N9(!<dyGEN4i0qPiYeuWVpjsm?9MS&cc>}6s2D4F|)nwiE& zr)4fIOnNQJ{W6nDt?Uq>_WYZ^ole!$_L6Uv6-hrZBS&@|3D#96)66VWcR!Umt}>|1 zvaN+otYabq8kmDvJ2lQcgLkwx?5P|HrL3}HWP25yTO*6>t6G|J159ts9PZB=$&lR0 z*4ZPgnr6;KbZpkhyqc-)b*?f>`0Dx=eeg(Jm}Y5iSvn-C-AL2;k82u@fA$kYEW-pA z<s*F%t&*X5nb8*Ku1WW0re>vQ0i__wP%}K$mqmY#Eq5HtL;#A?0j)JG5lpL)?}W4U zs+Me5OXY0DB&uo}j5+u=9aw6>VE9Vy2@?s;3qJozfifeD>nd6;1JaHzksB3dm|=EI zy-C!dwLlm~wj$}c<TF`rlC<gZQ-PLFH7la9W<B0hlKPjCNUUcFt4ar`wVpvyw{jh* z@MdObW@N+vm6nx}lIl-qs2}4>Hbo$&h}JN=3*lsWo^*sECLtnWddpR>7_mT>Ra8Gm zm-a3k47dy{V+3W^MG2H#N@?4hcu*r=`W7u~Ig@(6%usP8hx%P%L}Flz<^>D%^vn@R zIb~LWO%7$Hlfa@(GK!~!DrN%5Mfa_E#sLjapO5}qw%H;}EC0psOYyTa5aCJ%GGi4| z64*p+XV)cxU^5ZnGNO}85dumoW+3Q9J!OQIO9x{h3T2iZP>C_NH9)2)?;Q6**rzBM zEaUntsn!aPML~MXIcVlG#_7kBNYyecXO_MIBsW=(w3KWJG5Af)G-$c{o2nBS(%Bbu zr6eb3veWh^VOsgBP8XhonlY4Sh@9Qz8t&JtOrtKB>Drd#w-AY{GD!}MMKK0p0TqW1 zj)ns|IFR!u{T@!Xn-~ZqQyJ?7)dLubG1{=57&1W#kL;K3ZMiX|LaF!#k0})-ow3Zg z%v<FT&n#5laA5OeN=XS;z^f4rLwv-^0NI?*Pe^Hi+GVm7x}D~do>`EVwED=5j3UTv zYI-m;WKhuNCn+_d1W3bOWdN80N$PQ?%^83{X@8p&feoZgBjHO=IuQ;Vb<J2k7qK$A ziXjLv9sw>HXG78})mT%?k=BALmLe0I{n8tfPI@mYL7r~Ph*Vz+g?DyJHXMv;=^0r_ zE<(6cWhL=tE6zs)nLz^E{}jtek&8-B6cNlc3=|fRaL7PjINkuSl$W8I<eU-)LM@T5 z@LbGTYyI3BqfK|k<<UY{OiJP}O|{UhafifN^R~93sj@AZX@XD{?A%-Pu~Bh_)$&~@ zg{j3T2Tn(b{y;b!fWLXa@RB4lc%PA{CVOTjRXP}kq|ZO~05id@L?@-3n)#?q=23qb za0FXMWcssGviM(GdNxKoC6(c2+ej#BYMccFBPqCFmP33=?2QAN708u{%XP4;|DUi? z?4$=<psOK;lq@Sn^2|X86C7(1C6?YuX?}DPmT*1EKW0oyDyGO<MlskiU!!BhspKi^ z+!@W1_M21#5Fn3+%Yz8d)7vY(FfcC6_=)sk2BKaUm6XWUKqBQ;vdREI?}!k?W2 z-pI;Mhkla<FM7@JOgJZEHXH}rOaP?jm}A9d(o>W>4?K`%1swQI(@7|k1);~$LFh-e zpjy`po#|ty%TyxzGaO%mmk}u;g>>6vp=Ce_qBPwP*FA?o>O#<4Vs5VexDb*|W%x}Z zSF2E0ObpvIDpO+MVdvDwuhx2%WD+dd+^a)DRFso~90{3H<xq@MDU1-{m=KPp(2a-O zRDWtZRGLhrS)}{Yva+Ps-YIy1<w*W1UuRgZh_o!&SP0iNOmInXQc)<!Ky-k<5Ph(J zgg<KpX{^&2t4$#3a&nbhAQo`=iy(JPTGj||YA^}2B2R^`I?-dMk^oBf%l#mcIFFKw z*g#6uw_+a&1OCXrws#BQ*4_@Fq&b%O0CumGluD<qj*-IX*<>sI;q0HZXA!1{8DQxm z=|~x*#*Ey+3hQFBb%C^an_E?OvXz&t<~H{Lb6e#{)J-O`#ddKhmvnYYN@^-}{nU)C z^t8;(^ep(Fu;8Fw_=q!Om~@TcS5Y7eKa*~4?r~v5PknX$LCn*n!Sd%r>apdAN}Ngq zigOy#hlS)<%UMtV4*rqPznDuboii(~g_D)WVk!Sk0<xK54V74Fn8>e&RW385D6C_W z3s&htC70Ci5RfRaIo#>KRmOsu>diDKQokvTlx~yZlFOc1hWM|g^rX-uU>Odk56y={ z`YKL?a$&`Y!Wpot%q&MUZFWBw1Txhihmg+t*RhB3_@Wi=v&~c~zfA?#>Cd<2y0W0` z*smlQ>ClAWN6MQ;$UYd-`B)!<(WJ&<a<dEfy3|&;8dK}rT2D`EOdeU1pGPg@O#K|B z&iIR{(IlZ<KS4KtNtTI>GIw+~nFg7o(`Z(gn_?!GhgU&T01+VKO7~O}z=$GlV<4HB zBGPmo$Ta8}8<p9))PJ#C04yZEX_Q-XKOQqHrEPU!CX${nna{5t8j<~<{(_*!v^<CJ zAzs;6KEZ>=>+SB8g^_;z*Ly6@>@52g85NZ4YiH?Uh3oA!*!a{E>BLl)5W}ssJ(U7( zWdbtZ=d_wE%>Xu$rDVlL43I~j0Vlsh#+f^M=&_dpO{!o}A6&VW4OPXJbrJ6OYO9}B z-!{kbmQ0YRGuw_RV|9}|5S3+$JIhDGJ#I*AMW!JYe=O-~*3y*8WDKP51j1#d5YM^c zXxv^J`Xl(Cq<$uIFtZcZ2lQmP#L_KCr};W6ir<WL(5fBXfTfm?EIh7MYV(MS+GDGU zqc4~uu9X~FYY&}tB$)9qruD0})`f`zJ994*XI_dZL@L+^EN;0{nktzQQ<@NRDMQju zIYN|J6kv8>&nj#Hb~RF7#&Lnx1G42-G*+5lhF~d#E0~$QoGPt%Ghkz~D$}MdW2)1K zlt-d&PD_)~F%jOPX2)3A_M{4mA1Gm42F2Bel!(LYW=b-Z$3qfjT%0+orsEhy%>5j# zxTo;l&tYv#kJ#!d<Ke2maDy44;<6%mdubvm@@D|Zu>;ciyJ>wo#fVd}mD(-Y%Gx+w zQVJaq5f6wiSRhypY$?nHsFVXIK*?w>5-t%m8>WvKF(UR-oM$T*HU|wb_|Ju^t$rqK zI6FU|iKPtRLKnxkK?I7_)n;N6I#wl%G(dv~pbe@H5WsdGl#-f`e0lteENO=K$WFGt zuby+H2CyEb<f@HEwl-zPQmn*YQYYNS!T8i(gnrBfbguVEZkQC998r-U6%RUyNp+Ac z^v)UN_O?Acn8^(YaY`nH8(p%nrkT!TxnZ2VNW%!xamkC=B?^Q2AbUhh^Q}Fi2(ZZj zXWnFl|6sYv?I)JmK(`x%AP#}x@H1L0%gxj!%7tTdEyWW&u(sEjwyhHMijSnfk$c2t zm&~8I23Rf%>4!0w0g#qWI&jjIM7W!o>A<8P>3Q2Pt6owX(wR(Uf)NI&5+Uq*`!AFU zB-$Qam%tX9s;1^SN!7!!w;{GU+*uq)DV=sD{QupjVD3^dMGxjprN~4}<@S8F4W0=y zrOj>FSJCR6VPt>NNvFI<*-Z77M^J$3kwHhe-=;Qas_!{Q4m2?tF@xx`#N2;yO2a!{ zj=Y_7bmf$`2wJ8pN!sR|vgMM@J8d+jLY|y7Pr8cWQ$qUfXq_6M4$m1PA<VT_x5>@e zxZNaooYu>X7e1?xF?~$%w4rw7HJo%3ij&Q^<&IwN`JnGjE}gW^LGwPjcLZyx&AH?R zX}FtdiPjGgMpR3Y9ugCl&SXQSR7s5!o0Lq&3NhLEJV-9xDk2L_ruslzlbr$E|HDnk z!}i<XEI;Ph-;D9;v@O|cPW-lHXfd%Z1bPOPACjVUE6bgE*a{MgmLev=#Hr58q_s0o zMWs!aH?0o2*D-#Ro6b{{aCp+l{SR)bir05K@1`&h4X}4pR79}F1k>mcgDkNXBTg}n znBYcOnb&GfF~nPb79+sa^6(6HvIMCQVzY=X7};>k!^$`T^#>l+A>G7?f@i18FnD<^ z>yTLyGE)MN*ny4|_;KYP6Ue;yL~h&8@Mj^JIx{T|F}h4RT+;m+ew+ZpMKNbGVnzS) zED^coo2px3xOCD%wtnl@@2J(Zr&Jya;{3Y$SZftF@wFiDP_0dhO>rGN#bB&{F60Rh zGB}3_Yn3$OIt72#ARxdb1G{n+z#dssNtDN_So?772v*tf%tCmOpl--h5wJ%~?JYGI ziS$$$oJMVXBXi$sarlVbA&(;#uq8g$Ivs6_M8kAC`w%uaw@kIvaBE@>&giIWZ)vTc zRb#y+6YD4>kklDVP}kG#I9L|qGiK;2rp_KD_gz*40;1v^=Uob>NGc<lQIAJ5H@>IT zc3pmYa)i6AOhsNj1X~3U`ONJVl*;l^6#I-o4ow#Gadg;Dc}<1CO{$hmaI=<etj6{> zHE5Wj)^JT_HAA&H{KSf0%NaSad5{h-0@QPv|40tNXFIuTrGlo^2j;p^X3*|}*~OuY zcU0`3ZLE&-;lNOzF@xQ9f8l8BJTy}6p)TrE{xxUzw3$2Yb18RwVP#`=Lrsg_rc}Kp z6;4jLO^ZsTmoqITgU(G~R#sMaMrvwSCX7BbnhZ<_H4=}ag{66LWI1JF+&M@49gQT7 zYODm(s8-@4Ql6ufY*TPB$pn8f`GM}*g5bao2Xiu|eP_?6FW2swpTq6g`M^ks9ga13 z1DI~BSjMxZ*_$q%v@~o+wha(!mQMeWH3GB>D+1Xv9LA|WKmZPU2(*-V-aGJiMboUL zj;eeBre(>HF32C$4x<*Hdk7kp-){DSs&p)<Z*Q@($tEr-0ufp6LX`2p`o{V;ZoX9g zR6E~g{MPn&ajGq9gtmVWN1;4G$R~Gr&yjF0wH+jD{by&`5K7R4X|U#si_A!+v#Xtv zq!!0wtla)GpO1dwze?6fwKWiOeJB`Ca-3m;BzNoJl*;OGO<hvlkHhe*JXs2FnG!@r zBU6fCwT{U4Wx>irG%_XAm!6eL4|{Mp4in<M$>EP%XQgrEV|we<{qkF-qW7QjTc`eS zC%AGFF@X$6#AV#cT>T6hEqtQFRt;kmV9&qQ3>{2hn+}$JC`~a*r}nlq{Nr5pt(C1+ z_4TImon%?E$+BR~Sf4)=!GEP-g6*9OrqR|U4_N8^s??3u`#fm{XRP3)mB3JNiPF$O zFQM=RnN3Se8@?^@wo2n7$MCQelgSaPa4>ni6Y@W7%EyE<#X@DPLeOKPAtd5gI#2-@ zJM^y8PByL?D#P8}%_dDnhQ#1q;Z{2un;aGJaOb3KE-<Zd1va(Bj#EGgD+Qsf{lZu& z)Dm*B6~X7Ktu|U~U|UH450ce*X9Xk7*b<boyuS!Y$ly{d4rj0jT4vM2LNd3HbI-7H z+d=Fr-Cyd#aN<e%@60(tj>CxbumrTvrZ!YI&QSB*$u^p&$M&8|+l`j2;}9Oc6mQOT zBoBcF$78J2!8>?DMdF8^(Kb{b!K3&*50r_`5TQowd2DHKZfkWi{4f-^6j!!lQ@JS? zCbiVJ)%=BAz#600qG7Zz%$F_7Hq!;@(C=KGLj(;&^`*77m>FK-@Qa$3iIolQHFg_h z0&Bcr0_`W+uO;K#@o%C5W+cGOiJ&f|gi`F(JUtW22~|yMGZ@~=HY6@jZExcSP$r4b zY^s)*(5{e+tyEkGMVrn-IK)kAw!LIDqIup<8V_-^%_nJE(`5}eVtBGiGVxw(>xiL( ziVDeN*b`G~1SgbZpAJshFn6nxvCM#KA;W8?3}bi(Jv>01sL<98rHUsVZ06SYa`iIR zsd#N6j-$cM@(+_J7Xz%+Smjhsrqc^VhT|wZO)otY*-+}x0<OCURsjrTj>AP*9?lJh zC$saad1eBneQ=CpHK9*i3YikxEU`hhoyb;F(m~zGR(L>VOmWu~qCVWTYiB*~x1|y6 zjI>Sc=5?H)r(Q=41KSZ}ubPq|wv86As-*_f5+meTPjq{w>7;E*`3>!d+mxi{9V{-x z83yToYG}5|hjJXn5n?LmfZHczb$0Z{)`n2x$Wg<TD3jKv14InC!3BHDv9lce%cbG< zS3AqGryM)WvA^8jRV9~FWwZEUB&)L>J8i_qI%)l2Q4@WNTmm}9mB5?ModLyVN=B>H zI>!RU_1g^i+nvpum`kq4d{`p|nT<nC@g4A9spYG&<uz3G*k)(G7=IpT%#)3gM>Yxd zNHby3bPV9mauGNM4h@=v?--5KNU&oR`iS(;+k3$Ni=AH_bMsuaxa!hUvbdwb8EB*E zVbyt)kb&Vm%2j3$*vXudvapq`O710#(~df&^4nUIRFNDen4&@U+&&v5-MNJiL36Wl zY(9mLy&E=mLX{)B<v6qoglk2!W45@AVOcv?)pBcj8PZ)d+v=KIl3E&v%{p+7Jx?!f znx*3a9`0LdtmDy;EeKE#=3=g^!%WQsdQbyx60^;5ffmPRYloD=1gK0+oO&X+wwgW# zWiLevX~J{Y?!i(TV^5etCFwu2a`52L#&*D#wxn6ZaL8($qdQh^GeDX;YlR+7=wVKU z6GB}&yPzt|gS-w9JoLjDgOKLoXXV&HSAf$*)Y4<GZt>2+{St<;>5->)fzjX(HF6?( zHowG(#oYYUd1H0lQbac4T7=fvS>}1jP0LS#UoQkR2&rK%+i4Aj5{rbbxIsgX7M9~s z6;oOwLa2nYxpu~T8Lg8^>14FD3DdQq&Y>;M&$Ybm936Vo7|~Kut%LdUxIQAT7q?rS zmaII{Anv3{ROy&*v=otQx#2h%hF8KtWn2sSXLbhuTRiIUggTErKr=1=QSCg?p4E&r zJOnqKr1XQ!ulPh5B%~^VqdFKjYwREcUvfz^59d)4<_LGRGr|meNd79*rE&u0R$R#M zOP8sB&J8nEwB&PgqpX#T!t^Tx`wlD*Bg4?<!MNrshm_v9Q=`qygD_$NcItujD8#li zbWlT7=dJ0ET@G`t#Y@G?Y=UDr4EAqZQ=IX~0L&1};)6TLIs_8R8#Yn-(^8oeLPZp& z6+P7IxJDmF#MGRs8k$-Ua@dn}M@z>MmMwF4mz6ohoI=dT0hJ9i-!QfsD~}fsQJYX6 zLVhMv0UX*Tta;Rw##L1bW)%1pk#Uv97?Eu)qU0$sD(^rBe34Ms)G`yt?;JFzPKKW; zTcr;+?nEk5w@Tep%BLD}b<%YhYBq;F?ku3PLgd~{A5q*YXC^^H#ij(3>H$+-{*%v* zJYZ#A#LEZg(Zwd~sTS^c%#T&ftSaX+8K>YVYt&S7I1o%x$7TVg$LLw+q&nPH_FTl5 zNv+3Pq~y}<Bml*OF)qVr3lOFCrNd_C*+BS50B|ns|C@7?PS)d(NrH~5c9=7;-Z^Us zE=zSx8gkPkIL>;6om2?b5#9|RL^-~b9goxJ`0o(RNOnnoA9M#Ea;*ekyi#Y`H8H;` zmlzdsDa$K^&87})$8lNotSBW3Dfv}AJKI(X3d$ye+YWH@0#7lvy-hY-#wL&lv#W_# zb*lviK@9FVmQmf5*fN%_)1>0#CIKHXy~HH0;vA~;|AjVBUEWsZ&1D__aT&I;zQwSY zjMX@DHqaF1-jAtVlx0jJQA}D|QpA(j7*9dDa!4r&=a-Hexl>F|3}grnbFeJhPWq!I zTfp$tANl8s3t^%m<uG;aBuBL(qsh+r79NUBl35K{k>Z88z3GY)MIK|pjo4P6T{+Ht zk$MlBhdTC;XfSkjpw%TZ$+5c7VeMQ5!KULGkTZQravemo!2Q^kXxT9Gh&CyQ;x%qF z&)gb+v*XtB4j>^U!C2dO;xx?opQLJOlQ1;115j{~Ng$GfNg3*Wv`D7I;c))=WGMNA ztkpWe5{GHT)KlwR@mh6+rP9|sDf9mHFh*G(r)9>S=t1H(QIH~b@hEQ&rI;1s)w95s z93+|(@v8ZMkyoksEmUeLbYwOqwP~HIEC;2fOX2{1AQfJI&U_4VI$pR#q-Le^&)S$3 z_NP!<ke{SlHyet$wUxQk0^?XCz<}0SK=w}iaIh$V+$RJnAka+jq8&k%f+k=73mF_j zd&3<LrNwDo2ipEA$xXRz96ZJumy0(j9ZnH>Y$JbGE32;~H3zjTZ5mS&4C7zB81K** z;Bf~LE3-l;J;!zg;60Uv=QuOO-lLi}0(xXddPZ7$76fftMmqPX;)G^fhle3A17JK; z3HnAjjL1a1IV%@>Y188P94V<4z49L~kfK!DGW(Ak(jZB7u-~n7({Ugx&*B{hj7%aP zpPnQyadtr|^j63A=Z>c4nnpR0GK11NjvPe%*>+gEF_A*Bz%;fxx7{+65VWx*xV5|; zaB;)HK&r~Gs(chHke810WTZZYu$Qexq=Opqxan2G{uep~<hB;1U-1_ZJr4|*8`a3_ zoi<UT8;UJ(+J(VAkrndTHFIC3EqZN6H2>WKwIVu3MW(@VRHE|V6)+urj;OA!mzo=C zu*-tej$Ib)71-R2>VWo?K1%<VgT^e6pbva#4P-$O2caU50wZLY-lU`<2mA*-aQ+R> zY_2ijA-B?p*f#T<olF~MG&9#!{lhUhr{By?M?!-2Z^>A#v5w)OD~1uf1MI+(=V9Sk zVy4hAJI>r@&Y8r&M`BAm{xcJFeac9s(iN?L3`WmLwPuM1Z$+N@Z+2Lc3(B%#SgH2( zi(}f=&O}8zh=pT}l?H$cth{U*M*MSny6heLd|Ej*od0Hvxldcx<@{By4JLJ~GrsJT z6ioeB9+svb<VXbkxc`v|93YUjJwP~m`+v3fC2*Eh^|{qF2nZ+&3JB<B0GV-y=I)Dv z*wfR)v~*85-7~|0koK-KEi=<YcMl8#PvVY7qfw)IngpY9jd9J3MvY6{qlrFEG%j&} z(P*A))I<~B_x;azs!mn+y)(SHyqEXtH$C4yRi{o>o%MhItDB!4LlPt~v=K=(A?Qdh zlNt3vrZZixcoQXzT7<%Z?`~`Wy)_D&)?&Ws%|lxjt3<0luo!(Hjw0Fr8f~#sr0Tdp zvrk-e{`uWWIOwNyTdF1GM`%x8h5;hBzp(YJzyJ$o{eFZ}EpU~)BO281+z}8!{7T#A z1p|+Slk)_{L9{z2MFVQvvT&_;YTBws^nIt#pA|6JSD3R1x1*1B#tS8UKce9soQF*h zN`bmd;#56HQ!;XJoS4S-Leh*RYMjCgX~t09E~Ro&%Fdf!<$}U)*LSf}Okq<n0ipr+ z5^%C)zRK6U4>wo1DfI4b;J4Ge?XOnhFQEt@!_IwwJhKHH%XkhlhXzP-2j&QL<0Hqe zVH8b?vTj$a@r1W($7@UP?v&#xvmxWMf4HbaO|!a(mvidjwqbX#lQE}}*l4vKaL^O5 z0tZZF=<_sk@bwT^LFk_|xXZX%>_1#fre=0pXghSCNg2Yk#bN&J`Q<KRfe5#N`b>3N zw}`TXXDDxyJ2My8Eo4(-=L!07VHw`%A-V+NNv=ayyb9tg2eu3y`UXaRwjFin5uYb? zxD406mffAka%;|g-4-KbE!2<mCtl9V(k+ACcgHnDO)EK98XW^u1_rpIaTB7`FMr(M zrgo4fm*P6Z&0)Vz&%t8zK+FJ5*4?<7<DMR{5u*7k_csscWc2ND9#LRu5kfW&nsar} zf*I`=h%&u$jhEVFx=syU4kbtrHPs8mL`-@?X4hcdAdEwhRo%63<*ot67r=^PD5E$^ zQGDK*BLNMb^myZ@WSo}<Z|Io)Tq1qU9vFEt$PShbc!=(yA6|Shl07ObE<u4gZ+7v^ zOQ1L6eCTJ$sPH*ZZC3V!8#j7V#78v=+9MaYmc4v%#mUPg45!qJy@Z?iWLIn&rd~(S zv|3}=#Ia{$I%8n%iES9PSv*N-F!bX|cnui(F7#70$cs6M>b&q0D_COn3mNzB9T}20 z46?Qay*})u4x6JrN;T>!p~h}AHlLwE2zN@M@;_?W2aF3(C(VpOAn&)qcXC>@zKQQ# zd(T?kIqS+u^ofGb!DV#|=_gyB+?K@qu7Mb#N|gmLE}dl48CAMfF(kq1hDmBGT-)Gs z1AFgowF>1FcyOV8In-?#+OSXq%|JazP!roGa@7$}PL!$*806Lq)p7%>TI{I@4>7t_ zs;9QmTWObKz137}Z&q(*XJ+rcIrm7Y=PR+V)uT*`v7p#rErY4=lkpAZjNl~Z&x@`* za1pbj$u=Zcps!C=-Q}ARH!m3r%*${Oc$qb>S`m0)8_!UlHC_P9A=yW9B*jDm7&H^` z&zoTu`+Zolhos%xme}yE2m=cn5q>nTDe|__7+mokJVWosn~?7QE+&Hm?ORZ|C`WT2 zU<v^6PKw>n{LWkw#|Z<-ZEBrq6}lJt7jE?0(=^u<#aV)jgOpJKUf)OC%yd&DKHN~u z%`YH2?NXOhn1A`J$LM?hh%CjM+jKl1vlRI`PV{fgKRQ~CCoRn?$>PH)G-ctJY%o$X zQFyFN`J|CE1i!z^HmZ+RV)hBfg)#M!MN>Y4y$T24CO8`0JPz&gWR~#Pb1p+pIk3yJ zkaH7Idy2J;IZ2Xz4NC&2BWorFX+I<O-Kk6v8StJkHXb(zMpjFk2yV;VmciPV^?^`{ zF7zl|v{j%&ozy1@Y1;{DZ#;t_AEHay=;1OJG=02$C1XPok317}m4_drx}hh7Q6irz zt0M#QRY5z}a!ZtFCB_rpGNOSNgy`LLLN{5w(6#n`5Ysc0*8ok+<q>3blVa$Yk5l#@ zF?jrXHd5JUdUxAqDXWcT$Hqn?nVs@bRxl=S#$+wri+IyMc(#irhZuWd7S|Qo6RDrO z+SQ8R=$npUY|C%2YrcoTOEz-FOWrcnia!lZ^&6Pd<f-QCR+B_i({TdfqZ7P0eqEsa zIA7!{LN^Vp8d`O%7OMFVhEq^|agmdarW^J*sCtaUTe0J2o2C-H-D{UIKncd_n@Xh{ z(tT&7YCX`g3=+SpZk5EY0;9!?Zqc{wUVH!-STZU25$NnG#y_S_ST^T2`Nh|4m=QYG zSwrF$u3yxrRHe(DDBxf6OiW>Wp=&~aLXcaiY=OFwwOLF~<2~FE3@j~!rN?nVp}sYX zJ7&_em9%o46@llv(X^XoVi;La*T7gft-qJ5)<oN%Z^un%D5wf&0B;Kwk5dqeZk#qa zc;_a493(bu=t(8Dfd!>x2k&r#lBA+cSBH|4t;Rwn2a#$RnC*6vD>*fR__uVY?^z-x zT-1}|2#!^XNbn`0C#Qf?OLU*?bNeeW6k~xkg-YmqeCw!>6KF@6QSy-5mAly)U*+9F zYx2y4=$tqJ+G>pUMcW>a9%iAGZS&tljI?>uT@bX2&Pq{P0Ucxnu}Bzj7B}UPAC73S zgXSKAmXDyujM(BuB{yz_l$%5jNda<n%_UyeKX$BMplDKoX_VPSfxb({l?o^laE{6C zK~2D!k@-bp6vec)#}SK*DX?JG#$1^m24?ba0mf{ibh=LvG`Jp+k`bo*AY_Er4cP}l zR%61TqlInpox5X(R<K#hS+^3a*SoKXsS@jmkPbiyk{UCj>!B9NFkukzz#j%Y=qz+{ z4+9&bgUIbGMx>Hn&M0j|FJykZ`Exb@FLVzBrtX?!MvmmAg@s8NpMr4!e_`8JU<kaX zL%%p;LA>i@FUE~Y1W%C0t||j1g81v!bLf$?9!5IYNDdUIS@yy87gJ$>W*U<cEJX0X zVn+LkCMJVcQ8>A3Y^ViowUtB5)>}=Gkug^&mqGa~uPh!EGf7P!stu-C@>~cMAO<f4 z9)OcsyNG_8Nx?y-2m^~Vql-J%cnO?*gg<xcg4q2e-q%q{gG2jKgAl6!tCa``2SZN? zEvrBCzUOrC(u2Sh=b%1kx+^xQw`1AQy0r!Q;Y4fhdt;eeKmVj?I4a_aHvrav+kBf+ z6}s^Ho0{+!e{0SVlMI9*2Ns?AwLb;<#=-%ddZ<5v$k&g_Uk_7b-iv#XVG+LZGdT+B z94I)OqZs5^IM8-ah5KXJ2tZ_`!sE>ns%4Xm!Pl?4NXu}45|*D!U5H)V5bo@OD`i)1 z_9`a7=Dsejts7gH+&hnvjIUkb*TAma-!xBS*#n0-1Dil5x#E;h`kkM5u^ZxY4px>| zXYC=NJSC8;ue5JkK|l+f4_*c5uz6mcH{_ZeI&f$iaYo5JN#7i10-?RKc*8sbrLXbi zFe9|w%$W!ti)MEPW?L!DZ#C=hSgY0gW)531%#?B$*8huQW)ZR!k|qjEitT*dm!t^f zppw_VrNEC*-EzdI6j$9+9PncMp~sYdF~|Qo(k-bMvs(tem^~%+Vs^`*7lYfq;L|a4 zul+_r{FM=`f))uq)p^5uO=rfI@K6^wL1fv#f%mr({iUOMKq~i9Jt1Ug9Qg^E+(-3< z{jH@qNX?O-kjZ_tPe^_E5!=BmJRA!LZ*-K;NZExP&4*-fII8E|+_u1m@yi|ITe8`Y z@)@b<iAVmHOt{6Pt+RdAauYmhO`;cFm%nK3QN%q&bKlYA3^W+hg9a<#VOzs8tCc&S zA2F6XM>IKO$y>yi7qSaSe5H3_Su<3hTNe+^^V##%p&6O)9Wa~BwcZYIk<H6{)+`-W zLWd9}5i+j~8H`OFlo1TLy0F;d${S4a{zhF<vDtMEq|RC^7*2DoQlMe%y-X@TiSPl` z2%{wdlsch=YTg-0B@a|8iT5Mv-F<4OV_R)*TuH2B51sZ6k)!`h5GmM%2J#W3wN1$f ziZ!#-)3BPL_IyANX3dyDZF7GPuhGFyn=%m#0OUAo5?1=%fQi?<Z6w|etg6(D^KNdr z?ZvsvNc4Adw(Upl#9@aL^^IaqAL<oe<gyl?;6druiV%FzMK%;C3e|kE2J7@X+}t}y zMPL)vv2)?p8$x($>S!09bCfDb;!wO&AY-i4?Y6zV09?#A*q903zRKQkl`jbI1RdK~ zdaDPstuRul<!kUYQLKXL0H+gG_$@A3El}s%bD47Bo{1z6-f56TjBaqbgp&gXKC4vQ z9sdS(61=wOpLyW{`;aw-9yqnxtN@S5<HsVDEGT?zBGt$Dh}lHV$dqxKaq6fc5NAo- zpgY5oY}^oUOC_a7S}G{+m>I!3y)+0!W_Kg7X|S!sr(xLnNZ9DtUVT)X+EF+{j(5ED z2gJ%?uMGGT;G-Nt;m}wVWP>}0wUmN--|L~Wv=vIvD2RLNqwtK))N<-mfo3h)tm_$$ z#~8oR6<f_&$6IlBiT94+q=iC&&~Zg-(9&_mR`?BJ10|}bK^EIVvw>3M8qY~t?`tbf z4Owphld5-gD6fbHI|gzrxUmnSPk>c|{w6oXNd%bGdmYgr&~gXNi&gqbu46b?1Gd+V zb^PHHbbqgX(9Her(QbdKom-bf#Nc&<xA*7^UJN1qTq&zSP8@eGcs1Dxr&EqWmEQK- zjz8Y^$DZNkc>Wg_*~+}e+X_Lx{*Gye*xZg7M_j~Uc~O88DWWzi(kD33{1m4^J-Thi zTf{-0O-2R#=L~|NK?q+!=QIac_+CgL;;~Nw8FcBk89Q-iE$#EIbqoKD`2r<6RYkvS zRq`ntd&V!<+_q*_f=_^X7!mE~X*xuy2UdfmE#&!-JhH^28}13bIzTm(j7Y~SSrwWz z7UYK8nP8WUhoKoK4nQ?-eEn#L!YY5lC4-mQH8Hyb>M{er2OJ?P3ZtLJHvWn#Nn>(2 z6}9F=xK9{=7N{V|G3@3haROuhU#wFU%!OX0;#2`2PmitAT=P=zLH?JlUY!sJM(h() z2=qy28*1G=r>3r8c5oer?~TUAtMir7yV!~7m6q&S+L(F4K$*U$XXYmmSZ*^i<oIP^ zd?o!VCaiG931QMSMo=3uk1#O`((EYP>g=QfrZQqd&2K}v9$CV=d7qrOM6m`GG#=ts z;y(VLY^mXY5FnN6B}kA+<HLJ4c*UkiOosR1uo}7{h^e77aX<~f5M%aDTp0z^J(oNh zpIc?K0Y)cHtf5H>(-U0))6glIwH!}<En|B0$=I0OKRM7L8{ZD&LemR}n!yyEA%GEE z@WHOup!Z5S(R)6~ANzaS{s!-EhxcUcADg0@6JNNAJPe&{a+(IIv7Q72yPD!FyrZF* z(W$xh2b)XH{ba*|TJ%4o*o`lGHqD{If24c|0Skjb2hiPOc(nPOy6`x+c)(8^Fj$+Z zpxhM<|9Hj#0}vy?k;!?u{bhe<_yo!XXfKhacam9mXKaTI-Mgvz5+?03W5rZJSC-3- zJgLiaxelL#aBRjWBr|R>)-lOiXT;-<ARPw<3*Ftx>CKp&Y#z+b@7cH5!p1bv6>(f@ z_)nt|lHxviy>ho$Y`NB3+fanC-BeuWNcbbv_m0^u6I(HPIcbH>QD`b@KEUBlLN<8q z7AylPVuiNq^dXd{SlBTz3((4N^^o?ur7~obkkNFcSLKdZFO;@QP(%$!M|HRbg#tr5 zIKo?x?Q+6~qR#<A1Ues#NwO3x8_G;T%f2f#*m|O=^${t#hdH&vpt5iRj5~&h!~@nG zrpK;L;x!FF;=zg<_OdQ>|KS3jOu{GZ*e-5a;W&eFO)RV}v|AuBh}$Wa$6=e8imZ^C zWf<KZ1we#G=Z6zJsFMwGR6q@+cLIqws<0rA^(}t;Al;!rxfI{wh=eWBk>@59QI^bx zoZ9i;O3^}>#_tbtVq8=4md^PhU!`g8H*^Sa&o-Jv90`rp3K|Fx$2JzOMqIC;jE1vk z(OIV>qu&)kpC@U~t4L|38k0+}Qx{~DdyT@?oi^(@XY|piPsH}aelnRMuJR+T2&ZFq zUb+?iqiMnB)vd|FkYPxS$?>?8P_NQg8=KH|d9zL65XIO>cpFzGPLqiq8m`(27e9Ux zFO+C@6ce_){tpkQ<a{&7N)75t6r%?&mcniJmhsIyK^u=F1}sSYzS>i!j^@R_iMw2@ zTkaK$*eix(ITakXpZhVVI1)(k*PA0(M^J$(pSuG59N1BF-gF{B3<7zCoeCms>^ykT zMc6PFl6fLHl4M^y^f=b6lUYL{CzL*~p$|M;Kp;E1uw-By2nispgM5kW=KSR1fjv&N zJcYFptR7g%l*l*%!>3e5TpI*mM9f9x<l^N+5}SjSG#iS8Dc1B3CKZl1(gjh*?`P1* zVNWs&{VY>1+yRo(X^f^lcwus|)?|&s$icJ1oRI@2^a<GKxP=`P5T_3`0`!^IaBW$_ z3ndc-e0YS`l!1?CM~Ohp3a4)PeD8%MtZJiG()DeViqj!8vdR(2#-a24C--pb*o;px z(5c(<fPJ}R`bxNTog1W_9Y_!zQDf%JDQZKJRapl%`vn){xzD-HnS{N2yzqrF5rXC; z3ClR@Nk*)Y<R^yO9atG<j-qwWRLAnId_lIZYgAOcETr}Mj$pl)vO-Gk?5_m~pA;6$ zvNQrhyV59DE2T=kQEQZ-t6i4shrn7WYodS^&K>Ui<z6_&bYl(GV9;X|fSZruNCvtr zb2}3!EJZ{m1I^^Pc$g1Jbb(gd0*lGj24`R_Z=W8Wy<*OkU0mjw2?REDYQ70gT`7_B zGtwpW36)mAs*ZcdKHjD|QQe$0)y+w&Zf-_A@Pw~~#b(>|q&Ak`z>yo3m<HI4_@-<_ zw;EOQ)S!-CNIAbS=9Cc*Z|Ig0zz!=aiyUuq8NDkrr}buLY?<!L`d{-CgFXtCB<JGG zFPh#QbPK1Ho!dE4fmX;UqMM#*)igg+liTEK|AYRuvs&j|oLxT#dz4d<H@Fbp73$F? zA4^Kl2Vu(S?@<?NR$UEsgdx0&v2W8C=I@&*t?I%5GTfT(W3VQvLd70YGj2^s&8=yZ zZcS0F5qF-tifLvu08i1&82F}Gx3Ii$px4*U4BRP_=o}Xf<hCJOCwI<m^Wha->;&k+ z#$CY8A$SEhLna~$eSWO!ncCL|zG33Jr#<5M)HJ9cPY|q<6&N*+{WFXalRn~k^`l$8 z?kxs@9Zu((jA2e(!7Xr;z-OW34^S(`l*1}c&H1@%Fx8?f$P6av>^6<Cv#;{mNc(yi zPND$oYqPeN`<Ft;vsQC%%YFZ=MHT`aue%Gr1USQBY0r#+#D}7B*Uh29YA;2wlnb17 zY?+(!dy05}7Iy62hp?rjGt8LqakQ&R52kl*O>f3vstP+H1aDYxF608+A$QJyBO2JZ z)r8lQMopPD#lmvRr|(*dfa~XX-ZnqEVZ&vY&F`crB~}CsC_+ENxl4-Obj&0UF2aWL z@)8%kb!l<mJ`{?Mj7<+2W!xqtL19I*1+nT7pqJev<$T>*7gMV-<eU$ea+!j|#H*Ny z;%Zr36!HvjjL_||Zy1F{1CuoUf+JMHcDzU`NWuDtnU4i<S(X-87VYV_0gmJJHmKl+ zFNodHBp-nF#iD8QKi{mFxD^jqh8p7sex9ChV~^NSyPZfp-<ms{cyDV_Yta``Lt&iw zWOO^L=204Rt)=;AVkO(5gX_%pNL*XyV90M0#WINDTD?+&oD=@*8wem#hq-ta(<Qr0 zLhS~f!>C=3Vucq+vzUV+Gn(^zR^9K0Mt0{JPmuD~pBi3#H7a!s4jF$SlOY3LcR z>6@mYvDATrj*IWZIrNOfBmziG)W>r*&m?v)=(djP+01p8{ERU~Qc8BBvaZ>7^~4y0 zOuOjpE`kxFpt>RM77XX%z{GP5#4|rbiX<{;4A4F_wcibpDxk$B{K+hyuu`4H)j9K~ z=mw(k0%A%tW<Yo!wtZO;ATwj1UELcG!Nb}w$#EByEnrq{HqeY+xf{$TkUt3n0PY<X zLC6zjrkv{hX+a#3_|qzvSi9CyT}+H@M?*cPeYKGLV~pO}Xmkz?fBbh1|GSoPFUAmO z7Yfc8`8K4u3zFG6H%2D<NcN$rEm7c*I-Jm9!M}apM_`@1I!m2lzh{OT+VmwM&_uj) zZ=Ia9S@+@`_?^iF;9|VGJ%WGEph&OItvIIwn;c_CF?36K66|}wfrC+)5yB9sh~mgG z>ab=7^FtgMiQ&f7V6i#g4Ffn(*fBol0s)eb<(1BlCW^c<n&6Vh-o)r>@6C92mUe6A z0!$u}NW#G-lJmm=vB?Bt(#fY`!*n*#y%FgJeNRTK>)obwQ||C4nDJxGf%E5B$8PVU zNr^(pt#HeMxI4C1$tXqZYMrY)^o!PTqw3H4<|?LGsz=*qxi;oBPT!b<+{VorBS?~! zuV7C?vn_MA&V4q>AXo9T<6s<t<A7f5%%=VNAIysJbeA$QazjzhtEP8l1|xTYE=Ptz z4c~fnFhQy%nS#ZfGzd%-!DZCpvJN(A4AlJ<_%-n!0Jr@6&FB2Xa@#j=zQ$Q&rKVgq z9->z71P2l}2aZbT+-vL(5;S6Wq((I38bUBgQq|G@m>*y;Nq=-8ezaW^Bb_fFuaAAr z9!Se+ZxB0Oj_=AJrr{9}4KY?2Mr7XcH`cB>%n#tGu*y-JzMFvzb+O#c(83pqH5J+u z=@_F<UBx1;n}@F5pgTw5dlSKBDm~xEPU~XpR&omQpgO1q2u%xlFlR@~C2FUX>xD+X z1Riz0SgV48iH?fyL4pL;&UGoYK`%ge3010HdS-Eh87el0@lxh?YHrta1ZQ2`^90L4 ziW%;B7jeaMSBQ$ut`rN)`?|}&WEYl~VlujgK^GXEA@FC3>dVI>YgUJ`nm}fe@+#*G z3;+qmENof^k-)Bh$I|I)1zaI01X*W~6$ldz9`7gHZB=bP@TX#zG*Ajl1k`k$@23>U z>j-)?E8Q_6Njkxy2eb*qqJXC&P?!8HM-okrZ@&T~%V;8cGO$Zd#K2(k?n2<f5@etz z9@;YYQ?&pG+r08@iCy|4ww3x8h6r^~jJ}WA8Jo#CzBXhW$6pt70|S0cItUE8Yfe)w zBxOT!uA7Iu2M+B=Ynxzqe<Ilp`OcfCrzcZ#N3R6nsJ%uuQuH`@e6$_aq&?+BYGAZt zrgmFfa}`k=#l*$Ugk#XT;!^5mzBM(if%}Od@5#)@`C_Zvk#dluRbyR?JokH^@0E%i zmEzOcY-DpB?$>&bGC0t&n46ew6wL97%{w9QL|9x3J~%-`LWo+3gN;E;Wq)&JFO7=! zGC&s`uji70xO$WRmYao83l&O~J_dUz;G<k-7uEp$GYMlnDfvx06l4P9Z8~&hmRK@o zy%`F4Rx5G;NjgVdTdS|($>zHf|6#vMhcWIITm#cf$9Nzi<8q4wu^XIzj+{m%TLWZg zYzF5l4HmLvPIUmD*ce(Ku4BatM8Nt&BuM~i!N4C?&YVemc3#?1U#xSH8T>S+j@k#8 z7rJoOnOoB+f1O=Eu?IakRg~gzm9pM-ysQD3vRBu)al>pTRWLXM7tGmsL4Drr$<pb< z_33mGY23074*LmX4ozztZb7&&vkU!B-0GgF%Pi$q6tnif+wB4vbhybY3Nw7rJhG?K z$dXDIac6vov)oB?IJ2Bgns@jjuy*8F0G@Jd{`Nk<_~xpE!5LRy&E3x8RRgysRpx&3 zdC4!kic_p0zRK#mTn=i$`{~39w_`#TNxwyj=e#(K5a&F%li~Iz)_ovVf*#EPSKP;e zNyxPTQxN7J?&GP!lPge~>>nDC$bJ#*yDpM<xP2TU=A0(6ym}xgkXO#b$YhvHl26?1 zb602bJ?F6)w^8!we63=S=QOSr%iA1T`JGj+&RN#DBVL;+R~E<AEu|B?y{w+z7{Wja z*wVQ9!!4cCXb&kzSAx7oJ6*dHU2>()V_M@-1!oUDMDh{CQSW(%R*S2=ve?<xe!b!; z(N(@@IIVJnE)LCVl|e^v(xeqr^LFesJy)g(GQ$r7H_pgFES2(I(*AR!GvK|r_|!(y z7GYyCf~ZSjJVyjmm5QoypQLT;1oJL{S9VKp`fK=)YM$2Fs4uw&%Mp=9Om}!tV3GDx zN>Mn7Bk~A#nAILeOgj`p`LuQ@?6^%?)b$;)<=4<#cYgBy2(Z0oijF4n$s>Yy(<Zu; zb#!_QLG-Lt7_cO?RxWmOQz{M$!KLXxmQmUWcLR>^5f6CH_fUbOWeDRMW%S^@&1+C# zn%jL8Izd{5j5p%m0n1LJRObhhX|96@$e9Uy!`Ki!&v52O!P}K_I12HEJKYUoC0yEX zQw7JTV=*PH=9tWI?19a&-GDm_#|O@c_Dquq+|TN|Xso$!-{xlfhS@H*ZJ8oWJV=3a zwx@d0Aec`J%Wbfr_YLwhfGtNnIi|F%62(Ze)}&d5`62Ndl!FCL=!+1II0?tU+4%^3 z2Ad&4O4-JbCKI{Na%=sDXmY*{!{a6RM8MvWlP82$Zg{Qf9aEF3>^q#8wx4TgeEZ=e zIaydgzxy^gT0jku>NU4Yv0giB8=f1e*j_T>@Da2h5l1KLEz#dID|>PAhJ`MD`ypZw z%+S)Ob3E^ScfeK02KYP2s)<;|i^~Xio}7Rz%BS#x@M4*AFtUc*Pbwdy!<h}4byFHQ zY=u0+#98b;ncb!rXsW?hxjuC33Kprf4|6mSEsroXcH<`;YQj8q(FKJzw<A2EPUW3B z#%n<??rS(DF=Bj?9wX)u6`B=91=;=csFQ`mu73_#V93jvn5GjN^hb+hM=iue_>{zX zVf>oZ>@5ZnRY`+zbVt%;vX4j>G|C+*yPP8TC?2Id#-`lXFf+W-*e1E5I0M~|RFGMr zz-5YUUT0@_Zl^g#DeB#v?l}GW6CK(4t^(4_^{&DF$@+(rEMe4Udqy5TgUi_Rl9O#V zmpQS)(syxRa|NwCKhN-3%S$IR%ccwSX}4PphXn%6!j0!l>-1U(0s@_V3z;y*y-TdM zPY;I9)(&3&Ql7HmD1x2I`J`KW*)nPI?DSE{iXj=H0_Hp{22AE?`#9SX<*{qJ(mX+v zimZU20)81(MyOXtW`&s%B0^88)+kh681`bNR-*E4+~R%*>A7@nRYlB*xYMT`pQm^Z z$cstV&z)R?;BS2uhc=FALrXE}#F6~f=A0T(UiKT(ZeZ8oA4Z52wV;*`_Bp47972AZ z7aVsb<{YKG=af@h>gu>0arvi)s`SBAop>8hbsj72X^{Ow|BE4hkL1qnXuY|S3>IUb z+71}OSDW+<qd(ZQ8>`8Yy)rS$UW{p9Q+kMr@><xoDL2#Q?2>C^8jLCL7Sf2yj9SMk zah=@+ijo?`t`C)RG{zD6w}yNlbO*Gq$hz?@o$5ni;jj+{Ghc=cs|a2(-^rv=v5ARI zjNmFdMj)+dV(S#V*Vy8L-U75q+@b&ttL@|T^q){iU|{0W2psQqseR`RmAlH}z5<$0 zCM<BeimSEk;{B9!?g-5U*WE?Oty-@fGoe7;l@v3<)$VMe%pnt!{j>`^I!U`D{F~5u zg|DWieR>bf-I$oH!#H{}AdXlUQ}T;OCK585WG?Prbtn8H8H}#$b}I8^zOUiqy-;(6 zrwg59oO|?`g#OHXhE(XkD$_UeRUZbF)Oa{>x6L@yS|bl&{6=yQhjpaTU!pl6!~*K( zi>t?=@_AGaKLd{pZYnqDmzY8jzBaB7xTSS`?Kt#SUys?E$sh&<QM7FwMmokPGQ$}Z z62wu_L@+j6D6#Fi%hq&hyPy=m(3Bte*>RqLR}iXkc_jl_C!t+27|j4hRE*YCZ+}A4 z5rTVeXz(t4c*2(t%Y@BS>)<kNo-D2)$O2B#scEdgQvO`1l+VU>Ryf`OWsSg7F!kkT z#$G5ES*_uXG*kghUB<0*<2$!ZGqj>J48qHrvIGBP-(S-ia?Nxcq=${=a&G4o13O{j zCi`YJ<66G=-8?l?s8!01a;bvw^2K7kRzVDydWt(r%N}PN<h=EftYZUF8;@%~Vp3CH z0h$<eJ!D~gQ9PK>b<b`Ti=|Snm@if9m2wUG<M|qeA%2C=VZlWw)wgM$t2<`s!V#FE z3js4!Z1}9CN^>iO7_lufi3fau_10Jm2k%~?>a3fJJwcP)R2Yj6?!9FhD{W3_;`2ZS zUh8B=8bKFKkhITtx^R-;?QlW$Q6atl76&Q2CY9K|H5N!i5)v2()WJ%I55CfO!GJVy z;uVkvZZtqvU{h#nvVw%k=AT$(u%1D<5o`y0>@XU)JInZQ^E7ONi9kGdRmB-yXY_l_ zZb^gE<j6;C&#vh{T00aX=X<nr;JyaiG#cj-;K!`DueoPA#~1(<*KUCO>byCmHk*jm z?h|zvuVT;X=LL{17PyLYgXqJ!x{M)5n@U7ZjaSZSH{F**ezqO4OSt7g)l=l+<{YSU z&~H3EU||>2gln=;0~9UfKNl;cw^aZk5|}dkXydY_^y=2T3sBQ?j^BY~cbMvo4~eXC zx7H$_<jaUGT@Q%m;XxPRTntk#4sIGbas%hMr*JHoFH%v4Q>ogR8s(eEw?dcDDkJe4 zi17ho$94;hYFb@f;24AwvT87s{iv2!1+}dQ#$YFL7gIk|*z%=_AF?DBD|;4#PgC0) z94I?+>*ROK9Of7e>3KmTD(=wzMR)c=vs~%0(78k%iSSeX7G*Rg<f7QtFO0#W7jMkf z$zV+9*$#9$&VJ{ZCaX4dg_0Q%#jI~QdXT>n=ozq6PfYKG3jN&G6LjhtcX!85<F?7Y zPb`8;+`LqBydB-$tAC=4q^*8y=r=qVxa&&n-$?(L=mVxy%wy@u*DBR|y;g&219wFf zMmnoSKd%Kb2aSWz&kR?1SgvYyFT-_#Eg&FS!v1fAz}6nTD(oI@)ZssqPdJGMNx=pu zOrC=e76eU;31<XqG73FrE_=!Fc%!-{AWv|2W;YO2WJ;h*9)lwt$)-r+=ulw;9oalC z&Cgq876p!1Kbger=!BB&PM&>46@Yxv@jMw~fnMM{3%wqej=fwoZ2AiVnjDFp5-4sd zCWayn#211v1UazR$mF12*Zdr`g~?mQ3o*6LLJv}hSzbLgOHe&O?95Iws<@KYT3$S= zIRX8p#OSq{cYK{@g4fDu0Nx@Jhwv~mQ1n8C8;;e;Y$QU~!nj^E_$A{5)oOBNb5rm5 z?b=^iN6@`qTl(>laZB;hs~Iu5_3Lo4Z{Vv~53r1J=O!=HX3s|dqUx8Q0iZ<#Dv9>s z<{Wp8t>!q@k}$+j=c47n`5lMVknLZ?Xq#5K$#_upa_n;QkOgEhyY%|)G+AWs7Q8ft zd=kyjT@yBqdy2*?!jBw(T#}1-QJ7GZHFDQ9s(y6x>d|ZFK%?E7+daAro-<u3Y=sr> z{5*S;6UM_smoCoPDgp;!zMSbXQ@e#9!=>)ZAvk$~XRzDx{X3J$(x_p4l+l_~6HxWv zIfnqJ*cAr^qzgLbzq_xYhqMA|VXe8wy!>M}2|U_p@(AsPouW#HU5j_{At!BGVVLQ7 zV{c0<wBDc@HuwlaQpb%bS0oeHj_v@foU>VmqDUOn>Wge1^|L2cM&tFAZg*i-wQXYS z4mg$Y%?^zqCojQDJ~O>D+fTftge01gBi@R-2nL?U9eldOS+rlAcT7pH^iV_4aG^^U zOkB-<-Vv$Ws&b*S!Lap;cq+h*V<P}H)_0w%`E|;>C-*BdnGog3Lb{s;)C?kM_>l<* zG&7?hNi(E{+llve|E%z`5)^Oof@0Woiz0D*WdG@ScC$0pj9EFe<6!jc0Ob+5V5&zH z(rlZZ-VRzHi*>HEpW+$~Mzl(-jP9)ASM_9T83>}FsfG83Ciphb8+Wg%n43;zlgta( z5sb4D(pA_8_^+Tt4R9{8f6Isl!xp5w4d)6meA_8}$Bt<PMHy#sP}HxjWGTM9x+-QK z6YzT18tI_tl0T6gjVYS-7nky^>WOg#LBLER$;Cpq+a<pf^!GyVmi5@XtSq`DextW4 z-~}~xoIy18lAyH^=mj~_r2yA(Fyw%dX1-dh7YcO*Kdn`Y<(L&bQ+B~NG5n}ewbmxu z?^x3cKC2}veyu|XXZ$7}zRl-mb7c1W#_%qV93L4bQ~V%k@1cRFKtWD#!5X|aQJJCg zH@js7y4G~1g1b;uY|P~sS)7hl{9p`@eIEMcRx;Oo$05U9{+rT+hb(+q_fmd_Rlzkr zhz9TKOjLJ2(KP!n1sEjK<gx_sv#vZ+8-X}suis-~a%MqZqMfVAWKMK@nriQ>N=&OT z^jxeXbhty^N~5h~K}op9O-XCT!lQS*poU2YCq6OA8p7-NO}Wk2w!?&zMR0*QfrA{? zl%`rKNH;x+K@%7i+e$D?Nkj$WR;t<lk}OS3zt$O=I6Jn33vk`2H+NG>YUgk2wd`q* zRj>_fqM0j9A6kihZf)8{kHXILmYp}{icL9pT4e{-7Yvp(PeTea!S#4BZKpmGv<4_( zW6h7FZ@F5}F(S05z|t-2xRm``b`6_BFev<4Q0DXV8|5u(-MYu%{Pi0)JSGW|bv-8| zIycBV5^}Z3apknNGn-w$Jzkf4r<9TJxB|jrV451qmW5?n*NyJmH*sJEYMqA;t}KT- zC8%$g(aapEaFV*Z3703v@T`eg6)ZVL4}+nehO1Lka1JV;ZEt@6t$Gvo>sndpwS5V1 zNoh7VA3-u{95rt+%J_t|mjMnQ$Y?^rFvKb5lnk-iE@qQso=yfjRb|KL;Gtp{9K(!S zw0ra!BXN74#_fs7T@Pkd6HccBVi%i+tNez8BFl+gliLdjHPT0q-*>ab;S;CESf&(I zOzi#1R(?7iDZ%MTzy#bnIX%jd6QJ18NG=*qaK8nJ=PD9Yo{2<?a;MT3;}w(0U@3k! z-*z=wVvf`3ch)Hz4r4u_s-Q-k0~v{xX`wS%8@1!LQMvDMnjUG-aqtuZdX!bO2G^mQ z<L80vP>m-^l!KnhAn^U7Vw10(@V;V&miR-=G(DxqW{zc>tv2HJ@e9q?3U35$yqVD} zEJ8JGqY7}|1<Ro2=Dve_n;ht1Nc!Qv4~i#;4%*3wdc$GAg2%M<PDP)}Qq!h41j3E9 zx^<C3iq=6RQ_&i2ELxb0OrITOa8FD>`|o!i<!x>RW1b_KEfFuxnbGEC<(9>n2ZsJU z+{@!NvNot_5AXjgloG@ZLY9qFtDhMIlTfvQg3|NxV7qGf;>O5L^YN@ZIH`!2kXEDA zvln2$cAz~lD$I;(hP9j(;RV&p=HL-=hr4|g8V{Imu;@|ZKR-8nwdrGV4UG44+ov;u zreK^WMHTWr(HrB9ty!YEO&rJ-F#^*pCXi@V^@muzlrUhdibBy+e96BM?KsGp_Z|WA zws2pISpl<R^3u*oGHo8Y)+VuCaPnKbbL$M54@DYi+IP*2O<+(vmvk|MxKwra>mehD zv;zr2oBzyp_ChC=mT0Al<uTzt#-i88Q;##_3q7oq=%N=|o*+D8HO~w|B5lu@AaPMv zWb5dHsw^CUk=)+Jr4=&^M4QX*mCQ-myP5$4HZa%?&3pI4rmc`RTU^tm)hrgllYu$S zHEDAitj|fL;atT@w%s&~K}tylB$_*e7~rmUxel5DAuG5`4GVTYb}t`FZW>g$bfny} zW6utHzfpVa{hCC~rZpt*6JywDWijx;kPQc&n>XI*Vh?rYW?I^FS%lLzcts$2>AHlM zz<yHfQrvSmcX95brg<!Z-x9^_<#|{}WBgeY#PO}eaS(h%Vl;@ar*sDaKPg29A07YC z!Kj8FZh4Kt-zMR4G)J3R>*3B;Mb1@?&&WLmhq~K*&zjvN^f$oTr5+TO!D+M3H3eo& z?o0VU8N=Y_X4e#_GYO`_7P$E_;Z;11z{TC{Du-rJjPc$C9kqTKwGg*`Vt5_%3HL7E zyuW$i7HuZhg96&P9`0KZRBFQ|zzuL1ydAt*`5wf?YGWa*ImXctuLXfvBO`Z@eT{01 z2`Z<agU|#DE?3iQC)vQ$_LYtj4O~X2MtF&Anq|n|5H=T;2g=)p%Z*Q_nb_c8YpHM^ zsj`cOo8@LPPc0Rr2(nxBqq)UHOYQE`ExED9PIof`!tTvYBAB^3_8ZApE-p1T<ZNFW zjaH*5YId8gg=lCKejZo5cr?1#y^kL~Vd%tT?mc|+(EX1+edqy0XAGY?bk@*=hRz;- z@V(XzT`+VqvfhnjC_3i0`<#4AbSBdN_#u95zRwBIJm%R$n@>LJ*!UXHf4<MPj}Jwb zZ>{^jfosp{bKl`(qUa@kuAM#{ML+9v?bKtVXcFay&&we%kL!+$qH}PszjmKfkDEEx zz62LXmT%d=(rf_{<j8QZ|FzWJH-hLGE76Fl$B(p@m!pxTMVH{kPPcVv59A=dMP#wx z%~orvdy`LrtB4!ojPMnEU{9B2#HaQ*+e^4PIRV4BuD>1c5skDL_wPrDs%Qi@DI>8A zJXJ^!?r3q-o+Zp^_Q6N_-$#(|enH+cexHE9C*bdq_(PT2UpC*RIPddaJ|N$gAm5_~ z<eLogjSk4SBgnUTK)&mOd}9Ohb%K0+*M8r-FUU7OAm2)mZ|i`3w*~pG7?AJDLB4GR z^8H4TZ(=~c=Lh*7Js{spf_zsF$oKLfAKS2B{ryppZ)!lkw*>jN56Jh9Am8+WeD4eL z%?!x*(IDSd1M+<;$TvG6-{*sTa|7~yEy%ZHK)!DW`F0M-_roCHt^xUe7Ua8nK)z!! zpZamWdqBREgM8Nv$ai{>@7e+R&I$58W<b6Rf_&Ev$hRrTcm05T<sjd$4aj$CkZ*oK zzAZt%#|HTxg5S6l-3xy_W{^0{iq_$Oo{jX0{v`0!YloueV14BLd;$JA-kA47{INVN zadvzNH~BJn!vEf=-#*{R!@_ZmW$?)3kH7IKJD88(><>Pd$EElSPDdx76h;4twbmd0 zS{*0CN8NSZQ1l_Z1ixbg{`_}r!*72Nenvk!HHz*GPWYef+x|E6J>mXQv@bZ}e|9tZ zzI9p@<#>Y*pRb8@_<nmII~3v3_I?)w{rerpZ+{PdMkk#fMPCR`_@67d7M6Dy<-HXb z`MsCmZ&i7!=x;m#^v&_eprc=T`PNW$*S%eN1?25l-q+5JqKEs!fc?t*I4X~I&-W|g zuU~l&elW--T=z%6^3L2pWPOO`Rq)rZyh)Vzd|w!_UwPY5-n(&~<<;=lue>jzJhq!Z z`jvOWfuwyK$lR~I@1ndrePO_U<(-N0UWDs>zenJ&UwOAY<mle-4Z-_eHlVyaQQpzC z@4Hc+Z{N!Yl=l}XkL#L0`hD*Si$l>~WO@SrM)BA0dmoUCqO)+_AN|TZi1N-vCYI;v zwG;3=9&Z{SBe^I-SBMY)Gdtd%j`HrpMV9C3wYAE7@p(tr9_w#R`irO6)++C{DDR)+ zx9i_u>L~9_z25}#_p86V)<qHi#RqP&Bm2EGOGD9mT;cb6dTp)udoK!mt}DX+?^oVo zl=mu?=jpYz%9}esiXM0r<>i)>_Vx7ITIDUEJXB45_@CMDt)o0YpL%+2t@1v5K@@$~ z7lKm#&un?$T^WjU=wqxuPp_?2-di3TMc1sczGcfh^=6DWEbc7N(`##$cgiNL2c8HR z@P4~*M|oHmSe~cX)++B(unTTN9)I-v-n*U*Is%zko~PH=D(_7w?`YaL|CFSCJ-xP8 zc^^V~T(A7m@BOx+ygD-R{XD(4R(bz|^6my5;g5dh-GTDnfI-Ic=JD5Wy#1sK-osI} zNB$Y0U(_DW0p&d(llRm8%K`hn-%p;KjJNiH^3Hi=6#em0ly}!}4Mkr<K7KE0pnl)` z5tMf{>*XEKOXj~l1Iqg>%Hw+PkAC0#9F*tVcLACEz2AK=2j9jQ2JBbfhfrP)*ZI9S z;IChK8&TdYuKS~3dEY>Jdy$Fd?Z;og@@_|YoFDzsue_P(4@J9?iRCTguU~l|L3zu* z5ajbev-8WVP~N+7k>%YupuEdQqv(ma?vH-u?fva!K3GQPe((1#l()?nf_(mG_Wgc> z^4@@pe7{3Md8DQMJ@^?NKZf;^57XhVJq76#{Yl`fUNjW%LvKdfzuyb+oA>1L$Kz*L zMA6DO-EaQSYy7)Q=<^*c46T}nnD5p2!*p^GV8=_5kMyQLn1{zZ@#lXt{Tbx@34iGD zpY%4Q!|!+lzT*y@W4+vlKmQ%~!|z}ki#}c)iavpJ{_xKtVwsAMk6tkpeHRb7181I! zKbFVw%x8w>z2mB(=qgU2I(&IP?J+!mZ1lam{dwZB?KqP&!_h;Ngk8TVdO+$-_WJtF z_4P3y+1<82Iu}3AjLTSWw9l3xeNp_IKQ4$KhX41)=hoZa>QzCyjNd;D(tN)YSV?wV z5V1V+joop9y<a}ArwjZA!(rR0CZ~oY?xvGtIKpBc9K#WJj>$1>Zx^Q7lapgOy2YN) z_Hze&NOBCPdMw+6JGJB(PR+c$9`;<OxzkCGVcV&MX)IR3F&teUq<H^mCXK-x9K%Lw zCnts@494IXjwXT>%Oj<l9K)%Zl-EfqCdY7eRg%E3VWZTNQ^Q7Sh3Tu4gykotlN`el zDV5|HHcBH*&nF4|8jhNobUTygN}C+R(VirMU&GNtCe4*9IfiYe3DaCDl4ICr`Y_Fz zIyr`IrVZ1#Wm<eFdTeqTzm72)FgZ0Gy*EkV*Rj#}Q|aTPb>Rd7?$wS|`uGTBR&bmU zy)%_QG5S_2eedYpa59Tdil$QOlcU>H=~JRVPNnY?eIb>;Z*)pH>0u_kG?l(zv@eyu zfAr#1`n2d%sr2d5z2muopY?!fG?ji}bSRZRBYI6LeP;CeRQjyw^y7l+i5?VfPo>X} zZcnApiC&jVpBsHKm40w^YCx+-(L<uqR5}+erPAj`uSliWMW0Ef&ktV?{q^yg^sSk6 zsxgs2)fh;pDif(xWgwmU7^G7#gY@y4=fxAVogYrEtQ=ophy}+m`crreM<<6#<Ub{o zzE387-%L80nR#J2B{^gI{+axzWzwf-(&^Q5IJMJad1qwuCo3Z_45v6NOg|`-|LjaU zq@<ajt8H=&M__gZ$1wU+cnn9mFp2xm%cR$3(&tB~qY2sS{JUTD{ktEcG*?QdFHjS+ zW$y=iqKq_uyY%<(-jYf0P=2oI_s9Bwz0yb;-Lp57zAck}ZYKTPne@vt={F(GXMJAJ zdl%APcFpI1IFtY5NPAf`uYU<?F9&D(+nM}7$fQrghkN-q^PkR&(81of3283_=k?2x z_Hu8gugK(|%%tg5e18AILybZuKYs}Be3nPr(FL7oWO6Le{|fxC7+ugLmiS+p|5c)! z_m@WsBfV0!Q>(XXjbf|ZD^x0lYP;6ymW$<Tt=wo8+m;O`8SvjUvUj9D(k*n#je56I zgM|g6PxRWjz16M28%48<&=gI}-!|tW$Pb?nBe1`3=Bp)?-!2s@y>hqSsrL%KZnx5? zv|8nY-7()hu)Kg9ilvc8rPJ+}^A#9$HhSGsvsEosnuSK8)vA>`?P}HXQ$u7C`Ahf$ z1i~m3I-M>oL7T;9w_U82Duq_1-YnMhy;j5LhZ(%RQEjBrts+CURc{rl-9ov6;4>BY z#cq`I<wmX4b>Dy|z%e`@Q64EZi};7C$+wG*QmfP{cALd+y-}<e;8eToUWs=0%|rWE zoc$$ktd0~qEo4R5x?TsLQ?KURsJ2?KSm+=oOBaDo*akGOMDF59qt$NI%W%$JE_5s1 zVzW`M<XfoaQn^{Jmy_3WA5tne@b$fNyV7d*dZk{oSgj)pY`z7%*kZlYY_!WYD}SjA zO#^;;b)?toHTcE(vMG6Xp)=QO*4v#js-u8bwfts2$`>k)<U5UWqgt=FTJ2`1Q>YdT z<!Z50?llX&dcEAsRBbsw(nk5kZmZR8BVtUe)NCVYU!LvJ%fsb(r<H!dNVn1Mw(IRi zzS%;STCLOQl^cz2zS`_Uw-Fj&tRMeA_54V$*y?rAbGnUQsf<2_V7J9~zSe7Y8m&qf z-t3v*ca7pmx!J7Oisf3dUhKA;)pi}7z1Qe;OQlY|(^Fsd*{kSz?MlAaM#t$D8@*P( z-R^Zeoi;~CqtLE2>Q+1*8l!el`;|_!R;X6cAsVGxi+2=T-CniZL0C7mbIGzFwqU|t z=*ln8A6&+b)$&Na-l^5{%}%k`!>}n9iaoofhc9S1dTNH?MmAn;q*$moTBRC{ozYa) zYPZ@hl$&TFv<%d+Ivw}8R&yEifv>YlX#}0NTdL=a=p;SN5vcNJsnzM^tNCuZRBF36 zJPch$e@~S|s@QH9>#b@R71618OPzeZT`IwaMzfl4w)JJWr)j2_c)v<x1n*TWHCQYj zfm-a8yZLsZU97Ybow((1S~g2e-hu9wucL;m-4ZIT*R8kFUd3{&Q*AUV&2Fvhrl`Y9 z-96M!gw9U0!TKwVU>J5=)ncn&snwf}Vzb_AcJYNhPGhZ7Tz|{mL!CvlvE9>d^UnN8 ztB4lOcPkwX_$Fed!}&nDj2>956}#Oc+^(|&nVuZ-7e{*CHb!czRmH4@-rwz&3bk^* z-9|i0d?!Mhxc)|~FyzPN*lU!l%?`d6tx`d@e7l5hk3xFwaw{KCESie&DVRBXJ$yu` z(kVdAs9mU3%Y_bRF4SPH(CTHLP#r<B=+nJkrPwW^!ZBl1FxAzYdAuA(g`2OFxeIOC ztTYPEa;wnkHM;m@jGaoWo^RB84b)mg-3D!G^J%>_(k!D5YUOILQg0PIXzwOH_mtYT zE~a<%9M{jV>cGLx-kbT|`4J4T9v2KuYgi2MhSg?+gP>fgwA+QQ?=ZZF6`L=Q6nn)= z9e2QsE0!B{<wB=k>7iCj7~$oP8~Ur4Hr!kuY1ZqQ@6aU0b`=wUtJ)|w3iUQ7;{qq> zYP3*nqsy3sD=L#x!!;FYG^_E7bjqRp!hwYqyOHDKAewij=M7*cO?@)<o@GWcW4%2S zxMQKY4`JLH!erU!p6xDoSA1fwyD~Sn?*^C=HkVdp#TJAFIRuNV?!i^wK9*M&5BkjM zSD9)qV_KO*c(NIU{X$f7R9BwXp#Fg_18q~40scqZQ_VfNWf`w~)56LvvGwTkjY}&L z{KXz1X+m0VBj}90=#w(=oZoP|0UN=HdKAwCx9I$J#AiiO2e|R6k?~nK0S_v@0%V%p z4_?1RX%rc4e45i6+ys0H(&s!oir&EUApPIMe89Kz{BK6l`*<GtKE(6DkMjI;K#%GC zr*!^HJpWwKoY>Bs^E}W~#OLEr>Gi_0@KM4^;cj7vi2H6Mf-(6Uz>O#4eSw>RVA<Mx zy_|@AUn1gpo3L%#h^<H-xCvMXp7TP`kvxz0ek{)e_woFT@SQx5t;$<@9{6saNB%GI zJo0^w=YikldF20z&i_p3Pr$b9oc|g{>xp=No{0C^Li`=bD}WoHj`s&{0=|RkJMkQ* zf!}5N8K8@q2Ih`+`7Z!6|E0ilUJO1l5#`SiQT{<9%72dV8$dqi+d$rTDz<}s4)@4> zPMv9#e<{<zw*YznTki$@U9>Cl_waYTOK&0~jnmOFr$x5gI|f@O@>Yr5Z4u8RqAs}m zA)ZIXR_j6{gk776$X5|wDjX9&TDV(CE)nzhg!_dnLhhP*{fR<+nx)Yd4bfE$?-IUN z_}_$I7XFj)O!OO;cag9v+$wyG@NvRhgijZ~Q1}Yrp9tS4{G{-k!haK<gu3E$&k|lF ztO&=1R|)5Z`-Qg(?-agJ_zK~hgzq5YkNukXKH}+7^jAbY|MSA{3)!!k4;xa$V~NQB zAR_WVOvrxDd}U#sh<ump`c|EPv~atw@7DF6a7FkB!dDYf?(2kaB%<86>-vX<pB8>y zcpCb>)h7}6pDR3%i2ED5euZ$SkUS^ecN-D+-64E35%;}B*U5`wzPAcLAmn)C`5zN; z|4)T?6LJ3;7-zhGp|B(z6;2DU7v3OzhVX^Nr$*5qDE)dO<|B?@mirze#`_19{v;8D z;xkHrorv*n;}|TJQ`ztFo~Sk(rza4>>cFd7c{YyuzD$GVaf!~?g`0)ji04Gnb|P-t zK?KX=IwDvdZ6eAcSN52klUp(UM4f-85K~%o%z06SDJVK-T@<}s=l_U!eiXf#cmd{3 zB3|l!#D_-F$A}k2(I<)P9Z%ty4N>$JrXPlRkcj8~NO(7KBXrC-{xB)sk9ctuovrbB zK5+#4SW4H3`1ny`9(o|eLKN-N^?9Mq3q>bqJf;*y|3&AYN-RgwZxS*2**pPx`0p}Z zi=x*MQK@ex;ywP1*uXd?J{;{ye1zk7@H_sNX-uAIPW!HtgnmB8l$&ZlRGp<!C5FBo z{XC4K?fj_l3gMJ+PI!&b&&yq<tzGe6H!6Lz@OI&ognoVo31QFk^Ye?9eyQ-4!q*9{ z-BJGAlzx}+{ldQ#enR+Z;TMEo6@F9r9pOI<e<~bez2Z5?3r`WACOk{{5aETwjY5bj z?SAVoDCaVz$AlBYY2i+xUssw+?-5cTi|?~6^y|$Nl%`C8*PkhTuF$VT*1vH5Wjg<A z;p>HdeR{jn?-71b_%WehxBgD)FABdd{Fd;0!XFF$`Zj!wd(RVv_Z2=sc((97p<n+l zR=Ol?2rn0o3$GOV_3>(@uNSt33&KU=A)#MCe_iRP37;i=p73{szc2hl;cJC&6#l93 zox;BmepvX|!oLxIPWWZvKM4Ox_ygg;2=5jiH|*;5B;oypX9&*~o-f=WyhK<LK0-Ju zyh1o7oD*InoELV5HwbSO-YmRb_$1+-!rv6WKuB2;`|(SKuN2z4kMnO<`fb8@3EwaL zOW`Mko*wvu(q9#RQ}`X>KMQ{<9O62S=N&IRMVO)|aQz`Vf1z-rupq1nFB6UlCxp{N zPj@^<>85axaKCU_c#H4}!lwwIDSWQ*g~HzzzD)RP;p>HeB7D2>J;DzPKPLR7@b83Q z6n<U!E#dcsM*pCm{!Qs&EL5!56NUE`K0tW3@I2u~!i$BTPHHH9xo})~rSK}@)k054 zwUu5FE(#9`Zx#N!@M*$l37;qY9pUc_|4{f^;Twg2DtxE#FN7Z!{<ZLLgr5_BS@;ja ze-i#c_%Fh{g~x%AW4)dvyr1w4;km-|g&Ty_i{yP3;Uk2Uaq|2X!YSdL@EYN~uq(Vl zc%$%U;qAgF3GWpCrtk&A7Yko1e5LSp!Z!=wCVZFh{ldQ#enR+Z;TMEo6@F9r9pOI< ze<~b0-hKb^!c&B&3C|Kz*2a3eP`FW85Y~j33CDyJ!fD}7;bVkN;U3|B;j-`+;S+>U z5k6B$864m1g~HzzQufC4uNJ;u_$R`*3*RIBpzveDPYVA|_(kE@h2Ii>PxxaYx~V<) zKT4mXd90jMgnoZ=w$kf_p1%EgJ@;2d7iZu9o_;^JC{|zCS{Oc3I4+zNdb<8vrJKUN z!bRatLQl^>S?TP1X4C(>`;nhlIY(;0e)Zb#`4~c0pV-nGK2(S;o29YEGxX2htn`F% zMtHUG*Mwc+KH;+P@xoshK3(YdPrt3S?U(U#FIW1t!Z!*1zUkdce^B^W!oLxIUiekv zKMKDm{E5)^&v@RwMCbc`(&<Y3eKd8NIPYu_=7oNL^hl-0h2;A(|C|sed6xG3qP<FI z+b5gO_B*g5tegvl*z#MtB*Yfm(xXD-XW%`imEI-1Uf2=(eeaUew+QbLK27*+q2KSm zMCq3aUn6{@@U23>&;5YX9}|8`_&MQMgnobfU8RpyFX!IFeCI1aSSnUu1z}xyxp1p+ zO1MM#7-37eAUr7ae1rd@^izbtA?)`({m!4E`}}wM_xJ0>CAwY_`f=;~!4*31zr)X$ z_mmIP?|Yu7^8c&wrNUPUUoZS`!gmVaC-i)e|E~1k3BM%#2jTw|dVa^xlpfZ2y0_5y zVCeUr5AOLK57qUHg_PHDoIXOhS?Kv2GfH1A{54@$2$M*=|DLwnud3huzur!s|MYmZ z+pi0~+{5^q=npVWuy*x)C(7g4PhKm0lkjaq<8R`+=QsV8&i{?@p7xJl_PD-X<LF7k zJB5CI_VfLVb^fKoR|;Pze6!H6(|+E6zs~z{{t2Z&E&PJ;tHN&zza#YH{ijMFqk272 zNO>&V=M3S4g%=7p2}{C<3rB_9gr1-2`Qg{=Jmt15{|4cb(DO0xQ2J@YXA55-e2LKW zFO5%*^4_TPZxy~vXnb;9_k7Dw>HOz}UlD#&_+6prSN^-w#~tI|`()v1!UqXGpK`s@ zmk6uE%Y<8mo<BLO^ff}tpIJY9ga?G4FL|5NPZB;u_*~(Ogq|Pi<$bTydCId{{@aD` z6?#78$CduH@b86R7k*pl`H%mq^w6*?m-23we_!DPg`V$tfzlg=MPWnuD52*!np_a& z?bP|}gl*yDgr3iMSm`GSpDKKo@cBZ|Urfmr@tim4`kxB_T<H0VA65F3!p{o7Ec}Mh z^Amrh^uGy@J=WC^+&Wo3-CuZ?kn(-j-$lX^VMR!JKd*cK;iHwlO1N7%FYF0D-*83g zTZK;)-YKNM0L%CM!rxQ+4~2gue6#S+gq~0MA*KIX__x9@2)`!u{K4-l{Vzfau=xDr zh4&G9zTi1ZpD%ovupp!!1Mm0zz^zJ833mtqmhU8Cc7O1zrVsybTSta8PaZGy`@hqa zK1=B7N57tI)cJz&Ke`WGR5>>ZZx=pU_)Ot%34cd;m++OsKNfm<*gKT|3*kqEpAddV z=;dJlL+O7K{!sW+A!Y3Br(XVbs?ui&A1u63NWCTIF9{zm92IU8P78Mly}YZV^bNu# z;Vr^DgkH||Y^7fye2MU7!q*7Be2e-~e7|=IKOp>=@KZuB*ZPXm-xN}RiueCm`0qk5 z&pKK2=V?N(Z*rc})UV?Gmk6uE%Y@Xo;`J+qvqCSwdaTlWga?F>rO3-0B%hKUer7 z;qMDyA@uU9w<!H~;d_N%U*+RUdpXtLEB$rhw}n3t{;SZ-r)X!%@4K(?fx>fz)EDFR zjl!a^A$*kZ3gLF4mq%TvbX)j1;f=z>LNAAUs?yIAK417^;U5US{OJu!|EciLh3^-B zROsbSpH=$HLh85i`@SRmk<iPVj@7(>lJNe*vxGUJmotqhT@g|*j^&RDA1(CqrQJ%; z3wy%-!WE&HD?L%^JB7~?nm!Mn^Lt8rdD0&#{bu2x3Ew09kkHGK{#NNP2)`!$mhk&R zFF&FJ5Wnwu;eCV;5S}CSa-)YSjbiM+U(`CfUFGi-UMFk|A1Ay~*zbM%o%j5pe*C~A z-S?lBPI$NK^Mk_wTlvEOpB`}I^Z(NWt{(og(*ysn&R4%E{@BlZUvru0|1se`<&XcW z_^zMV`+imUkHYT>e<HkFcrVfKrwC6Mo-JG_+#t*gYr;ng$Ay!^IpMX!rf{#&>+#*B z^zFhY3!f?cEuq)nyG!X;3hDcR^w6IO-y!sRdmmBy6T;63zbO14La(p)L#2NzJVx~U ziNaHbX9yoGyimAFSQ0*5I4ayGoEGj9UN7tjy<Xmu(zgij5I#-#Y@yf3dx_F76TU|H zM&Vn9UJvgBN`FlFDdFdYUlDr!yYDLfW8uFGj}sk#vhXzFgM{Y^*9$KZR)v=dw+OEk z&I+#)K33@U><%b>NND>1=nqd)`WZs6U-u%Ve_!|t;p>EN5qiD4_bUBi;m3ua7XH2P z>q2iw@B^j)RXBtRpZ)X%q1U5(pwj0GFA#1N7KIJrql8xo=_`Zf?iA9_o@uW)_c*0* z6do2nLHJam*Oz;~(k~Wzdxcjk{RW}ellya}-!J^A@RP#N3cY^ZH<bR4@JGUb6CSJm zir0&~ztU$3bHa;+BSNnacd622!bc0Q67CjyJ-D9I`-LmQTZK;)di}TODE&eqUfb&X z7qzeIC%=BIp1VhQKzK-aoA61(U)6ig>-k;b4MM*U^m+sLl#lucD(BV0?DwI0tX)nK z9!c-a>s@8b$?}_zbp7YG&pgs|`t5^D`rdweF-I!*=k@+`dXIamZ*jE!;FqO`^J9I- zzYC8O-E^|h^UWWm^m)Sd!b^lzp{FaiD1D`HR(Or@vBEvV1H%8^eqGc1KT<d@{EzAr z{%7e=|EI|Lf6@CGqnkk6+I)DK^D9Uhhs}RTm)S3nwtj*1jMAo8iu69EpG-vB^cs=> VE~Q_t>+ewd-AaE(>CY?uzW}DSjSc_+ diff --git a/quad/sw/comm_dev/Debug/src/initialize_components.d b/quad/sw/comm_dev/Debug/src/initialize_components.d deleted file mode 100644 index a8b84eee2..000000000 --- a/quad/sw/comm_dev/Debug/src/initialize_components.d +++ /dev/null @@ -1,133 +0,0 @@ -src/initialize_components.d: ../src/initialize_components.c \ - ../src/initialize_components.h ../src/timer.h ../src/log_data.h \ - ../src/PID.h ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/new_comm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/mio7_led.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/commands.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtime_l.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h \ - ../src/control_algorithm.h ../src/sensor_processing.h ../src/sensor.h \ - ../src/user_input.h ../src/util.h ../src/controllers.h \ - ../src/quadposition.h ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h \ - ../src/packet_processing.h ../src/conversion.h ../src/platform.h \ - ../src/platform_config.h ../src/communication.h - -../src/initialize_components.h: - -../src/timer.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/new_comm.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/mio7_led.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/commands.h: - -../../system_bsp/ps7_cortexa9_0/include/xtime_l.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h: - -../src/control_algorithm.h: - -../src/sensor_processing.h: - -../src/sensor.h: - -../src/user_input.h: - -../src/util.h: - -../src/controllers.h: - -../src/quadposition.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: - -../src/packet_processing.h: - -../src/conversion.h: - -../src/platform.h: - -../src/platform_config.h: - -../src/communication.h: diff --git a/quad/sw/comm_dev/Debug/src/initialize_components.o b/quad/sw/comm_dev/Debug/src/initialize_components.o deleted file mode 100644 index 73082cf9c06fcb6023be2222943a440382091c9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143748 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	c-DnW=eejDrGutiVs00kPzH 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¬<q~_pclYku;oI>DXDVMv7g7oS<ldp$NFP1i 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 DvvBE2 diff --git a/quad/sw/comm_dev/Debug/src/log_data.d b/quad/sw/comm_dev/Debug/src/log_data.d deleted file mode 100644 index 08ce63ead..000000000 --- a/quad/sw/comm_dev/Debug/src/log_data.d +++ /dev/null @@ -1,68 +0,0 @@ -src/log_data.d: ../src/log_data.c ../src/log_data.h ../src/PID.h \ - ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/communication.h \ - ../src/commands.h - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/communication.h: - -../src/commands.h: diff --git a/quad/sw/comm_dev/Debug/src/log_data.o b/quad/sw/comm_dev/Debug/src/log_data.o deleted file mode 100644 index d58c40bc0833910869051a79da618ec528aae5f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120284 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 diff --git a/quad/sw/comm_dev/Debug/src/main.d b/quad/sw/comm_dev/Debug/src/main.d deleted file mode 100644 index 3cedd8678..000000000 --- a/quad/sw/comm_dev/Debug/src/main.d +++ /dev/null @@ -1,138 +0,0 @@ -src/main.d: ../src/main.c ../src/timer.h ../src/log_data.h ../src/PID.h \ - ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/new_comm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/mio7_led.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/commands.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtime_l.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h \ - ../src/initialize_components.h ../src/control_algorithm.h \ - ../src/sensor_processing.h ../src/sensor.h ../src/user_input.h \ - ../src/util.h ../src/controllers.h ../src/quadposition.h \ - ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h \ - ../src/packet_processing.h ../src/conversion.h ../src/platform.h \ - ../src/platform_config.h ../src/actuator_command_processing.h \ - ../src/send_actuator_commands.h ../src/update_gui.h - -../src/timer.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/new_comm.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/mio7_led.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/commands.h: - -../../system_bsp/ps7_cortexa9_0/include/xtime_l.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h: - -../src/initialize_components.h: - -../src/control_algorithm.h: - -../src/sensor_processing.h: - -../src/sensor.h: - -../src/user_input.h: - -../src/util.h: - -../src/controllers.h: - -../src/quadposition.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: - -../src/packet_processing.h: - -../src/conversion.h: - -../src/platform.h: - -../src/platform_config.h: - -../src/actuator_command_processing.h: - -../src/send_actuator_commands.h: - -../src/update_gui.h: diff --git a/quad/sw/comm_dev/Debug/src/main.o b/quad/sw/comm_dev/Debug/src/main.o deleted file mode 100644 index 0c7b5537899499b352c725f6b0c0a718d49e02da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139420 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	*RPkZQ_WS+`<c@FKUTW_ ziPH5?mac!gbp11>>z^xK|9t6MmPP(^!7PLH`p@SV{B<Gw3#DsGul(mi_KW!ie_b%m zHh<}YX{PD*FXb23{;!m-|7z*_ua&O<dg=OCOV^(-UH@9?TAD@vb0L#vkpEoBelx$| zuM2iE=PzBblQq5mt^C5;OM2!%7wlw8uO)@^p9@ITZ_h9J>xqJIT9Px>C3HuhE3|)8 z_NBu0H)LNeTz_M>oC?V7%~`*2{g&((3)gSWez$P_w(MUNuD>aJDi!9SzFsa|e{=S; zh3j`@zg4*Ymh7JvuHTt`=Y{l!zcssBxc;{6wZiqcXP+-zzbpGkh3oIg-lhX3{(NWl zp~CgMvriPR-;;f=aQ$7`KPX&(cXr_$VrTsEJz1}C{k_?}!u9uM|9;{6`?D_>u74nV zd!jpJStYw#xPEW;pm2RL`x}Mp_htXEaQ*)5?Qc%+?*rKn6|O&+y;`__D*Ky->!s`~ zh3iY%yQQ?mpQp3U!u2!Rj}@*jXTMpvem46jh3n<)+uj;G<B#XEtA*=o_IlyEmVLf( zUC(~MaNWq>K@2bdX=X1Ju3On@;kuoDzHr^i{`<mpH~W^t0pH7BEL?vm`<cS^59VLZ zUl+2!SGxYsOV@?XL;J$w=en?XxhgC^t_zEY>%!!7U6?$s3xm&fVeq&vJUrKhhvPa? zxa|49x%52mC|!R`={na;^u~n((oxsnR%&0AeiyQLmEQl3(sioItG{=b-j@cS|6C|U z($xOD^EdhHf}sWSmo5}M?Rx+F@;9wL!M^0@LiPj6mD*QI*Y7P|Uo2g}uXO$X()9;Q z*B>lhKUKP3DqUYHT|ZsAex`JNxpe((>3X?z{aop~TDq>4u5q3xKNqq_a;5QWmabc+ z>vrk7Q@ZY!u6w2HH1ezO`@!t*`Yj+V$+uxI{BE)(w3@$Ey8cS(`VULj|FU%bP05zB z-Ju-a<ze>zQMSCfTFu@+$X>hGT&^uo8tqZ1d)VpK51W&kIL?Qi(YQ&4uTHafSRYz5 z3VT2-vwUZ{yF9Lqn!WD0)q%7II-bdpj~|X()pl*rhO5VQODfOg=r-+ZUGUxY>Y&<g z(EqSOhI(_{9d#$Q$#~rAwGI!PHTwo?oShx<fqG-P*BXt-%_^Y(YHu=b3=Z3k)}Yp_ z9UgWXqhY&k?S;fYp?!lVfElP(8;!;gc@FA>@vz=$v}%W~?tr|L$zd<FhgjL}sI%M~ zw`tHm>>k$I<65&ftTkGVdW!;Q&0eQ5cF({!3{Le7jplM=Q0G5}raG+m8i$QheLSd- zyFKy~n%&yi-IAD_2M_K-`c9tB86Rvf*G7jlZFOst5s%YtSBDH+XHu_?YR%5L=N?^j zR<y1!_YQ}>ZnInOG;8D5xIXB?k9o)_H=2WXx0&CTdyq!6$J0-m!`9(oGHFZ(^>()h zr^+F;ruFV<&>J>8_UNZ$Fy(sk_VVO#($f=Ho0ix+COL01=nh9shNH%;TKjPOOht9n zYxdgR_Tk|WI=xyOLicuk)SL`zlWw;;DGhD2x;&)+`uOm0JZv^=hmFCo-Dy=dACqdQ z-5MPhzhHUX8;*zFVXrzkq)DeU>P?!x-niNxj7b6|V@PW>+)uZ<JgFZ}My#B1Z$j-+ zc%eGg`moxW3`V`f)|l)pwGT_9zT6xPx}AEnQ}5Qt!$Eu4WwB3sqj94#>W(IUt%l}p zR^G5xoeWtxlX`D*SRD>0<I!lSozbfeTfJ`R-tC22mjVw|1ZXh1!^3WGFdVhI!|H^G zsqrifvm1ZDz%RXaZJC`inRExeQEOBqfnZppqF!ypN*xSao!a5VzG85fH8Ehyy33;p zYpzpmFqz|FW88)atKF@)4r`3nxZNHVZ>iN?Za^XrVbgHH05;%%U`sM>HFk1$zy!AZ z2gD6!Uof8Zn(e`;%Gw+79KB9;*kGoHquONHJgkPj5ZbqwX~dvTCawCo-l^4DvMu&n zcTgQq8cd557#dW!=&H-T>LE2_C#_ahb1-Z$vRzhPgJoN-jjQgC;0)3pXf98B)p4!U z>(*<-X1m&={{h2A+566*IcnG33VIl`s?PfNZL2kxyWLTzQyq-BHDpn}R-cU8twv|U zvKaOzer+co)Q;#Z*K6J0VWR^9FzdhF9=C_J=743-awipP<i__Qd5&QfGKURT$l;(m zXigeDcbm>f)p`SlvetMAU8`HQ`V47C<5O+DR&SXvs5g4;>KJjuTz5y!adlW5)?33S z12k;dygWQRADlnX1GU(E4AXej9yccK@nqZ`vYPA7!%@4}YYoPou^YFCr{mj7mn3&( z(BpI59t&oC*sdRTTOCHOKIk3}#@%XtA|Zd+hy!spelR-W7Vq_M4~P0>b@{N)dasUK zBgEmLS!=+x-E6Wy>z(>|O#YSKqp=atzP>yevr3wWhizm!ON;rhb(-BFYpBC>*5hvU zViZX|X!UA?=3#9#>5b{1ZQMHSR(qXEk6Y~JgKeU{+gKhnd0<xjq}4sFkJ{D2fCHu3 z7<R@i>%%ZR4+f{__s{xwUgNI1o#pX}5$FvjoyOsW{a9@wypY+49p<w(Xt`bd(0zzc zKx(#(9A^{5ZZ;Y-$aUtm(;V?lY`iw)XKr#x(P7hEd2n=hG(P2ny=86#ImLDvGgeJ% zrnT8LbwqN#T5Got-LasBFb<`n_*kd8JZA1Yt>L8GvK87Iv24e+VQoA?NOtRCEes#r zJ{r2ms#Osk)mnoiq<Y9_Tgav6WPCV*y1IrGt+gk9XPnum_?~*Lwaf{{>Dca7H5_b( z?xe~BWLZGvHt2NyfZx7<bP~p|UFSoR1QQyzCT$j9jrG(UA%2=&DBY_5?%anoew-5s zo9?8^^ssrWBT86|4;#bDXuzp5tTP90;gH=lI38(r*O$k`!zxqAuni8ItTRZGo9rN# z`Q%Un+CHH<(l>OLyX`J3bJS^%2K<kWQ|pZwi_QSq*<oL~-D6dH?(&HapJ0j9+Rbif zP-UbhDlgg_vZBe|s%!uFPux2lQt#0|)8M$Sa!$864jbIasMnoz>pVE?X*?Vv8`IC| zDXNX-Zu77^9#1CKNvl@nNN#ZgH?@LloXLmHrhUXpJLm)T<=Ozr+^TV$Hb=ulzqkM2 z_U=8-rgDGa__8B8QYU_LgmRmtDPv~LWtaOTcS6b~v1euvVvO4qA@?MQAxWhnQHV*7 zI+9!JAf%GYExDDb97HY&=lgx;^F953`}LaFMC177^at<PckQ*-UTf{Oo@YJZ=UHp~ z@<+F&HVdT4pOM!ZEH%)#i_9(+e2nZ~WNeJwbNHj<617r_N(@SQ;EFc6ZE>^z^5C>P zw(+w2!RYv;_^JW9H3<0QV&kG>lcVI1`UU(k@&5Se>?<I>Z&%%I`SpUyDSGcF*L-5E z6uNR#5EbQ*^h+@q8=Vx8*N^HprAtvJkH5(q&UB&3DuG~3tUT>3e=jglH9E4IT*&^& z6sh=P0<l#SWmDZk{SpIx<P^5DQwp^x*%`l70&>{oAjCz+BnIQ;_COAm+>iz3;Z*&u zeqFoDTWqq=d@ayq)l%rmo7$rSk#T`I`Rn8UfIk?Qq$Qd>T>QV5(QT_*tx8l%RE%80 zeyMllURH|q$mDoAnXAh2PEM(ooP9pZmvl_+neN^{rw79wylPbf@$qsqB_&!^Qmoun zO5G&~Lyo4bMDPB%{dBK9?AWt+T9W)-v+TMwO5T(x^=`bB*2z+2CTkrWjFZz`P6L0u z?6myB0o}Wv-2;77(&X<-|NAaEN;Wt-CC;BB6;GTTA9>Q%9}|p;lG4>LRgKgb*{|41 z4W`Pw+C6>HwQHbz*GGf$?yH2f)ShWQ<PNWo{GBNI&z)=XpsHLt`pTG|9^0sY#v&+x z#3GqFf<2P6KleOs{gqzrd0(h&Jl7u@E=~Mn65l4C)ama_pNX_pO0V_Yc*xT0q%TS1 z_1R<NebU6&CWlX&=GURNqBSn5N(w?-wW_vGebS`YR;Evy`r7)_`LtE0YHLZYgAMRL z?10JG4SS<zw{`guI3AzDOw=r@&bJCT;ch&HXRxsBug+f*E8$N37LTJoQ=s#g#R#m9 z4N-HMI$sd`U<PL5Yq$_U#XWc!&tXwX^SJNFDp(yGVH-@rzBmkZJiM-FD$c_txEepf zU06JS_Hq?45}RThd;*`rnYa*_qvl9;JGS6HJcd3=Tj}T3uogDKcGv|+;8XY_zJ^P2 zJ#NDTcoGXrdQ89fdJMyAn1C%YfIV?Aj>Alxhf8oBZpHn00<V;7Rkx!!R>Wwmi;0+u z{c#jd!Wp;#SKtQRjtB4r7LatHZbvaJhY{Eq+hGuU;SkKgshEXJaXoIs19%b(N*dDr zE*OT@FacX)0DIzK9EX`W50~Lu{2ce;52)!+-HvPVMy!H0u^B#yJ@7Hiz$rKz7vUP* zguC!C{)~krSESoh5+krCHpLE@ii2=0W?~jDN6lU7`ai)hR4J2oq2{uD^6y(!<~xOQ z8hbuDW}2_k`K1_f^@RMKo=++j&C=@pt{xG?G?vtE1k*JOr=Qow2CAfbW$20LlZEe9 zrBZr8m6UFhD)V<!C8e8AJPgO+L{(C}uHKN!Y$ns^sgl}VsFw1)rE2Ny@d`fK$PF4x z>ekgOlCstM)mPT@_Ne7N?|W6g|3^HFIxf;zUd|V_!Y}nrd5tT|I2BcPK2p8e^Zd-G z&tLf}$+%Bd)_WfY)LT5S3vrrSIeUDM&No8iTRrbdHQe)LNQGN|sw$Q9Y*kXSe^VtD zyNu6Q<3=?id;FHKs^`fgCvN$Js-$9FeJCl|a~jL~uk?x0+0WAXs!9G+;~44XQYF=T zvntzF75!LOmDFnkRetPds-#-m@OdXy*58|W01j8>red@zT`3cpK3%OY`={2(9-pb- zyO_^cs<OT{stn=ygz4MWTAsICt?jwKMPD7yJHqEb;T3WM>-w(7;&>xg!m4Urx$hya zk4@DC`5jf+jtA7cJTFnL=Xu>#S--2V@AkaG#5(@gSKsr-sd5oKtv39n{?@)sU2eYG z$n)MNephYmc^?vQ!96I|om;Lj+I^l}I&QjMmlcTR6m!!fP<~<;Yj2i*zZ^2BY^t*< zw!*g95rfzbd*LHE2#4cn%)m)F1*hXI%tCiP%l0iMUV*D{J#NI!xC8g%0X&3uou4Mo zr`LmgkGtN*BE-ee?lW&94#RMC*S{<mN36rSbbSff5SwFbY>%#7koh|k>+@Q=d>_>D ze;N<QkvIk?p!VhKe3>`{=iq#lAy{s{CAbpT;0D};TX82^xgw9mxb+-C9V?*Ue+IAM z`YVJogxq~DLxY{JoRRs<5m&<7F&eGhsYP558)FN!`}YpSN!S(BFdeO28cIA0$D)-_ z&k;|<mvJsGKppF#`@am|!?pMkeul36lKEZvC4R&7gLo8Ap|vLpP!1Hv>#zit!3tOz zBQOT<#5(wY$~)PfR!nb;9WjXAuovoB4c-4iI2=b~22R2$I2~tU7B0laxB^$<dfbSc zaR=_j19%93#M79Mc1uAlg2k{T-h^Qoj@F)vBd&o7*btjzYiy4J?2M_{2m9k-9EoFa z0#3$EoPl$2KE8=da3!w64Y&!n;!gY;zr!PV0?(k1oze555MGPLu@siWN_aa)qmH@J z^;kQy9&uxAf%jtvOv0|1hUqu}hvFz4ixcrVoQ5ysTwH*Qa2dXbYw;ue47cNM{00x= zQ9Om`umJ7M!gw8)z%p0?E2BOKr^hh{@5DM-ADdz;Y>OQ+h~2OkK7xaAIF7~)oP<+w zI?lo@T!@Qt1+K#NxDj=1l<waS+=~bB5dMg#F<-&#<qBdEEQTfVCJaN(&FS|=VjR}M z1Z;@Su{E~G0Cq;p2lOGfyue`MkvIk?;AG51%Nxugo{w+h5?qOE(DDkKh_~WS{2IT* zBlz#U1NT+G_5M_T9(R0;ptU<o5tm21zm?0w&Hr1!_fp*#hi?D*?!Pqo-2O|`%qdMJ zXFY6!c3<C)IDlO+4If6kpC3USx}Bl%g|<iXYCXCAemNc2oW5UD4(>Qg>cDw3N>kj$ z(sXv(_tqtDi1*<A_#g(cJNCgxaVS2485o*BpUL#O_&2n6(>ug#@I(9zT|Pw0vAx9K z;t@QF=kQAI@2#EmKg6Zb<ws<Fm5H@~Ld!{OAJrtThfS~*wnJ+dS-vFn_X&+d&$}Dh z-Y}FDirbE8lvIR^>!38zUECb+!w#5?-O&0u`V$YqQ8*5*z54?3415(A;9F?z+||Sz z@KfB5d(hgqhlz7LE@jShz6#7QsVR4SB2iL5F0O@lV^h2r+hZbj#hz$+gU5(R;$JbR z{mE&136`_{wC%TgB7)Cj(5_oM59%}B_QT4{^UZ_gv_BJB|MNH<XXAYQJ1)b2;ClQ7 zx8g4R2LFkc@A#Sc3a+m|;dQ9*SJCU#@*Fo4-;UMrPOOWT-?)ePetZyv*d0TEx17r3 zQfzN%J#Y0~=z8q>&uO}y7gjEW&KDZn`fRz}KEKfO?Q$u1PVjr3#RB}^SEJ?AZXhm) zE{`tfT?BC~S{_Zu=IVLb7+Ydn?1Yv->p`53193RI{JN~q@@CI6eHy-kS@;H8zU*D% zwfHe^#xK$GWb!H%xBW-)C(P%|o_-Zte(YkMXL(hw4dVA5j-xRHt-hN=JRL9B{hG!8 zW#K}!`!B1{S25kn?~TNpaR=^2tJe<^TRDE3*vENP2>*;F@J0;7+b|mMz&h9fEl+Lz zRvnn0jNPy|T7G&6@hBXJ){pf9vE`*-C0>B~ek#4rSD^K4Sw8wxrf<hRcmNOM2|SAh zxW4qAk-Gk3D6a@`vE`p{A&$UUtbuo-<(*p+w?)_QCF}1@+ygD&JdoJ+gUNhP5>LQq z(eli%5NF{VxCGxt%P)USycxg5ukm}dyt4I=>HB2#xLk$TqCT6a(=DG|kvJTq(2upz z^2p7ITchhYll3JLKZKS)?ni9>XO9z)Mc02O%Uj;~C8k?H+UvxNa5-AO_ygiixD9vX zezZLCapE(WKY#Y|D2zqX^223`D`6Fk!Rlyv;YP$Q(8l3(Bu+ug2lpi&fWvS!jz`M_ zPbGdC=b??~d7IeszwZ-&grDOM{0c4a`vdVQ)W_BId?|?6pyhi@6IZ}nF%sj^^1OEw zH^qBVaNkoHL+{fr^girT*N>N~9?3^JSrDyVZ})2@nQrX@t53q29*J>S6YF6UY=t?s z@6-7FVH|{RT!frgV~C%^=kP_Gg|DIYb1o%*57*&F+=4rCA0EVGcp7y~jGpJ#uPLvx za&ZZiSDm;x3~$3|yaVf?8%H7QYfgM0T0dqoaW}Ma75#~ap!HvlBc6mW;0$~ft>5x3 z;uW|WH=vDgwEoIHOh14&-th$SS+ssi8+TERa`Xl)hqqt^#$pY;3maogw0_A>#GSDR zrsF`g{>UeZC*ZR<4PQa)hkS#03A*ta@_Vf%{ur(Q@k`>b@q0XqKcV$IUPbwNEnbgh zup)+I6#B6?*2iXO{frL~C*ecb3;Ut<FFsB@7N5o`_!3&bqP|B^uZKlw<3v{xe}LAX zxQ%!>?#DxT9IYQQKjnU5EQ%$uEL#6z72+7IjtSTZt>3T>aYszSRP2k^UpS0-G>*r~ zI2Em*a31kOd>dEd`)K`xpA+xEukbtk0j*z99}9Q&E?$Ghu{2tL;H|{68n@hq)}y&C zZ+Vt5zQ^*fxh;3O*5B`N9M<6PH4pzsJ)M2s{83M5ABW4mp8jtwuP#>JDzDocmM2c& z{``FVBl@u1qc{|wzzlo_GjS%)MK>;6?t>N+zk_S=L;MWCz`gh_9>J4%4&8WdS$`4k zujLi6uKq5C<*_o_xa~ONnph8;U@L5g0qlZl_%IH_5jX~)LK`pnBJnJ==ce8yUWztO zavkwT+=4rCAKLiHW5lP?$9;7n{4<t78}A)Pd>cmN9ask&U~_cizvcLMAWlXb2icpr zKMuiB=*EG|@;3hQ1*XryS8)Npg*NWdp6}Yg^iOd++W2rA?|7K$C-5v5;Qsn*EQU8= zIlKiUFcxdzUDy~~Vq5HlHm<P;aXJpf;rJxlc*bXmr{OD@g>RsZV|<r*Eq;uf@k_Mv zi{BF;#h);r6!>~SeHGfc#p{X7U_}haDD-1(tdGsGH9mkgPVph)Uf2%@<Kt-K6Q3rY zg8J?;-R?Q~I@-9z<;1J-1Kfo6T%C<a+|TqwcpT4Qe%cW>4zVb4Ni2(%unOAv!|KEd z*a%x-8?<qUDa5JR7YE=lwDE@Hi6^6M_HSzMT<Ca#PJC}??1AYx5QpQX+Rl!Ae-OK2 zFMI^gxBu@YmYakBsr}3Cdva=@<~BYkxAp$s+OMI%&+Gh7i*Pxv!Vhp0Zo}QU9}nSi zJcIeUpDBz*(elh?i7R0hjKS(?_j`?qTVNaPh$)zgeQ^K|!_hb%C*xFn8Ry|bd>dEd z`}h%ljyv!x{0@J>Q|NI&QxLDg;#e9h;H?;m@mLG*#-?~Lw#P*5iaqfWd<;k8UvVNn zkJE8B&d0x_Js0y2;`M0H^KB*Gh2P*m@kjg_rC4|6c@fNQe6WohievtoSPz?ED{O}W z?1E|dFj{#yf_Mx*h0o!OX#G5|5x<E`@jYCJHcns*@lM=_2k{t&jt|JGyvk{M3D%R> z<=C%1o_W1pb=jYWcn{u>4`L9zV;_7JhvE~MfzMzj&cwNRxsJ#EBM+Ee{`{x%fVq`- zd41i~;ry+SzjZupPUYmU-R_EPM>s~IA8Vs+Z!_YY)}Pb#(DE;@=c~YWRmKR+seSQ# z86TS4`B^?>zpXwFJ-(rFZsR*H)wuMD?9cN!9cSZwyj;g|U#h(6`JNxY_Byk2Bd^Li zYtN77Jh1zPNyMS!W9_~$i_aJ0|JVJ!*xQxY>p$Q7z`Xwci&dZg+Vkus&Zjx}-_p*% u(0b`&wG%J5^UCVIoXW3@Jr4e2_a~n3@0HX1?)i2f@6VEC!(a3|l=xq56mt6j diff --git a/quad/sw/comm_dev/Debug/src/mio7_led.d b/quad/sw/comm_dev/Debug/src/mio7_led.d deleted file mode 100644 index b34149c62..000000000 --- a/quad/sw/comm_dev/Debug/src/mio7_led.d +++ /dev/null @@ -1,42 +0,0 @@ -src/mio7_led.d: ../src/mio7_led.c ../src/mio7_led.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h - -../src/mio7_led.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: diff --git a/quad/sw/comm_dev/Debug/src/mio7_led.o b/quad/sw/comm_dev/Debug/src/mio7_led.o deleted file mode 100644 index 869641b1707f30c83a21fa0a273c68412765efcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88708 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ξtNoD=%AZZe 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 diff --git a/quad/sw/comm_dev/Debug/src/new_comm.d b/quad/sw/comm_dev/Debug/src/new_comm.d deleted file mode 100644 index 3cf41b96c..000000000 --- a/quad/sw/comm_dev/Debug/src/new_comm.d +++ /dev/null @@ -1,90 +0,0 @@ -src/new_comm.d: ../src/new_comm.c ../src/new_comm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/type_def.h ../src/uart.h ../src/stringBuilder.h ../src/mio7_led.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/timer.h \ - ../src/log_data.h ../src/PID.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtime_l.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h ../src/commands.h - -../src/new_comm.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/type_def.h: - -../src/uart.h: - -../src/stringBuilder.h: - -../src/mio7_led.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/timer.h: - -../src/log_data.h: - -../src/PID.h: - -../../system_bsp/ps7_cortexa9_0/include/xtime_l.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h: - -../src/commands.h: diff --git a/quad/sw/comm_dev/Debug/src/new_comm.o b/quad/sw/comm_dev/Debug/src/new_comm.o deleted file mode 100644 index 4ccc3ae365be17af927a1f106ebe1941ab7a88b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129224 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 R%k#~DRL<+=Z2pV#e*q=bUIYLD diff --git a/quad/sw/comm_dev/Debug/src/new_log_data.d b/quad/sw/comm_dev/Debug/src/new_log_data.d deleted file mode 100644 index 3866c7a28..000000000 --- a/quad/sw/comm_dev/Debug/src/new_log_data.d +++ /dev/null @@ -1 +0,0 @@ -src/new_log_data.d: ../src/new_log_data.c diff --git a/quad/sw/comm_dev/Debug/src/new_log_data.o b/quad/sw/comm_dev/Debug/src/new_log_data.o deleted file mode 100644 index 058a51a81843955991b8de736fb255d783173a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15208 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 diff --git a/quad/sw/comm_dev/Debug/src/packet_processing.d b/quad/sw/comm_dev/Debug/src/packet_processing.d deleted file mode 100644 index 44a95cb84..000000000 --- a/quad/sw/comm_dev/Debug/src/packet_processing.d +++ /dev/null @@ -1,83 +0,0 @@ -src/packet_processing.d: ../src/packet_processing.c \ - ../src/packet_processing.h ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/util.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h ../src/PID.h \ - ../src/log_data.h ../src/controllers.h ../src/quadposition.h \ - ../src/communication.h ../src/commands.h - -../src/packet_processing.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../src/PID.h: - -../src/log_data.h: - -../src/controllers.h: - -../src/quadposition.h: - -../src/communication.h: - -../src/commands.h: diff --git a/quad/sw/comm_dev/Debug/src/packet_processing.o b/quad/sw/comm_dev/Debug/src/packet_processing.o deleted file mode 100644 index f828cbf1fff0a0d0be605f7cc4b6688732994376..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119476 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%0Dgi`t?_;{3}AQmwCI&zb*WI;fIBPBJ}#0zf$>c zg<lnZT}T}_=egIz+*#$j3r!!2?;oJ@R$)c>AmMi59^stuYN6M=^i;lHxGKC!_ynQX zw>(qj7YJW0e1*{KOTC`uExP_r;qM4PDEyev>sS6l<u3~VUih!V|0nc%71}|wzwRQu zm+<~V`o8e{%Y=2|6~bxZmBM+U*P}dI<-@|`!jr;VgkFF0<0?N#_*2546aJ#m>rH-5 z<+llcOZa=jKNNa>$)BnGdEu9Z|0Mi(q1Th#M)dPe!n+CYBfLm>sjw_;2_GihE!;2k zdXei??h1cM_!uF5f!P0EAM&Fr|Ag@Q!WRi&F7$d3#-HHt-z@x1;d_N25PJQ`CsqEe z@UMkm5&nzN>pjjE-M_u?JmEcs1)<k>OsQNGUM}1ze7Ml-IS#4Z77m2RgzG}D-=MD( z-}h<4XA55_e2LKOHD06g8-?_Z;_u%r{9U2fXZ*3spB8>j_$A>#3cVhK1~_c*9N`^> zcNJbB^!kfSR7NxQyYF-#J>Bm|$w5x{yZh+5F8m+1f4@ub^WR;5_ka7eTQ~o=PrH8j zpT1B3Z>3lNS#qoI_Icw9@#Q;(->zKJ+lBqGe*YuF9}_-H_>;n)71B<c`|d9be^vNa z;k$(14(tz9{v)B;UE=qDsq)_lz5Um}sr)VBt;JX0L3qCK-onkoEyAL(A$*8%Mz~kF zAbf<dBRnGXc3wBA{8-_Wg-;hgSLp4#%svzE_ex#=72%tN-cHlob^X4se^~e@!p{i* zO6cvmzN+%qg=dMczOC@i!n+IaD|~=(tFR(`kZ`+jk8n<SweV5Gp3vKEt*U&J@Cm}F z3ZE(T_F9Z9%=z;Q;j4vj5WYp|?X-SJ<qrx!Cj6A}FNEGc>+e<mSK<E?-b(!Sxx%{$ z?<Ksya8h`gur9npI4!(VI4`_b_-LWG!#b|=N#QNRCkcOC=<Tn5O68vu{-W@;!e0}5 zyQ|+)`S*l>DEzqa&xGFI>dPwslkne#n?Ue6F1HbSJFB~?d>`RO!b^o^VN3Wh;cnr6 z;iB+5p|`90A(bB^JSBX*@JEH-p6dB3zexCU;j4tN7kWFY-&Fa%!Vd^PD*U9-+fV(q z%3l%wi}0JmvvrQ}c2no6d{1FPc(HIw=<TI0S9z!K;litghlJivYM}Bl;kxi<;S+`4 zKI+*jzfg$B{tumZzEi#7qjlfI!sEh|!drw-5`Mp)^Gx-d->!V~<$AAIeUIPobp1H$ ze0n-P{ps5M?{<F8kI(BhPHz_ertrPO4+uXh{G{-+!oL=NMffkmZwk*AKXZHGdBS@N z3&M+qQ^K0?a-rw<9<K6L!b8Hga3DM;To>Lfe4_Aa!e<L#D13?V7lf}7zESua!gmXQ zSNI{}9}7P%{G9Mh!haNgO_+$EIY)R$;a!Cn2rm>~A}k5L-_1i+-X+{8JScpma7nl< zJR!VM_&DKHgwGH@Pxv#!mkEDK_&VXQ3%woxdsKeE@FT)c2>)F81>xTb|5^AAA;`MX z^E(JnXV3V*&7RNO2aKXuqptsF+0i^g<J1uz5v~Yt5Pr9xYlqsM75<+cpIbK#(VPF% z*SY@qudc5<9lbl#b#tcmF4TJYe%b&1Z?~8Ge#xc2-TCqTvafiu=I7IeXZqY1ss5$H zvalt5m~gjnzwk`k_v_~S)i3@W`7}NEvxKL!U(CN>zWhJk&gQ@B`;L09QT`00>i=i) zb>FUi^qI;JUaWch3gN4TZxFsk==Bu8qw)uZ9}|8`_!q)23P<&m$=`6su=B)Dmn)Yx cKUMw?WwU=r+4xA55Ar(7#?PW`ejq6Se>yg?i~s-t diff --git a/quad/sw/comm_dev/Debug/src/platform.d b/quad/sw/comm_dev/Debug/src/platform.d deleted file mode 100644 index c47839fb6..000000000 --- a/quad/sw/comm_dev/Debug/src/platform.d +++ /dev/null @@ -1,16 +0,0 @@ -src/platform.d: ../src/platform.c \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_cache.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../src/platform_config.h - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_cache.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../src/platform_config.h: diff --git a/quad/sw/comm_dev/Debug/src/platform.o b/quad/sw/comm_dev/Debug/src/platform.o deleted file mode 100644 index bf48b14f046b241076d8869a6b95c4b15371bc09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40716 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 AcK`qY diff --git a/quad/sw/comm_dev/Debug/src/send_actuator_commands.d b/quad/sw/comm_dev/Debug/src/send_actuator_commands.d deleted file mode 100644 index 6e580f7e3..000000000 --- a/quad/sw/comm_dev/Debug/src/send_actuator_commands.d +++ /dev/null @@ -1,107 +0,0 @@ -src/send_actuator_commands.d: ../src/send_actuator_commands.c \ - ../src/send_actuator_commands.h ../src/log_data.h ../src/PID.h \ - ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h \ - ../src/actuator_command_processing.h ../src/control_algorithm.h \ - ../src/sensor_processing.h ../src/sensor.h ../src/user_input.h \ - ../src/util.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../src/controllers.h ../src/quadposition.h ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h \ - ../src/packet_processing.h ../src/conversion.h - -../src/send_actuator_commands.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/actuator_command_processing.h: - -../src/control_algorithm.h: - -../src/sensor_processing.h: - -../src/sensor.h: - -../src/user_input.h: - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../src/controllers.h: - -../src/quadposition.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: - -../src/packet_processing.h: - -../src/conversion.h: diff --git a/quad/sw/comm_dev/Debug/src/send_actuator_commands.o b/quad/sw/comm_dev/Debug/src/send_actuator_commands.o deleted file mode 100644 index 0845fc70a7d60a67bd85e5d7f5da328794c281ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126400 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 diff --git a/quad/sw/comm_dev/Debug/src/sensor.d b/quad/sw/comm_dev/Debug/src/sensor.d deleted file mode 100644 index 86ac96c64..000000000 --- a/quad/sw/comm_dev/Debug/src/sensor.d +++ /dev/null @@ -1,98 +0,0 @@ -src/sensor.d: ../src/sensor.c ../src/sensor.h ../src/log_data.h \ - ../src/PID.h ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/user_input.h \ - ../src/util.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../src/controllers.h ../src/quadposition.h ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h \ - ../src/packet_processing.h ../src/communication.h ../src/commands.h - -../src/sensor.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/user_input.h: - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../src/controllers.h: - -../src/quadposition.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: - -../src/packet_processing.h: - -../src/communication.h: - -../src/commands.h: diff --git a/quad/sw/comm_dev/Debug/src/sensor.o b/quad/sw/comm_dev/Debug/src/sensor.o deleted file mode 100644 index 05fda656babd7d7dd5e133e8ff9ac87536faa381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130352 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	rp{V4H2mH=Iz(ZK{ES_{Q`*5czF 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 diff --git a/quad/sw/comm_dev/Debug/src/sensor_processing.d b/quad/sw/comm_dev/Debug/src/sensor_processing.d deleted file mode 100644 index 85de01061..000000000 --- a/quad/sw/comm_dev/Debug/src/sensor_processing.d +++ /dev/null @@ -1,111 +0,0 @@ -src/sensor_processing.d: ../src/sensor_processing.c \ - ../src/sensor_processing.h ../src/log_data.h ../src/PID.h \ - ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/sensor.h \ - ../src/user_input.h ../src/util.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../src/controllers.h ../src/quadposition.h ../src/iic_mpu9150_utils.h \ - ../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h \ - ../src/packet_processing.h ../src/conversion.h ../src/timer.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtime_l.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h - -../src/sensor_processing.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/sensor.h: - -../src/user_input.h: - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../src/controllers.h: - -../src/quadposition.h: - -../src/iic_mpu9150_utils.h: - -../../system_bsp/ps7_cortexa9_0/include/xbasic_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps.h: - -../../system_bsp/ps7_cortexa9_0/include/xiicps_hw.h: - -../src/packet_processing.h: - -../src/conversion.h: - -../src/timer.h: - -../../system_bsp/ps7_cortexa9_0/include/xtime_l.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h: diff --git a/quad/sw/comm_dev/Debug/src/sensor_processing.o b/quad/sw/comm_dev/Debug/src/sensor_processing.o deleted file mode 100644 index 82562810a923ae2aa1368f3acd899293073975b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135200 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 L^ZI3$PnZ7-^;F9R diff --git a/quad/sw/comm_dev/Debug/src/stringBuilder.d b/quad/sw/comm_dev/Debug/src/stringBuilder.d deleted file mode 100644 index a799e0b44..000000000 --- a/quad/sw/comm_dev/Debug/src/stringBuilder.d +++ /dev/null @@ -1,6 +0,0 @@ -src/stringBuilder.d: ../src/stringBuilder.c ../src/stringBuilder.h \ - ../src/type_def.h - -../src/stringBuilder.h: - -../src/type_def.h: diff --git a/quad/sw/comm_dev/Debug/src/stringBuilder.o b/quad/sw/comm_dev/Debug/src/stringBuilder.o deleted file mode 100644 index d79fd0b8c22d8685437f9118db42f051c4c3f7c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36748 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 diff --git a/quad/sw/comm_dev/Debug/src/subdir.mk b/quad/sw/comm_dev/Debug/src/subdir.mk deleted file mode 100644 index 937872702..000000000 --- a/quad/sw/comm_dev/Debug/src/subdir.mk +++ /dev/null @@ -1,103 +0,0 @@ -################################################################################ -# Automatically-generated file. Do not edit! -################################################################################ - -# Add inputs and outputs from these tool invocations to the build variables -C_SRCS += \ -../src/PID.c \ -../src/actuator_command_processing.c \ -../src/circ_buffer.c \ -../src/commands.c \ -../src/communication.c \ -../src/control_algorithm.c \ -../src/controllers.c \ -../src/conversion.c \ -../src/iic_mpu9150_utils.c \ -../src/initialize_components.c \ -../src/log_data.c \ -../src/main.c \ -../src/mio7_led.c \ -../src/new_comm.c \ -../src/new_log_data.c \ -../src/packet_processing.c \ -../src/platform.c \ -../src/send_actuator_commands.c \ -../src/sensor.c \ -../src/sensor_processing.c \ -../src/stringBuilder.c \ -../src/timer.c \ -../src/uart.c \ -../src/update_gui.c \ -../src/user_input.c \ -../src/util.c - -LD_SRCS += \ -../src/Copy\ of\ original\ lscript.ld \ -../src/lscript.ld - -OBJS += \ -./src/PID.o \ -./src/actuator_command_processing.o \ -./src/circ_buffer.o \ -./src/commands.o \ -./src/communication.o \ -./src/control_algorithm.o \ -./src/controllers.o \ -./src/conversion.o \ -./src/iic_mpu9150_utils.o \ -./src/initialize_components.o \ -./src/log_data.o \ -./src/main.o \ -./src/mio7_led.o \ -./src/new_comm.o \ -./src/new_log_data.o \ -./src/packet_processing.o \ -./src/platform.o \ -./src/send_actuator_commands.o \ -./src/sensor.o \ -./src/sensor_processing.o \ -./src/stringBuilder.o \ -./src/timer.o \ -./src/uart.o \ -./src/update_gui.o \ -./src/user_input.o \ -./src/util.o - -C_DEPS += \ -./src/PID.d \ -./src/actuator_command_processing.d \ -./src/circ_buffer.d \ -./src/commands.d \ -./src/communication.d \ -./src/control_algorithm.d \ -./src/controllers.d \ -./src/conversion.d \ -./src/iic_mpu9150_utils.d \ -./src/initialize_components.d \ -./src/log_data.d \ -./src/main.d \ -./src/mio7_led.d \ -./src/new_comm.d \ -./src/new_log_data.d \ -./src/packet_processing.d \ -./src/platform.d \ -./src/send_actuator_commands.d \ -./src/sensor.d \ -./src/sensor_processing.d \ -./src/stringBuilder.d \ -./src/timer.d \ -./src/uart.d \ -./src/update_gui.d \ -./src/user_input.d \ -./src/util.d - - -# Each subdirectory must supply rules for building sources it contributes -src/%.o: ../src/%.c - @echo 'Building file: $<' - @echo 'Invoking: ARM gcc compiler' - arm-xilinx-eabi-gcc -Wall -O0 -g3 -c -fmessage-length=0 -I../../system_bsp/ps7_cortexa9_0/include -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<" - @echo 'Finished building: $<' - @echo ' ' - - diff --git a/quad/sw/comm_dev/Debug/src/timer.d b/quad/sw/comm_dev/Debug/src/timer.d deleted file mode 100644 index 3454b48df..000000000 --- a/quad/sw/comm_dev/Debug/src/timer.d +++ /dev/null @@ -1,90 +0,0 @@ -src/timer.d: ../src/timer.c ../src/timer.h ../src/log_data.h ../src/PID.h \ - ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/new_comm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/mio7_led.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/commands.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtime_l.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h - -../src/timer.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/new_comm.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/mio7_led.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/commands.h: - -../../system_bsp/ps7_cortexa9_0/include/xtime_l.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h: diff --git a/quad/sw/comm_dev/Debug/src/timer.o b/quad/sw/comm_dev/Debug/src/timer.o deleted file mode 100644 index 0bb7485fe4df11625c08d205d4b80d8e871c2691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121204 zcmc${2YggT7e2f*cXtWWMG*T6qKUNKbOh8*vPo9b*i9gya1F@@A|Z(>fQW^TGzFAm z14L;mARuBd2o?nFU<Jg21v^%h?|J6lySoXf@Avz@-~XTY<ve%p-ZFFMoHJ+6oVniQ z%gGc%*sMQci?u~cHrwkZs^myi7sT4u+E%IGFGZQZTyA2Ti5VtlnwV|k6(;7Gm}g>v zi2)M}O&n-qv57-WyvoF3CSGmga1+Z+EH`naiPxA|X=0U$H73@YSa0GO6UUi2-oyze z-e}^@CQdSOiiy)qoMGZj6K9(^*TmaQoNwaoCN4B_v59w@c(;l70&UqnzO-+c^9ha) zp(hU6+Acfv_wnOj+uX|zYPMwuZ8M%e9KOblYuuL~dfm3|pv^jVZ96Dk1qU?u^9LlZ z*V-;S$ot!#((K!I<M$uAX#7jxTG!gfZ#!bWN4=xzJDZl>%MMv}c>lLMbFF%`eLeS+ zwzd|ZS<edB*|qH8c}X#czV`SIEjV@Zffez~4#v1!eAe7%`|5waHpX?<XVVh|-Wxdh z!|~(qTlX0}G1_k%zu-uuO>d!%V^7+~aJ@`k*~Y(hq^<j`&lDe;oD<}Y*<SnW{XZe! zW1HD*5*4u7?BcT4(3Q(_aqLlNY<EX#n6x+R&|26uyA)1s0d5j8wNNf89f|D(pxG{n zhTZO{sH(Tg7{|cB@LNo?C(s$v?&z?d(CqbF6>NM4AYvYV!De%$bh6pn%Dyk+h0Ze| zys{rPPIj?5zkn)RC3~~$O2&puG0w`1Bfqt@#qc5W(wlgr-M;d2o2_}O%=V)4&WUH^ zoZot+mXA_@{vf-=I2|K^IYz0ibJ@)(<r<|<#_RHplFO({fl-PzsyV<YxzR}bz3<s< zG53RcGVm_y(7dfIydCc_9#XW2)w0?%&?woBhYT`GW_yZ_658|G-?(LP5YK4tmO~5B zKhD}LoEmOD%l9%$rQv5igi@LHtQ{TD9Tn!YoCj0!+cie1t@BHkMj55koWG&R<Y=SR z$$9PhC{-Dyvz@0p@RWL^<Z@QSoX9ao=>li^Ae6=$rC6t*rEx~7yDjFs7!)TgMco~5 zUjc2GH-5tUf6xV|Z!(x>b6!6LrJIdXOtbzqHaXFFK-*^hD{OL-Q8=wx|1z7LY!o^< z7e0)erWiN5oFyNkG}S1@I<HuX(ln#wZdL{noNnBfYKvht<cup(3&&fNY_?8vX10dj zDX_^|#x=HPew&<a9NU{^*yJ4JIL4`8g<IzurIyaR%TT)2D77_Sd7Du>%@)H)%Xvre zmQ!wj+h#kU$&KX>G`u|}aI<ll&3WN>C_QSF?1pr1HKa49*@%+SHu(g5TXt#bT<8Km zX<XUYx#aXn>2jynA1P%xk1ay!>1=RZcFA^*B|gjhv@SOb=O$QOt2jkCn^6FsGk%>R zoYy9x_<~WKEu8s%BgNZ<^VT(y;_bq@ekO|B*_&FI#lqR^%SdsbaF*|k6c<b902+lI z#>M-jbJYd-)hsU7oaygGiu*L@B~<*E%qQEO-}a0Y_t~ARev1?rJDlf?Lh%)Lq1I)e z!}(N?Nb!4zvl;`H_3I3$Gt?QySB;C8Ih`LJjuf{#ov3p7*VmoSFTO@`r*ZLNr*ru5 zNb%-o&iV%;#l_8>%I55*-O{>jXyzQf8o$0lwb!~l*UUNaD-_?N0BBuaZ)R)3J|2To z%WHUpEruc@-wC1-tr}8o+K}Ej-KrrW-lko3Ee>NIf%&vw0qL{F^lUF|j;|iV&8_Vl zLEDIJpl#jwt?fh{*_zuO-@lIo=Z6O%;y=v7A?%GU=HLJnf8@o@&vyI~aN>%Xb8zZU zUQCPh(`zUlGp@Hgj|Nft%P7S-Z--Vp{x(W2oe!{d+$gnecga~O39(!~=CpQ0K0#3m zR!DZ~WIOf3Ur^S>XZX3j$Zdx)r5&5kKS+W46YWKyjj)MM{DCK7!ED{}Pn;&cehkn> z@E4xt7*xz(cA^0tPC=K6E<BX;Dm&(501_ASN;$6{>>-Cw-?<+rTQ0<*aDcx!bLZfu zXAZ-C5v|A)>zcE_!*OeBf^~+9E80YzK|4g(*6mwpt<P%RPMj**I+vueA{W?Nw73*! z(XnlCh>kPQz!Eyz3$1mF7MHZ>(?YaI2eh(jty%E5Pdx=T2*sF4F{WeqSM*tX5xMUa z^%#fsm=;3#+w*xX&$s#8_rfb%;a2lWkP}wJkDuFg5Er%Nb!{EE&Sq<8zTRQH{#5gQ zD59%++AeEpRgTTO+_^BVrOkF)Php+EsHMMs_!mC5gCksFiRN@nY*aiwQoO7se^-BY zP-(ltMg)U+97CiONZa*1t^Qb!#Xnw4q;&9FBIP3bT9!8$zbo8q9LEqTKhf8sS5f9) z_*ISk9J}!=+#)Kf&`xnWnx}Qdaf@b-=DQ$OT8kLRSvv(>p>vu$TD9uRZa+m`Zr9qj zaLDT+TbjM4qi>gs@ea+=%F%Hs-)3AAMYYbYjgsSnTk>&F*EZ%;dbD-4=!mgKYt`JY zwQlD)W$RoNTAu1~UJ9$KHEVBNXV+StW<DUp@dK{#na?v{rS<Hfeh#14GCLaA8&vCe zdZS{?PL7zzV0W}rS{hH#PBR~<oqmQx7Qv?2wKL9abWf|ZR8ebfUTKud&bFiC=Qx@# zu%o^$q@#I!3ZC2ITunRAxZTmrJqnMrYTDN2Xx<vONo#Sw)~0i#H?-{HSSd~`!Eft? zX8fY97Z;dE8$?(0=n-+DBg6FtuFJc~arrB--I_mE>m6tQ+~;EBz^+}<%^~Mu8l}Z_ zH-9_DVtkA9&5I0(rdq2W=GCoxI&Kpc58wfJiC&IiyQgq8%<bqm^=llY#hOiObZ;Av zqxm^~@pDV_1zKyjU2EsEYp2FLnrCM5mjp+}H|02}O>A^)t0YIaZxYEWt-aH(otA9; zYQDwM{;@~cD=qDgeg~joT88-o<0`F{!?8>(KZYM36e-cqHJ?HqaEOmka)>@~uN>ka zM;p=XRMH8Zc;;{Pp+i*G^SA*b?GU}HNIOAP9Ae5L(w}}L&3}_L_Ds^JV3ZtUVm9d; zm;^XP<|%xR=OZ3}`a9|EX{0OfAkA=*PKMMw#09UBc2I9Qg@c&50!r)<_dQAaoO;d- z=(|I7R&QB&1&=>e&zXSka0p*3zN=v?kLRoU98vY00>9HCt|}x=_=EIb_1?3f#kjH$ zX<zWsA%5FMn*I~%Zg|uVamm>{p45WJFzcYsUwLMqs`G&ddAuc^H0BG^W2*k2VwiJ? z9~CFxQ0+QrDt{f?n)H0dvANgt_}QJLbN(c4-IjF!Xwq*n$T`Hay`<+s5Aa@9tKd)` z-`a{aqd)1*>ionhJU(S4Y3{?MS1JA^suqP*Z(g*B=bwF<bZrsor^iYAzD+t_UH{zo zJnoLU4f+li*dcyyLmK}L=^7{)`uA4Sk5xb3sqVd0aq@BqyF>I;{LvKO*6in*q#Du( z&LX{9_3Zdm9@|tsXQ^wtR`Sd_t4P08y)&Yk$4?fJz6-+(nUSQIsG1+uc>KJ2+C!J~ zn(>O(sO!&3;+f)$N$*qAzHm2>FT08KJjJnBRli?(0nfbDj8B`aT6*9bp4pvD`dfF> zO4XwJL>~XD-couBkFUulO;}92&O<u<4AKr`NN-<HdZW^*i&f2ke2Hg5TS<NDX=&=b zPiaRlr5*V__-p?J(x>W4?+K7L`;_#v2S_hhz1e*SkH@Gd+%}uXXU`+;uQ>3ilJjKs zw8@HNi&VRwY|Cr9s^^@g`gEj{vA<QHhE$Kp4!q`Q3~7BK=_%^oPD;*~C`~-1xY{<0 zzxGg4{hO-8(64yrnny`DDn5UzYPh^T&n(5<0`fD0)E6S%pnA}MC65;?zLnSV_(i45 zEywYAtCGecukm=is>$g$^LSJ*QulMDcPn1?P!=PkBy*R#Yt;Arb#y<{XPzfr{IjB7 z(mT|>FDgzpSM_nf%=7D2+rRsq$4f_&mSS@55SKni`lphaPn3ilsNtFAit`6A;c?eJ zq*dxIFRFTeJc(zfSCcNemh{PANEfOePgWd;0l=A68tLo`(red|Zc@Chox|hWuSpk8 zAzh;Gs#15=<nYWV^`ytul~t;BFCzx(5bX}|`~p?;`JH%tdje@t_1#D9czl_X%wP(S ze?Fgd>K&xb&LjQNO<JIy(CsfCcMOtFnn`+xs$rGl+k$;Ob53)<x1@l_Engu`S5`|Z zUM)~IbCY^|^J4zGLUFRqW*%qWKzgI%K>uSro^gcq(iWsk-yxl%-m+3j_;u=<=Bjrl zw&i=@P!e^a;?J<=ynd9r_p$CgcJ(A(yP9;1lAkGxd$W|3R%0y2n5cMoXg!Z7D!n^5 zp2t`0C4F1*@a+ve9z2B9uK2d>aUOS9Po8uYkMoqgRVh1Dx`JmyO7hQDwsDq{jpKcJ z{-K{qeM$~DD=uAqkY^Bj1MPh#=?c~AeIN38Oatj$RiBYcQ+`ly`AWU_dbZcLc@ybN z)I?kBVWf|3hqzF0WA54p+Il&)qQii<K|5`04;ou}8fg5fKG5W8{Xu*0pw#xg6eFLy zbF0u7VnXwbNThDOAlzi<yJFWy!29BT3iLto@gDO%r`KGF6Fon5gZ64Q9@O3aFlb^w zN>|byw}K{r_$+9Orx$2y(q*8%&s`6C$s>NyK90*l(>(0c^xvGI8E3G*zUpqESsTZI zW-lf`{kzGx{)eGRj=ayQM+1Ia2RdrVQP3NII^C?(c^9yy=XWYM%TJ1|+i~J4v6*)5 zX)$*PO3#QwYT2_QgAI62RJH*;FV5ZyctIRyFK!dV7Xw}tspR=~@g5amhlpc8za(0- z$uEoVt^~Xy?z$N8s`&H}V2}7A6&(Cp<c|a_(b~^4D&p+Cw-tWAXd=v?VzqM#4c@8e z_W(V6>r~JSEAv3z$7oLa4nYGPc`c||p{axMsJh8r%{yhuxj5S*vlO)DJDovWeZ=cp zUo{=HO>123Xxp1@X*cs!&{G#J0BxT)5%jdn$iNOG2ZDC|9OqSCK9Zk*j#qpt6YCpQ z+R-+iy?WXN%Dyk@BG8rMi|+xC$#eDtw#o<SIz295nv2pCayo19q`c^Uz*ACR1$bIs z%j&)&n^Bftl^=6t-zlH_5~T%>;thaRj^XbE_Bpnb<qMr96yinBoZ*1QPRxsKjwQ|) z`II}I@_N8s&b;>kcRTlz^Y=QJQLdIcCy|TGoF5GVEO)MBCGK;+LoHb0yl^bwe&>?W zfCrqzD1s}Ua}EGjIUNrIRy$X)Q`b1#+yYqZ%zhg1p!4);fQOvtRs$Y(wxUT~=j`|! zV7;?C7O=tTE&)8^oJ78CbmnvfY;yh}0h^r~_483@+I4`ZovG~F?apiV0rooo;EO(V z#()K?7fv6Rh!cIsquHt)yS)PCxSu`)?RMr$&>ptdptHp8bii!!CVO{|czriuuJ~m$ z;8t<NCctfC%vXSUq8qz=zPR;u^y_l5{9%A0nvNNA82k1XIf-&PQ(hepm?h^?U1!TT zAZ(5~ayp+fSKdz1xm7wo2HYkOvR~%Ok*R?B(nDQeAcJXu+hrwf<sI@ZUb0X=i8nY` z$X_AL&V6z^>gk-Tg@*A4ZTwD@4E=E2tDR@6i9@!bXto-DIcRIgcF;EKDMoFJXPay( zNT)yy%J>;)i_a%RuD<3VXvJsufmVI)2i+~!vETNHsY!snBAe~_K>P+aI6e~J(DnaZ zY(F2R!=epq{-wwt1o%qa$>HK_u^|_=`&pa|_BoG=ZG6`s;x-OI$Hi2XoF8jLvds#~ zT^(`0)f+TK9a;v=vzK}1p?vv|9Du!D$(A&P#9`p>gVlHVx_pG=%>8pgvs!-#nw><2 z^1u8h=oK+8(Ec~E^K$;C$;rL1Ip}~MG;W1K>c@zgbQ4E@^f`_zJQUWNfeS&WiI(KR zY;n$fz<hBVU$<D)#G!PTXmL8=UXkbl+%LBBajV3HwScu^LjhomI0xYf$77-+y^F2l z6Ep`F(#Iw~FKP~>^nzGLaeh@CrsTY0ucv_Sv~T<Z@Qr=tWWX(s-+99l$5I-ERgPH9 z1{@DMhW1D4A;(tM|6#{iTK#p7%h-ZP9QT0Zj*X7D&jW07RK?(iryP&{fYQ^BhafqQ zZH_juSB@QyRfhn(9ba|<>~XY&nk#iVl{Vke{!i8zFK8_8|Eu`LTs;T3w%Q=@sJ89U zU+U49{P7pceHQHi?dPLV`i_!yb4B5|<|Q%Nl)hHsac5v^0?LDDTnu{Ev$P5Ns4DZ? zQ_^X@PP^zG&~wMI8@p!UIgW0}ia<TFKG2l=akayD_!ZCrKe0<nH<6{+{Z8Ib7R%oP zEEi`K16GL_Y4RQxk8-TqD}G`x9ThXk%3s7HFv#(nh~*n*$!jT7v*r2Jp*ix|jVR5N zk5R<tO9$n9ft<_kSt57x<el<*isfB0gA%h;KCu_DOfuN)ST0+zCsxbvZU(H8_8$Rj zWhYLFHp~8VQF>HPPX=s}x6oqlkbidryd;m(r+HbnU5wJ3^74GZTXOU7fVbre^6`Bc zq)dJw3;qCnDBpb(@VVUG0`P@Ak^wj@pL79!l#e|L_({4t1Adk_y#Sb`wIT~9YkyMX zrf37E0dCRmV9jP~_YXyBzP6TD;7;vp_QEpF`wd{Z))C$BctG1tMy}ERCPN<5eukzy z)@#Rj$!5)e2jFq7%|5`hnxFRKd9COYzz%KaNWjZl8+ypQwGTP%+@sa7neS^$$es_h zNmSKOwZQ54?K5rg7Mmero&E~q{29+t8P4=;pl9XMESx=iAm}+q6G6M}X#nk>&XKUk zgq5H@t7d}s`i&azu9*$$d3P6R{DBzIgjsmFBV*@FpuRDaKr?f`2F;r20?j^fA*lcH za?mRtroQ!G$X|0lWkm~~+W<P?t2)qtyT4h>%P;SQa$XCzHvcXse|v)R8+`s%92e#? zf>PAtQXCI_gk#2_PuqeP-+l(@;8IH9kj1BgUO9n`y6R@i_|Q(bfetHw8&uzv33~Oj zt3gZNyA^c!wXH!*w^2sQ9%lPPGlqkfYgdDgXh&@r`678#@p?<pYx;037<K<spq0N} z13G#ZmAUGR0BCin187az^`O_jd;@50CFQj4$W5U2l@!5-1iCb1M$`UXmzak$<K3*) z6tRY4J5?;D@J|yxe*xSgej%S`ieBhQjLhW})Y;-evT%-=@+;sraq1etJn<K6IbWQ& z5U@ZTsst<&mrxw;6cf-@j{C&fti}p4`!L{s@z5=R2Snc?fR*C8W`I@Vx6y#r;*IA3 zYec7u0Bc3YD8Pea3;XyXv8M;%VNt~PtrI=jwd+NCJW3nHCcf_xv5z)pqqv?<@g{LL z`MO#7+2lvX-Z3a`5j)7R$3!dMzEvD&1s@lC+2>CPPch(0F@+}LDe(d)S5J$3*}i8) zoEPw{&}g7Aa2x<UFPc{XUJ(0F1#A<kT>vkNcnZOGaYHY_4)NpdfS1Jc>j5u|!|d=^ zL<Mcwt70K*y;G#q0eMZViv#QuL*@Z?i!6599x-?&;7!r80PvRB$G5*N^lJg{h>`5S zcg3aD$GzfXiPAoC-gv-!qS?!U_r+PS06q}6_5*w<meAULBpO)VkHt-_(th#UeSiak zs~MOD4WJBtA|5&hI3%h*0(>g^JPP<sw5H5{E-GIDd?B_`BM*yYT8b~lcJ}R8V&quB z*J3?Q(l?@%ygnkX<}mrKnDrh?--*dI+~11@GzLG2D_Gqh#g}CAPh!-EfS<)>DS)G5 z>gj-A#IX5*U&Y|<fZxQ6Ujcp>TyKQ$vYj3Nr%0fl9uwcJ0sJK{ivj#CCME!miwF4H zo8@mU02AeHLjjXy{*8di^4ddyDROBoV5+>5t(_)sV$G(@`F{Xr$lVm^TcrLSV5VHh zM$eK--2k(t<ZI{13FP%{^5so{dGa6)_k7tb39vveUjevX-o%D2k)QPj+$nE*2ymDD zBNlMCyr1%UkGzOoe6Pg17e}OiykVLAfbzLquF(PaN#B`(6>`f3fcxbidjJo}2YBU5 zSxOySCEqOrtd>`~0BdCaHo#i>F5mZ{?CQje9+J-&qO?vnBVQhot0{aN<>`|Fn<Uoe zILdu`1n{W*lO|z{?D0O}G1-wOWvlE#k$PN?Azz-5$3Fu+CEqLs?2v<Z0A7->|7kPK zf4kPlaN^Y0X>LwG_hHa8mp>1B);Bb%XV<c4&*^>%XqOxPpcgD10ot{WPrI=HkD%Q= zkAU{PpVO;e7vGFy_aau#vn3TYzGxC?>bcZ_-cL@!@g=2fPoMpLLHizLkEAd95;WuN zM9}Q?(?I=hs(WrHzA^8Yr$Ga~&j1Y$=ko{6+6h`beJ$u!=TX{*&RYjMtdydoccAKC zJ%&nCGO#P?@UHtnOLx%Rmu1r}4ZTHSsmSO9dd)_*x~gqU(CRbUqPm}WWqn!|=(sm1 zWY=X<j&8WCCGNfPQ*vyQXmA52i;nEa>7woBfEi*Y+cR4<u&?HbH_rmh6BQJS`QmA| zW`QW=sCc`$sSa?5SQP>+6luJ2kvQ5KuvmO?0I)=834lArj8g#jibo}2smMMASSIQ@ zBrF$!bd>HBvnk3eL;<;czi2iDr3b|KRO*#t!viR-5>F~mSe!8krH91+Re%kmkfZ7& z;sCAHqvG6gfGuJed*cZ)Ee`OcSVImzD}pqV&xxT__!mXYbAavQTf!^i*r|Y5#U+;m zc8dTtVUPHgPkBqcUk!L$Ts#`EPqd)$yeEDh4){nElbs)n_h{%p5sT*I<RRg{74U_4 z^K8Ij@gsZvTk%Z~zz<?9x%8vBZ9Cv6@%>c5?_%)hfImdfO96k1J1A}w<x%$L6!~6z zz*HH}u9_w<TLG9Ux3Jc;<eP5;X3HMu1Ln&WY}f*MfGT&p%)1b<NY<7B7R!&Q5KCn0 zQNU7pA%*Nd`QdMX6>|SV!2PlXoskFR>F1!dQXXc9uaY|b=GC$zC3=nQP7z%z8z@N+ z%1e6z9+868-6;E$1)F5^)hKP2Y4w0d<=h_tTV(Avz+>{Re85(jN2PvTK2JtIA-mZD z&&em>0&J75*uEF#V*;>U-oj_@ln-Bn(rfb84uD;<_6ERP(mxFFt{m|$V6Qw757;N? zP*C2JPyG$pFSmIC2js600uIX6G)$k!zbLea<=RI9U(43))NkZ8mX64-8sJ;G^mV{@ z@=mJvQTahJ;1^jt4e+b<{|fj`-uoutcX?hBV7m7GPk@=)c{G``wB0l&v$aV_0durB z_5v1Y6WATMYj4vU-=Wp<wF|XtdF9>O8n$Su)@%`Anbwx~E!U2v16FD4DYUD#-&y%J z+Pd#hTCc^@0p6&c_Y6v#w29XNHf!gR6HjPw?E^fi72XGUN_(7@e?bedr?+dLjRWk^ zDh>c%(uQ>hysRBA1iYd>O<wQPMpICBYb$B!_h?<%f3ItQ^F?oH6DY!awd0ck`?O5O zYi$oT;C-#@Lpb??*7FO%$J&Q80Q<G!uK*5cOP>H7)CQ;y(25SDbXW_pbH3Kj9SHbF z>q99&qCHJJ@srkLJ>X~UB6jgnZ7dbxPwmpz0Do(zQ}~W+4IaSF_KsAiY4-LsCDZLU zQHW;PW1j`gwKuc@%(Guh@m^$q6`iUkr2P(1OVjtUce5^$pm_tSPWgL2106P(?WuW@ z9dyHWY34nB4&ID%*2Wh>vu8I49Wi$c=tSY&3|K4{aI9V{?)}!hAt^}aW-Mg&d>_zL z%xtv>$60Gzfo8{T0QIlj2zo^ttI*%&1}*SU2MrAQ1+?hGt)PQ`V?Pcqr(j+w*wI(b z;V3n1a~~XEy>uez@Pky#(s>_(hCbT`I^va8pcO-Af?o6V1klQ3lz{3l$=}-dPQw%G zo}rx8f1Uu^(D_u*>(5~$CW+N4fXU*?wSXyN9C<TM%o-1vE`Hqvm?PfdGjA0e$ccGk z7tQ7ELMKP>5Kr_2EEMmb4_G25j0M~yw(z%Q;s&0)Up&nUtQ5U(L20$vz5wu`2<!u_ z7nQpKkBEzT!xr&z6=18lhx~d%45v6gExu&`J|~8?2W%7H4gl;BwS3si;@Nh9o#I<s zvE8D>AAmPR+;PBOF^&59zW9)D_&}V^h3F4Or@vA9NDTi8@Ui%rQn_DzbP?c?sHeJp zCT8CR_*~q4Dc}pi>_C|HZa)LQ6lE2Fuf%gDfbYb`6uIw3+BJY5#B;v_ei9eF1vn~J zkrTg)p`0Q8E_NiM^ryIps{fbxfHgZV?q<U#${SP%$g$+hROz7v+#-jL1l%ScsRqoK z+h+k5$g_F@7RhUQ-x9fvQ|`OuC-jT&kw5a$_sXk31uT^v_}b<2%fTqEkZpbk+%G?W z6|h=XQIsE&!*2vUEQ@jg>*NAz@_IRjutB!C0`Q1Dz6P*KE+cz3%O$MK7HRtv@R+=W z{M;(r-HOr^au>&sXXMSQkK~2q(#!JFYXLjuBYfDKGSmg|mOSt=V6U9s4Df->eH5@? z4x~C9lDU+nFXTN#0AI_&?11lNDVzC|{DCs~v;3(!;HW(MHsBX|Y%kys`QgKWKV>}~ zhGTNhEhzmZS8yEoTR!j*V3O8hCt$kfr7@VLo&7RkuD0wdz-`)A2VjAAKI^$q+nWhk ztUb>A?$%zQIa#VD(~2$Eo+exG*K*mntF%s#EW^h19*7ee-Pl6k>_X7Y&&~kNI<*Ki zyO=`ie~f3Ycq<09|K!=AIV(BZ<`&(I<Gj68`TQfizF^g3paW89Mgq6{a2$M@W~6Wr zO~IfeY(jA!J8|%kJ)lFpUxQwG7pIn2eb2TGopvthuzM(2`j`Od)o)R=N|LSv9bU|# zzjO$@vrHTV4ds@DmOntHsMuZ#dd(Z#K}Y#G@>EvSn2cV;DMi(ITJ>rl^`_>s`$4ar zz+Y?I#e>%UFbuSQ^y8onUF$)|oc06g*fYKb9XI1k(Cgnl4Rpc=4v;q-)<JI+?}Fa+ zG2eKzxMnI~qIhF4V3N4ydB9{bfx<RbEcy$jX<}Cgzznfv5a1TEjHYU)xa<?aEHQ|k zKTnL`2$(OXrvnxUKc)J1@%BW(9pcj)0gJ?(&jE{t`)|M!p_Au#iZ1M!yTrF~fV)Mr zQvmmfmgMhJaWQ%uMy-H-v|N<2F87H?_^=h?y{`Zdh$XyarLeJCtHi6U%Nj8;5AcvU zMj?GzB-aAgiPdR<4dRJ4fJa37e!xc2oWik5=#<=##9$}jV=<mRx?h}j2H=4Bf^9!2 zj?4voBK9N!4vFOzfKSEe?2pgH8=NnEE-uJG=?iftmGH3GKy&-0=<_AuEAcq{>}xS~ z4&Xac!tmbr0(GYuyYV}~&thr|z#qcf67Z+!`v%}IaR%T1x47yVz(iTM8Zb$|-4QTV z{>;}-mp@;E(hONnn=w=VItnmb_B#%kBimEI=gVa)0Sn}P2LX4;8I<9L((eZ>mS?X8 zERi{E%AN9wVSu~j8#@8_$ff52?v)R+MN8$4S%77-oc(^E+<Ylug*^TmV72T&2CznE z(G))@JJEtXEZ4O`X}zr41=t|#6|d#Kktl7JtI3H+<+kepTjYyu-&PrF2Y6hbc01q+ zxql|$DcO+{`LvvOF5np?Z3CW@Q~m}#FT2v2ctL*TL1~+OgYvmUPA&($B)3q&UY3)( z1749ovx2Y6#WMgqW#v17U2+L|y<5IX7VMGD^8s(jYlZ>dlpU@Fyd|gq0(e*6K^@&E z+f!xUlYMUk?3e9Wr33PN#;ZS(FD*jpko<u)`&^EvM1CRLHU}J*GbG?k`4?~hPR?!% z_+H+a3HVVy`#9hy`N^+<qq58g_*K640^oO9{3Kwuef%kaIrf=n1LoSFrwra|AGRBC zoBhs@0rTvCvozlxAm{I}52le>XkVNSSY(f-FSFQw$27na`z9KWJMD{B0q(NLP&@9n zS0)4QvH!)l-)o;pW-YZVQ+uEN-u@`9uy>#`-*3;$1w3Hiz(%jMA9@s}RrV4GV72}8 z6u=sL&uxIU*o1>i9<<j|k{_}+KOgY0{T$xD&YnX7TW?o;BsSQ$R-yEW{WLaZqrD|N zXOsQeo`B8v8D!6+_9Gtww%FIK2Rvr~aRgwi{c^f3kJ~rb0iLoq>j8M$zMJOh8T-~U zz_a!bLxAV(K|b?&`~0r}FWAd(1#Gj&rvhHIUojA{-CkS+*kN}M2E1hdlMQ>>zP$_J z75lqC0A96!O}}cVJ?|lucH4hr|Lw8g&4;~i-v-H24C_1XN1W(Cl%qpVGfH&+2Lg1^ z?~J@(wVgJ9X!d2Gx_lq>>aRHNlnr7<D~3>r>d(6#bnG$8!1zqE;l>ZTf=&~8#elhD zBAKy3tey>6BDzwX?h|kB2donDYs`AcQ`lj?v-p(EWo(syz%8Ix9K9H{f7}+(oR(jL z=GL({@}3?7n!ks?7UVq#S~8Wvg3>=Y2A8#d31>ntQJc#3J3vPyehNDB7-h4fGi}i| zvF!0t73|{5xg9}AcRmDqZ5efGLJh-3H!&j^apz1{XrB1K!mRCi19`9OY;ej<N9c7C z_1L{~2dF1?4`{+`Q$dsV=YUoY;HY0cg&kA-Jx92PGwF?tOTbvG`XShpB3k%1xl^== z^{DE40Ccjr>_NaHac&%7t$39K>{gLN1==AVWz*gkzGT2BA`J#mJ#5e+jy}b&TnIXN zCbe?NgI>@p2d@LY%E2ZNU41j?usT*)pFs`0x+5j5<oThX!!Mo>S~`a=NZIk{aU9A# z2ekaIOF?V)uuHF<_cCbhM!vjmMG0vATV!2BZ@zuZ!e>Co`rZW{_c9xFUBZo^)5OPo z=yb8}RFr0jE2$2*h^p;?nPOf%V3ycOF_<mlrvT=NL9+mJ#S^Ujt>O>1`8Khcf;>+Q zrInd4{-hi%5MQxIw~H?d0C$MP?7W5IkH-Lu#BeIyVzF>8V2SvBCE!lsrE1<K3SI}? zEgC2n_Xw{KrF+HSUjsIXQNI8l5gn-;8^!K-0Gq^9PQYgICOhR(;hqTCBKlAr9uvoV z0=9}$R{n9ZaxvfuaRYC7QnaLoJ|#j|0iG5%!cLJ)PP`^Y(G=_w<?jLB6Bo0B?~5zC z0X`F(Y5|{%yXcyIC*~%i^u73iZ}>s1V0Hf#PiTN+Vh)F+Y4Wz2fax;L0hl4rJ_uMW z-_8ask^R^+cgjIe0Pd3e`OLfJ;zv-rN5)+ZxL4je46sx#e-*GyZexc&C^zQ;9+EF) z0UnkQ(0H$tdpX%&FUM1;H^{B*jz{D|_Vh;i{uO{t((@f)vs`-^@TeTXKH4J3kY|s{ z*brc=e2r4@xExGQyeyAh1b9O>u!3*O>Fmw7<UA_O+wwzp$Ja8c72t0<`WwI;Eh__X zul9I<Qvse3`!C0tC&jm{^3!5G>+`C3@Fl=baqMHjYvQ9hfL&r&IbgR);1IY+1V#g1 z7t^U`Z;1LoQ2I#B;KM!^@6!D27xz#S4v4mV<~QQ6-vLL&z@Gu%ifP{hz84!i0DcgI z8vs9w-0uND3HMIG&*HAmfL}z+Yk*(HPt?xe#Kon6$+8!n=qYjqE%#J8idJWue7qB2 zx?Ft}uwTCN6yRI=9((j}`7?WMuJ$K2cd52*8(^dMD~!3a1I_nt#EDjS&^>PbOoGXr zE3SAJXZv3h51RAZSkSz+yfMEWUt8e30mlPcQAq=@KaJy{jlEJ>PaP?GlKnhzT_Wg} zUAu$UyVY8-SV?WUQ`p$n4PqDBu|sqX0zMFnwwkXF&7$4BrWJo3)%*d_`uEd8$9%W~ zbleSW)cAKP`4gUHrEh#O1;;n#PX?VReyImc7XGP#DdN?e08>R)8^Clij!Jin=(`Fq zQ>=d*Fk9p(?ug-+pmdukz6LN)4CVl~Saf0OUa^(Ev0OaI9==c9UISPmd_1{Uv}b=m zC_dtdvPGQAhrK9zUkrFtyuel;5J!5U^sQ)^0Qgf}!v4NR`Y67$WX=nKyQFI~;BGmd z&%8%|K!LqizW5?wsr->1;WF9w4wRP5e$4^*$u|jGWJU$xIr$l{d|s}52k?R%%l2)P zNBN=`<@mmU?edr7fE{x9Ie?esE>;OC0ni0_l0!EEUX`!&VLRpVE`Zl$kq59#e!By( zTRuf`*duT03fL##IUR6Nb~^?*Btv@upUJWffFp7%8}_Zd`+UGp@>yPjDfe4|qq6o| zz;U^PZ<wh4d?8?xb^*tR$=bR<0aLUpHf*Z4^#EX+cIF#^8QMa!ZlSiGrgw=phFWot zwwSj1UTx_@z*224hsM>KV(SL&Pl^qKm@$BDTE7bbJGF^??c3U+a{(V{zeCg=9~!?M z(JrP~AJe8%3TD}#o(H(ge%@1nhwaHpfamQ$J`Q-t{sIlo*LEFAB1(Vuig#*p<}2}j z3E(gB{4~IA@=Iuy`u);nY*>E#`#=kFTYwITb$|vE+JOcy<Esj7eL;&3(OM3?zZs4P zjm`%xZs`Rby!JNGArk|jS1)1DmE1%rAO7`upyfZYdZQkW1+Cmc8#j6~udiB7A)F*S zvac41`LCGuxqcDtz=R`ogl^c|2FEu}W#ezUmK>ZUwvlI(Mc2y!Q$$QUV5<0gC}6s{ zlb6pBrBu6_Vt0}GNV(UI^DX<3>8&n%(>&Ym4jPG5gB?KIZ=gZ%P_hfO<6WPaSLAki z9p${)4WRiio&j1=$YvCN@u7Kze=4f&xHA0;Q2p$yKu7d%4LWimO;Uw_CTQJe%0vBw zm7rs~@cwa6JqUW^J->q9EY_Y0m?UBikK#$*vP67ABYL;^Z3;?D#pK0+`^BBK58K4Y zS%8<tEiVDy7un+g--?n^fQho|IADQ1?Fe9{yo2JoRZgN(y&@;Q3;0kza6RBV>AxB< zNn80TV3F31p7I*)lrpnnJH_j4$7>=t4zNqyNHN$gj;sdk5d~D9*M*;@H$-RDM~PC$ ztRHZq)34x$O+tpGZI>NX{MovdP2dlw@lW*Z*{iO$)CS<ub#?Wj(faVZnqD<^DSByj zZGC85NpIcVtD>s3vY{+w>s1>XU0omQRa{Y7Q8liYC$VQrFJDIgUL&d+dX?0U?uE0x zhT|U|R#`E;*ND<mp6)SDUEU*9GQ6S}Zt0o83&Q_zdd2^Zm$B{tM_boxbV=#RimLw~ zS!%J(R$nnXRNJ$Z{ab%sO-L^bmG>OU61qX>nK~3Dio8&-v<jnZOY3Wmg7E}(Pi6H8 zy{x3Z#CSqoeOW~{4mF!iFR7}lFb=CiW6|5jacOl`dBq4EL)t1rp-_1Zjv;^Lp_2NB zTJ>uDg69~ua;oE!THb-<+EA#f-ncnjQ(PWC#)H_Ll7`Cq=yR3TrK60ytmfe+>k#)? z)i&N7t}9L($GD`V5)WZ3(X_hy+KMXHDEb)p7Wgx85{%^YR6ULA8^^e~p`@0zC#!2p zYD-3k>O-{_vm+<;8tWXd4;RomC3STn^#t}#T|GF~_)2}`SUjFT;$qbiJg%t=HI!B3 z=F#SlwV@GV<uy-5uF;{Ck%!cvrS%jKJgAf$!(q79X$=*XWe_E!MRlbOBPy(0jY6aP zgvOPIYU(ShtBj{XC{T&ftP}V#x}rKouMCx$&l*uvQ5|l$Q3yY)t}+y&(6C0hzoe>+ zOdwC|m55pr3-g9cY&NZ($X%M7BRjVrF?mX_iYYOd;VU6_5p#*wV$z71elwRY>m{AA zdBp)=mY!bVNzw}o(*hn>=NeB^cbB`nt1JGwO5;gz<mqgST<OmX7V4QkZ(&iur@Ncp zV%_KNY}12-gVu#XJ=<l|^&D?{dQq<KD+u~?^7C}v<sRoL=#k*b>2DickRR0hXSm!w z-3jGUuS@r)XZ!S^e~3@_XP9sESQS)n1Hs!$szy|X^qPwL(vdoZQXf-N*$}FuScYnA zU9oz==gTYXaj9;ch(l$HjLKxD`3q4KPclw<3(|vnLOhE$-J2Km>%qbdZy-z0)>ZX0 z1K#w)lT<%|doy$Ly@mRq{6L0|f4%@7qMJuK{=&i>pYF@c@O#l}TWxhE1Y1?OyrL2c z5h}A47kC4DabaP4K~PW9{dt7}S1}H8!lTEtjOLpfX<S<nOwqFn{Q0_DPxA(S-i(X@ z*y(e--Cq2&jV>>(sjH2RbH!fY0IM{jDpclzT)S$)m_Dc(R72HpOm$^ReFa#j$GSR? zuB~g%uIH^+Rdse<;_BS5wzDgiH^sT)`j~g$5NFHu<^+9MLM?_cWcUX9)6qRaa4Wx{ zz?b1d_Lvfw%z|KgKo8{RXZZA7Z?L~BHo?`muPgdAxF2UL3W8sOe7!I`fQGRD8p~Cw zC&3iO1c)Lz#nuPBxw=OW>fU01Gz&8E2M(Za;9o&*k=x{+D<Q>Zh=HDyoaoiliZWws z>TAIv1&|HsXHVU*w|ZrAVu?Pyp*$|~z5&4kKe(Ok&&rPCb_QN&8|)nfdC4luLDdHO za`Mytg@a9LhA@Licv&XeSeT!$2XnnSIWA8;c!UaO7G!x-ts15#hR=DdbII`#E>l+h zVOcFM@&*biAH{=m4c5BHvC(dKLZ-p{tb%~Y?W*;-Z8~%<%OHh=3w*B1>Z%cnggXiP z67UT)yU0B*)9fVkwCW;5K7F}f3aA^h>?_oRIp|%FJ9l_Zou1(z=y4_CWqNQBy3ai> z9(A$!4HZuBkN(QbNK7?&uG*QA>kW5KVzRA>Ql8`U1`AVBm10+XQW74QnN!FT-lO}9 z3m~%zsW@9#4z;eXjjdt#fui@yD@#Vyxh`~}2EITb&UJo2mz#Q?;Y;_#r|Q9?w7mQP zc(3RBmFelJ*!3^O<Li;^NleH<M^Vwx?hJ3CSI^JP4EhSuLU$r$%<Kn>crInVFvwqw zzxXhN@ryURz!mEuXXBG0RAI}To)2Bm&(Xb^J{_DkImZVWl2@#_><()gc&j8T58Twz z(ENbQlbD#0W6R0UGAc-86=tO;S@AL<J|#KDdTWv^$$Yk9Z{qcIh-`m7dx$IA48_y> z;HUn2X23T9zZy4D^}Lz>u<AwWLuRVm-JAMwV)F{E)+L(E3A4^$47L?#7C|Y(oTDB< zm0;8KTwiXq$|X>}@z?0~jNCBSA$GVIrU-*idSM`^k!3*j_-BJ8WftYdR>2+VUQ=6L zUmfS-u}dA>>Z>cO$A)TSb-gqW(i9q3AA$v~u7d2vUXK&>398FkGOrlt>SrAHaaGhc z)YODH;OOJxT$j0GVRQMAajqV&i@X=Py16bYxd?VOe7+BiDGfwnZUEKQ3;nq;6PaFr z4$P=0K0Y}td+5;&nAouN#d{26Q4~z`L^qNnK!R!{2d{Kg(-Y=ZE)1tPK--j`K^-MC z@Ru6ZUwN>n>FK^8xMv7vV@vER#o((*JS{O)BG;Q@nW_|sRWQ9M%b$*C^ygVv5M}qx zSE2KwUX>1A&%;#%p_8a+jz13r{h+4rOTlpDN$l>z`(Ouia*Q$9w1ntuQ#I4PdHvl~ z4JsCFU$Uz<*>o!WbSm6Q<u-iYO0UOLOp8D}V3?FxDtf#%4h{Mr#v!)eY$`{E^nxN! zqn5he%4}zNb<@8{fH5#{@a6j>-DvaxtaPy-HXsPoRjB8~O9})i0H|yb-h^osl%Rm& zFxId@pjrN4A;iV70!eB}X<R9HlS)Ap=)FPCiZLVw2g7u@aV~6(pltbp!Isyi$2aW^ z<#0g)l2vD*gOd|=jwz6`@TlU7_BY7wG??5*2HX-j_yHIyN~y3>L%Q1>(z6Q^l;Y>7 zH!=W9`!VQ7Zh{7!I4s928$orV>&aF}`6uy-Ikt+rx|)*GkfFn*RBOGmx_VSYjXHUu z9^~*bC_NjMGaK2YX+f_ZH6%w561l-a(S4kV2NgjW%&Q>`x{l9@8p;{wenx(-7cyz- zAFNkX{#$Mk-D~9(=VuxNyY5O<Ha`=iCr!RT&lTGPm%wIVP=%Do644EDJv?-2f_j!O z*P{>e_J`x9oJ&^<%z)JoSvmP>-W<aiS^W{^WoD+r!%~(uQg;rGncgCd*1<wd4uVaq zj){euOrYw<AcJm0HBRuSjE)OGx4;+3)YAvUR=^+?<w4w=KDajx1Q-*3ura792P*7D zyD?lD?KIyGHNxBTFdN~7#+wI|=Yon_4DiRN8+RB_KrwQE5vHgGb$TFFQWgk}h)pZ0 z3wg`RFp;n8j&go^d0hxLAMqgFUzHFa8+}0>27uVeMN#qvQ9zd#6b3T<nVCvobQer~ zN@8k4aw0}<2(amAr>U_zFCTgghGe)f^jk*HlLUv4PE%DVRHo~g1nHF(bu@Xfv9J{` zT}N1|H0nGAB*T}9`3+uAsZc(yDG*5>+qDfPWiAqBH-k-VZ&qHBE8V4{SGHof3We#x zKv?SWQalF@vUCR{p~-u`M0GtbF!&qwTHKd0z_Oaj391SO)pZq|MypzwzHpOCq$jzk zzp6yKH<<3_e1nsY{DMM%eqMN_OLZgHF5JhQKUl(@T@W8OHqnBfnVC)tZ5R-YYe8sj zp^rAy9HQMR7^0($ZXu?Nu+8CNTG@B_9X1_`fmtls410nBgY#MX%XDzFy+Lp*)1Sw& zS&i7HF`?n)&=!P#N6d6ye!&T*S&frW15Vb>oBe?S2J?LxS#ZDd3$r2Os#^><+wcwX zKEpdSe&HJ%iC$^t_*g`v8qFk2N0!w7`&1HlaVpu>({vVzIVGo*>WR@a%1G-9@&{p1 zqx05S)k_(iuxyAL#WDIs58?@_7{gV3A~-lN9lqG`SabST?Duot5@i#jHM+jq2yeyK z#ksoFg}o&@riFQMOfC6gH(I>S@CR}uy&UgOG-8Z;MO6jFoaPHoNTRDYy4ws_$6uI} zrWfT=i!sDE3Av=Qg^a<V7tN_fK1`q?&A0`wQciw;0c%8u0;5`iKNAEKGH)7V3~EA< zl#rT(j)u3?D8`|NonT&CrqLig06vGWINhhT1oCLiAG~S#a6+J)lsUYDrp9=DhAX}| z6v(VtnzsmYm4~Tckngs*q}0W{1oj|MoIj9}38e^bdK>5nnCOT_b|ogDvJ6=2C8gIk zRMduIS%ARlQ078?U_LbkJ!w7^UTk`{Qtv>R8GJgtUTT?TLk)w5nMxz~SWQt>6_u&S z>^a~|Hv%>Z(Qb4~vQN!aY<eaK(R^CxAmRpS3B(}EWih;uD4RhC9Al$tGuS<*;cn7J zN#G<}mtT<P4WxnHG|`BC1pN8*&|Mx6EDQS3G`f^?#LIfRi?Rc@pwHJIrU;Wo8-{QU z-;g)M6{HEF!*7ja^cLaLTOk@+oZK`W?j?s9m*RQ}f<L2&>!l5~`sk8zmd0?F=PS(i z1vt@fJl}Wca^S{<-|dQW8KS3zQQQdgTgQ8IAT4|^Di|doh^hGphQ$Y5H>zKp?#*jF zO5lVQFE~+jGyMaU%)%TS&I4qxFuMqErKq6Wu%QRTAf_2$I>tQAHZs_$)?|Qe%<yN? z8b<4^x2V|AivRR&;1)w`3o!Em#}Mm-ka`2I1hX-Qzkz9dK4v)__YgZZ=TDI~vDYjE zbMmmB#kWj`GN_v7gf22XpxI=FA#7+igA`$J$_h5*<zfPFL>t@`XC<!c?S}K@K6ymI zeL_UQa1m8_R7F_fE(ZgJ`MGHf26_v9{}N#vTUu9JUp;zw9b&R2^`SU;<RfZJYDWHx zM;@yeOwfxa=s6Sgytp_nN>r7OuBmXT1Gr%*L^alkR4bR1@jA?Dn_Amsb3DOpt}wSi ziKd!yBNTrU2k+m#yAxbHLkFV`j3+vf0Rxk21TrAxi~=T8Ea(&<P*XoLR9~W(Rbwbo zy%LrlGt`;^*)gX~O*OocH$rto*fq-fV%p))P(y`3k27u;!yC0#Fa;G=SgJ%E*rj_5 z3j_YNqCy{HYlswAjxD*aF8nk2ZmmJsbk@R~>w{O0P%DD`%8N8B7R(5HS5fxB=k^%l zrt5GY(;>cv>Df6x1Wl=V&_`>`G7Mg94|lPr04oGJ{Ub+_p#b+O>z6*z9QioW%1TH4 z0Wt`8P0ihuzl;!;PkBEo%4klLPByDMQCSMH&|&C`QFY5eS%I*Glf<B*RB2QyWBMEM zRbykzsvCw^hT`IT#=~hyOm-*sj!$wYcoICJ9-ibJ%U?OcL&k}SoiN=Cc>77VEJFp& z$&p@!0DQy=M~pJ;jKsTYtqBf<GU(6BgENs|gf)x){+t{{ZP5|BG37SH+bO*h-AY8m zb4^Mpr<zzQ3FN9SiyCWSo})c16eDvcOIo9S?kK5HB4O|g6|;KJ>>f37U?dWz%^X8n zk4BPBD+jx-Vlnx-xlyrE4+7|6W%;KO?c_sRu@_;fMiW$yW+@(wB-vPls|?jfo*dn< z>;gm6|1)xdVOdYl%)&dO2WZuhA{B&lxs@Ns=BmIr9bV<1dr~1gDT#^hl!O#_@1!J8 zvL^}dUZg&1MnwgOHijoTk(G<gbQMR*L{Cy7FcV0RMYOY2d9gIeu%wud2E17+++>WG z@D&U5pzbOz6<wzjLO`m^BJLX3g_OhAsL#A^8zL~HLiK(ue^I2>x)3JwHjd9ldCKuq zL0Tg`8;ju%vnxbptWgjGaYE>q*5}{kJ4)&(-~6)$F#y%sSl`Abtf{y}#ljJsO;R^Q z@XUr{1#nOXlp;L$!%BrUH7sC|(A~R{(85W?jCFKvdVQ^)6{^pvJ~5tP{F>J=dUyy6 zRo2B;<e^byp}Q-#(be5?Ii}<}mN5X=pdf0xU<z9S7bLMVWX&1q+J`-bfxdL*4(rMm zG@7N9daQ+E_&Zp-K-}_#r7sn8Er$p(4zCQb3Ne^#KzyhxR*g!-Q7_}A$*!>Lh6QOe zEX=u5?m%zTfm=<JFnVLM3*VPxfU(4cxxWheh1d4N9T0##S-y3nUO*&K*9U|n4hXea zwu-9{Vbv*UWCuKk_8<s}C{JE}^~k!|3}l2DQ6FDbSw%@zaBNA9C)qfSXTl#!FVbO~ z{RP>Iu^5z97>)7=U1FewuCX<H!Lh{{a07m8AzeKkb9k8d6PDdE`FE9qDT$qtRbnlS zMX!>D=dI*5wJ;*3FrDZoL`vu;guQPLZaMMkTz#hvG*(#~E%ju&Rj5wK*qD{YkO<~4 zS$Vna3_W^cpe&IZyH1St6sSQ5;)AJc{{ojMsi(W#Rx`3fxju$zO10ug;n*vK55{7l z73~Dy;HaD=*m-e$Q8!PKTJ5L3id@f8EWUSQ@8p#D-bqDK<_F8r2&yrxP!vQ&#uXc{ zmh2E%h{y#@B7B`FV~SCM>ryKI#P^&m_T)}Q?5U)*G*oG1DJXTM^A<!31|yqlChp6? ztRyMk!?~fck`jcc4tFdIBrDUe7DEk>j*C1Lp7Jss0Y{gS{G%JC=!dHbk6K<!@}x8h z3m8L*yVw-wFd!u(9)n5$a6}m?5tPl7vN&8(BbM4^T=ry|nHl)6=S1gagj;7Uo^X*e z%1@12ST!d)bo8vL4u^V!H#r>dqweJJ3}IIGhOsox?TZ3I%r0X~E0Iam-H0o2zEM%C z(jj;Pt9R}`VJmJdNBVLLFb5C&&2S;8I0)%rNgeNpI%B>YA005@yH(}|DwLiLS<LaL z8KVi!ZXRqgLx$l1BE}EKLd=G6NeI`RY`M(5!kW2-2N$FFIfN*c9+(+`mKG>SH8v4G zdP8k3636tKYL3MtLdc6LVLAwpVpXyh2LywS#^6NPBB~F#BxPAb^SY*Pig7nWnN8}A zkSThBam@@L*W6W*4pGgXSZs>#otl`Om=K?s>Pdmio0tTx0fU%Wz@=WUKB;6Mb7dO= zBWR6El~GwUNDYZpi(yXKCNR#hEUHZX<3;2;W&jzmt4u0M<BFv9P~=%amW|k$xg>+6 z0w(+*8jz!UE$kPWzD?aoq<%JC+G>)q0Hea3g)rM14<L<Zf8hZH>p;Z?O?u)at9Gg< zqUVy0h9k@+z0_WYztnn_%T`%d8(UJw?3PIWk6NPp*90Kk#i;F-T|GnpDQ?SWM#pW< zxVAO(E4HSpP3&W$s$RBtAl7)XENzCtPa;@h?w$CXH6X(6Qx+DJGOqi>##k;GLW2<n zNkn!c=QQT<V!9-j&@%$B9D=Aj44uN1iNiG~Tv5&<!+OcIx0s#yieXz+G(T!t_oUth z=1*3w!%j^a5@A@aK)^c~tCCH98#R_2YpiM}029XuER>UrUmi~qSA!yBgIbZ`_+V)- z><ZfvQLA*gX#OD9LBjIy#yDWH%<@{*?bgYFl~$yNw5W*}U2E$_d<%V8wQi7VO(4Sa zQ6sG-(jCw+!&S>oLxgA$)>8f>Ks0(d;zMIgt?-Z)7=wZ<om4CSc%+exV+~%0_Jw7K zy&Tnv%HsliB06e>Z^I@8#mF=pzFmGpJ!a*;ST68&AIO|S!^czSjk7M}wBnRGJw<|7 z)1{|GE<NSw^`mQ$Y2v~_j!UsNt=znmD0ftysoX|~LMj<3QVDOtM#5>#W7sZpE~3^h zFuAveFx6(m&xRZ}S>`_>@zYx7PvSDO-{<ooY8sWo2<0^yOk=BJx={lMhP6o6mXTk9 z{40dCkZ4n18N!cda3+YPqI4`uCNYp#f!H16c%^0-PepOmNKlB^SqoZGU7v7b*XzYD z%DyFM#+1MebVOzZI@WVAo=0Y<U_Y1L@(`J|*af*(`U6Hqul8a5;uPEH22TP<9tP}E zdxsy#H4#L{jk<BwHT*<;mJy~tGY<}aqr{`wi&gGXoSA&Y358eXJP)j{DD$e=8;0%c z)q1k=16*CokFIxj!PjBdj1GewxskKkhB|mPCrK$m3TFsO=T&`NH_*E?7SNC?&^tap zAt5E+osgWGl$er|lnN7((*t2QcnM7xiEy8Kbfc9ct~KHZa*eD1D(S*<AJoLU(SSu` z%Ft4jZ8UvgV;L(w=j6-$n0Oj_Kuk7(`NxQxoQS}2RKgZRmM7+N#Hz4yTwK3?I+|oe z<&0=Q*2|+jC?i*u(Z1ODR9?u`31o8NMP0g#!#||&sx<?+#F3~TGX*m^kA(Z+XNsZu zXjtkK#4MQY&n&c-1vtx6+<|j|C18$fxlCd*)hnIr1aMr^3z<R_tz(Hcc&;Ut`gM(* zYDlJvx<y$Ja=JJE85XZNgW;yeSr1TG!!G-fdWQA9bi)IKD}x3VfzhUi1V-y>{!XI> zu}&#B{%mEVvCir`SxT`hwljXDC&B-99*vzcwbylyIG)rWRwyz^P%h{`GIqgXC*511 z63tJH9$9%yMlvzXX;xvj!KB!fNRqL69vvD-H&P#i=~u*&G&_gJGJhZjSIgfwwLde* z8_c!_P1rC@p5TVVVqr%IvMR!!O4Bfrl^1I+lbLz3CuFXnw-_Oe>MYJ7m~Rj^cq-wP zJs)8avtL!dbdEO-!KQ)$ma@2F9~K(Jn`a7bL|~NpH-(B}A1)p?x_}F_hT~1AJso+> zTpgqTk?GIOH+ev>!P04S*`Z10IS#423Ubt{X45H83Nyp4N1PB|X!J0I7x*w!HVbpj zm81(#nygJ-P+NCY#x{CMg@Bb6($launn$Nohu5h>J*GgrZM~Ed^=c?ZMo+KYiqhKZ zbjAQZDLp)?y_ojWt8Q#Bu6AID&6r*pq2Uc9Yy}*{%PMMJoqOS+vkF9*Nw&#JNeQqf z7N1qfFQEyWqgG7K@N%P8GrUX|LN?SIx#f%?T7kN&R64Z~+-Myk2~ptGq*MTWzr;|F z1a~U!c6hiqVrfN;rFofg*C?8&;zq7gc%95?RQCjWyGm<&<9%F7F<f@!Q;@6ZIv@OL z$j=~efu5>Xn$1+QsAkaSC^5E@=O9Uq2a&)4msvgNIEN0yaf&vV<`O^Wk72zeXIMj( zI0y$CUbK>Ogc752*425X@nKP8I#(lyiB&X&)sn`>0eoW}q^WvZ*+BGD%yq}GzoO?@ ziH@A<ru0rp?u}KQ#MI>Y1i0*>ZtN6WO+}erz&$`U)m50CtA2*dX|0pE)RKRA1x!Wy z-Nh-EZ)>93F@xw#5MiObth6G34!4^iWUiJv8PtK*^l}S=%j1s6YzA5!q|zJHU)r&- zjPf+BaFYqV%G0$N!-f5m1^|&b%pn{;h$WYXw-?(3uSJ%jnitSjXa0d&Z>O1xNO3r$ zKNb?30)aKnv6_6GEUBci3}s+D5o|HjuZ*dFVHz`IvrOMBJlBs``)zE&9G|a%Zi%^9 zgAqrhLonc|rhACaA_v=Y>EbE=YU=^iExMwtXRx#(tD;o5!tno)02uo}WdO$6^3u`< zN5@Mkh}O22=#``>1q0iuU#2$XBKG5Pl}1O;t!Pm;wz;T11-O{z6nB`eblTtoV<u;f zEY=U?VAO~c7L_zGqM&JFo5~$GL*SJs4S^#8Qboq26?Y&UZl+r(Hw&>Ux&dl=%ZxKd z@*Y*V66t_pi*3mWHdGYm2hjc2kgcNFh6dtkhX0ks^<*>56TO_Al5H#|11Y6Z>&0fW zuMt5EFBu0_1~#~tXj3y!NVB<4WXuHAel4|fuQGPR`l~E8Q+60jHL~lh7g#yTOqItn z!-)~9aBrr#jO@<>H4r1Ai@tzLNx^oTs5r5yFjjY(eDS14OeT0{83}A2u{NV5#n~z= z%1Uan&R<_q&mGMckCiuyo5J21ZHW>O6>P*b2jQ~D2KdCEl^wRm0m}~13b4}|k5_wr zU>G8u9+uI@`HKO>F!HkK9n&(U6(X%E5l_cJ89?wfpAUr27ePkh6T#jwJIaW+UuWWY zytb}ld`PdyfMjOz`l?E>9M3|mA5L9KRcWYzo5HBPnB+5mx6uzhE=@PK^G0bsl6ozk zh1nH{^|&Yt5dG}``4QO6bYs+mjZ{0u@Hp25S8UWzfntoHI2Uya8U8*b$-rD$hFncF zqQa#tTmFS{m9^g{%GA(k@Xxq_TkWi@aAVJqxittQjrpe>B1VHSYZ@1}9^qAturR61 zkwzZABpg38F2Nv{lMdD+JEgXvrrw`{P-b}8GLz&i(L_>p^p(95<6IZJ647?L%8gPW z;eJtq)4Au>OvgkHN<NZt|1l27R7~DuI32<K%)&wNf}lQq`^G0ku@}sXtdvD@kWRf3 zIE=P5Dy*P9DR|<Afg&Gc1&o|9rVKl1hMiT&HoWqsmeo1hS;>OTzQL*)%_Ik_s2OQb zPw#kl@Ay>Y2DnpFu~;4Ik;1VWc^kUVo92hcVfi5vSBWzDu&MFxbX%TpkaDEMix_nI z(=0C{Dc)F1LT$sLKYBO*XzvD9HCMRQ<_pLhSGPRaeG%?SI?0~KduO<a6Bb%?^-uu~ zlA0ZdAB(_fHkYumI7*)%LtT;w%h=?n@=akV)S`eA^AoHC1_xwh!<r7FF)}h+P9h#E z#DYa=%1Kk-Sp{p6ugk1!v=-BzcqDW-UFu1op+?u5Q$V_C$mI;LyBX_k0W><O56WQo zs<0CNyGJ@Yf$K<^oHBsx>g?(1N$p9AY{FV&-))i-1!FdE?6%}e`@iJi)h4F))Jw|B zOffEoFN!)Schp!?iE>VjJ~1K)jeKbecnVEK12XWqgQiAR4=ev(Yzsz;BG=<wo`fVY zAuP&j5tpq{RtZ5P%)2a?Es1+$O=nPTa19%cL~{gE`fKbTvv!Ud9h82O4l4B^p2<uB zRK(f{YjnX$qh7|wb%Tj2q0RD`kcRJ}iVn=r@fIQg=d$)r+pu4{qO9T{f*`S-)z8f< zu%jC5aw8Fj2qBwJSL^hsl#zVgD8NePj7J)(Ir(J>Gs|nufKN67#?H3UB^cXARN+XO zJ<5=kG8An~PBbV+e)Skc8zWkWiO)aUG9y5t29@XqDPzWDWsV_xnzI!IOw?j*p&nT} zV-3)3wLGZuZQ<&eogGPaH@503@6J|USzS_Z-hs?6%ezxE8)F^B+&C2-@lc5j=408} z0j%1%ddGWUiSa0Fs%D0#)hsDu3l+b@G8gYj4{K%<v(5}4b3nm{!&2-xRCdc$qZ7hx zFaXA2)YJfwRs1sy0e!_2_c@wv@xxmTR}EI$c%iYqA$ol_Y(R~vZ#ch9sis<OMGpq8 z4Fedx5t+$UaiQ3%?rK*xH&vIH)#<}4>g%qIt%~cFmzhC-Yp81iw!3<A7-WmZc~@7L z`3t=b>^j0IrH`e4>-G9bx_Xw~i`ojwQ4Yapq#e>vhz04H!%eq*fN7MC;6GHMk<J%{ zx5xd<_EhM*3KK^w!M|y|H4bt~DPCoXhO@$HseAYA{a=4RY#>eKPI1fGYCMZGg5Up` z4;XeyRKATG`<vP^wIpNNF}AC53M)N>@XiOWn3zE*%nH;BO+;iYH!WOKTxq#<jn-`8 zn<aB;HBvcqr}~h{oD%atYJllW`|ARs(on^i5NCXilG9x0M?1q&t~0ZyE$v4r$f#x< z9N(yufnt@75$EcMB@I&zaIJMZ+KW+|%U<*tQ2-c_@P_dyra=~5kh2pvN7_`hi>V{r zNMS6|DzA((T^TB=t51bc<8wR6lrE!(VObb%N%01Z{SA?@D>xX%Kef4&LAY=}8ypAq zxea4u6G~PHjvsHp<{@tJHs7FvBF4Vo=v5^~sxe~2%SyD|h7>Gr;S>b1fctpT16VwW zvRjON@n5u4YfZ>c5=^sxQu8>&*qBeoI~s4W|Hrqg`at;61K|J*1EtZDm5HH%wT#X; z#IEls_CWaQ_)x(h5b8S=QI3k*&dM$}b3fGQ5s=iT*3N^-iUu#>d_qgP@5b=wv4Dm3 z9dja_pdwc0ZX455Vdjl>2xPs6W1men6uOZoWy|&FBUjFsVdjlk)BlJwZhhqjQGgNG z)mH1{1~LgOs{KvU`%bpEPlaiXZP&q*#6zGDOxnlvcpMd6h0dF%i$<wk_vlp7f8W=D zZLLa4%|umWdn*Qn=qJPtJ#k-a6}O;5ZPYiXVAVO~p0GR?Hue$EOyv$5{exJw?$0gA z!NL^h_K{FSRIoStcSA-kmE>9)*pitZ`8Wha>qZ2|umIs>tm<Kb7$c4uF}18XW1sOS zPw!W`Uhw;jT^eCgHuF~h?Q;eQ)ft-3x0v63IAQ3Ho@qx0Z)_hz%1d`w&z?OEP2d7z zqsVn6E0JPArvkiJOCu4x6;9e^3^be;V`R_6T@U6UONWUjT+4t0ah8gzo<x;6k%NMm z^^4kwpvKUsOnzhVjSBIE=efo&QMs6$C>irH<GTXk83Ttn*2mm1r#3+Qi=lQ_;DB4^ zdh?59*d}b5O$Y$0&QQ1&C`3T4AV+=G1gonslaMPcr=>H15gs*-CA1Vn;G%BCmUw-L z`Jt+mgro!pj|~yVrSue{+JPVNk(%oAfBHmCerEU+HD*Fl#$cp`Fd&!%pP7S;sRf8B z<r%S3_4ybYs>q02Sc{L&jjpKAY^bbkJmmg=7;y{L=UAE!xaL`9&0%h>(2*-ieR?1& z<YP!uA!eXKe)Nc2-Y8D$ix?-_k*f9qfnWeLvKi2JxT1c145RSBozV;b%@@T6_|oc{ z>tf5g!-(nlo)bQ|g{fEc>9DByAuC}wi6d`>{YFl3Vg3+bAm99kRXj3+@wrBPDYBRG zX~5Fx8<0EC6awROKfSrNO?_34sR`WHdeQ`i$kw(AdKx@wOL!u3M6R$3N~D^6n1=JW zIDDSQjBmmV@8hBm?z$N2kJK8t>_#!JrjM(<T799WLS?>!FBPu7>c;AFSM0@jI?_qH zb;D_d(bV1Dx*1pAV1*Nl8IOSj;8yu3498lZAfpqYf;Hye6YB@414jd_lt%23DdNUt zo|)#x3N$j>Oz#)z9&`ZIo^Na8ca&yFZ_ZYWdGP4Cp~-qDcl;TjL}PR^+|gVLP}4yV za$K)NhHPEbPz-y3&oAV|1I&j{$Gq&Op1AeB3HWOCH>^oEp86koG?58r5QZl#YVjT} z>8s%~{KW=1@Eja0Kd0&bTl0fk;r+M8LF`Zl<D>i`o>4{R5aBm$!Qm%gRKA79AaEx$ zmDwTW4z9sQXrE~>!`jUZN7jWSjWL&`8|UKXC|Z}H1sL49exnvWkPy>5NoB+oMYdM3 znbwk8c%?8N>kn3!<|6x@Lw3Ml><XVVhjEPmeq-M=mMj}@<ooYUQI<<!4F*W=L})5J zBtQ(Xi(xQ6QT1P6?qdcQHj*&x7|0*gD32@h0V$XDJDzIJbB)baNFQ=>lNL0(6qAWs zM1YLZ!BActM?PcL&vhg01ixf9fq>CMO|F}Kfx}>Ez?-2`K$L;SH)%}o6`wRTT|i@h z69-T0a{*?SmJxAFO2Fh_FK?(~Haxya7>X@7zN-d^)X0T;V9A+ZwQ?hy$K0`B8{)Jm zgwN(7<Gc=YzgXUkyZ9_+F3eO~!#8&&g(L8(T=b0Sgf|agrLsP)7LVYLxvm^>qyJ&c zq>@}nC_Vf}aY-M&U_-R2OPC`;X5E-L^CLB3A;xL99{%J3wFT`AZwE?%jlxQhu}YK| z!pDHi{MM30-9H5UkoANQDZ2PqS=-%JhmR?ChDH5{1gX0E(dA{hw65m-?yl=AYj60M zYe(1Bs>kyCjCyHzR~IHf|I76!d$x_U^pdjctab1v-z>x?oZeg%#{x=xeD8R}!@(ko zwFGN?C-Y>V@$@7iaAj?<H&^(YEM(AyQ-*>c<fF%Am;uC2%-JC4y_oj0?;A(TPMQOO z558EI$;_n*_bP(VFyiKvIC2>c0YpGS^kzPDD<7;N2Yu8c!Bv}J+!h(?)Ual*L73|; zn2IBrwlF(C1J0j$x4E_iWwXALdh+~Q3~nkYZP?9!_&j06kfLc}LwEAHwWUm^J5K%< zz#1bA3Gd5PJ2IFYCX3M<jiVXplJsnbP>?uf<@2iyMfHKL@GK<UP)@0fy}ebgC;7%i z1b(FvJI3JrVYpE~5FDk(w&LVp_lQc%u%;wXS7;~37^LRH1{xa@%?L9W9U=)l=7&?& zXk?5{jk2ediD2q<IAs^fj7oNl4_&Fuk4EjY<O;#De+Y!DZ;ZNaqf18U*C{%l?imtS z{|A?q#{HiHsQx-wYkXzA%$Q(fb712WVW$ZLr7<lqzDQzNI(9?U;-<>^;>yUs<$d9s zsu-xEKDtEP3*peqPmFh=OB81tc@Rh*q?yI$k>MxoIZ;mMf9*LL{{ME<iRwG_4Ohz= zB^Ij$|70c>vj-!(8|mDz$x!MXHSe~hw6wCi?w`Iu6Or-^Q@oKRTv1n2S6WeFI`^^G zgf&i`=-bcjNr_5sGQL>A^aLY^gDEOxHgr4MF)k^`x;H-ZU9CPR+4RxMvp1g4?@Ho} zlK8Hq_ab;wM*l-Jm^)$Es&O88aI{7$o0aOruREG+ZCI82$Ds9pd=U$xpms|{i2~z_ z9CXp9sH7T3MmZ2P%BsPZMPqB4$^^l*z+9v<_E~YDFz5R5SW`V=JvE*VOS+3+V2y}s zlevYtcxJAH;*&Z5xe!{1kX4w6DnS78N^?sGcbRl<{CR9O5kQPmS#iTLGrV7Xw4!HH zKoLsE@XC^^QAQUwnY8`a*F<?!<IfU~i@Ok$L)QePe}G47E{XLM1jaAAs{SJNEm70g zMbJQHfHZb;m0BB9L@v!(PBs&uqZZG&IZXw2q9Qt&$D7_6JpglU#!BnsbmjkP?@Qn; zJL+=Jq(c@G_9ZL<Zzc)p$xJ$TUmyW`x_f4t%uIK>r!x}>-rT;+q{&S8q`N1XkVHX{ zMRr610c8n05fBiR9b{8@ilBgkprGQDRZvt=-uM0Mt8?m{zW2@~59R6e{xbQx&Z$$U zPA&iX*MBP`3`wl&T&)l}4QKe04Z)yN14TkWSUAb_ibKG}PqdF>u*xzt!%2r@P=#|Q zaGlO&Lg{fp9ynlQ3{JhUXTE#^-pX+LP!JRjBWoLz@n_0)q(ma;K1#h^F}G;UkqNKd zK*%pRI>bdZ?F^V=R7tw|vsMf@ZaK)au<mmuciT&!fd1m5oXLT}(4gtfR4bHUz~M%V zE(4PFUvWLZKz&KcVy__j`TWen+{Dz}m258e5n#=XmO9&jRK?@@?s7OSWVVI&T3m{F zVKUowH>n0qD2n<0mMz%+#Y5Q#HL-;*mYrM7RFKty(sQp|nP6b-HX~z;Tw<y_#hZ&m z6I)2b2`?>vpp}Oz<`e-=%LG-Fs~easV;n-gcsUkFAP;=GY*P}x8Co@J7~;1=;Ni3$ zKG-MU>iH4ISP8fsB;y@8Ckxmm`jeZ>w{u~x6nuP01i+hPIEH-)sO(n;t&_0|FyWt5 z=CJWs`*AioIRV>QQ#D}R;<Ke4aQmd`<@ME27MapEBw;M}uP&{389_75OS`$0YC&-< z=nUcr5Hk4Jc?;azR{)LYynl(PJHFcpAUCY)U|4AS;IHvy){=tgR_4Ko*>YSLM#i{8 zq^sD8(Wa8yiWa=!99<uGu=QYaBd(64=TPUy%`PVuRu@BT0U_Ms=n6q=zCtGp*(k&R z(Kk|Hf*5LiU{sejXYOzB2&2U#M*|HK`zZ)y3Lf8C%s8jJJ+sc}XoJs<KbOJcf@rJZ zg<a;G6b$akD<=E~&Y6n_Hp19$CE5ghE=<E=0?Ixk;~^_sr1TdW)ES`bT|*+oq}WMB zhygRn)lj2C;Rs-#ZSpkQR%4jN0S8VX%m4>Ktn>*K?&V_L1zSpp5_QEadU8K3ze3)_ zESh40sF79#CTOp61xc~JnYiv`d9hmLorE^n0LK$}S8HwRdUz(xv@L)@C!ATCX$<{> zX1yO_Vdmq{W7G1>&5QHTqFzItLq^1@9tPcX)YI)Y=XX)bZP9AD+bqJIJf2IjUse+6 z*liB8v5(n>vdv4xO{TT2mUi!kVV-&)G-zX_dWZt-SP(CDt3-#_4<1<^U0vRGeSfz& zp0u%YeGXwz>G-;QaH)4Aa&O6PCgsn$gEtf=6(s~8l+yGCL8by09D_CE8UWvoxQ$W@ zej8|gT9Ny86GwYnX{bwJ84U~R>$l+;kdzuFxgIZRW$<Yzf$UU<k!qTe1Y)1kpbb53 zCa5uEke0k}i2j;u8@~;y3D|>_V?Vt(ioLj#QY-U5w=#3Bm#C36Vmo5fdCCwSa~c3! zVX<(_UpN~WEyeecEI5Wu1H(d+I{S}WXdOeB0mtH+VaX&chj$bqf`@6zJft$X=i_^3 z#$BCZK5Zb!v?Aza(hB!}o9<#w(^>+5DhHJWo?i#`V{<!~$(bD!UPHwmr=;2#O)#72 zn1S)dEb>VzR4PR=3U(I^8{5B)?}HtoZ8e=P1(O@mKMT%{nv@C*3<y%7w=n-zk^>XO zf_2o!%4(IE%#tYcH+xaFj7)Q6ld=EvR_F1ca_V>z(v1e*7DUPi4!6%rbuvGT&FnX# zjM7S_^Zdd*T_|Zxf}K6?IvYgRnZB&SJ_-**hzPcfqr|Pz+IHtF*mgJJTjyo<IGP5z zOspzy18yUbZ^j?uJ$mM#YvZbOjQwu{FxoMhM+$mZb#eM@`1uDepxBt>WQ&xfg4)Q3 zIPpXxmG$}?fAoopg!2KvFjb-jut85jXHCtLJ5V4Wv<as4>@MizW4S&no!>FZHFLpr zY-ZdejQ1RFLMCd$PP|dB)ZVmGvpA63B)k*vVR4IPJt&C!CVEz1zAz0td+a40(Xnac zLY<cRU9rrt;Km|HpL4K27CKlv=7OS4*^YsjaOaC<H5Fu-`y#W5_ABIkcO7mc>+n3L zD&{C8@aeemA;(MR3_;twt3KR>R@pnwE~g6&B^<N65T4B>sww`$+(C0~$TmQ06IY$% z$)5)kqwtI%N7fXPdqbdEZ^=qkW12xp1%PCPjc_cQxi5NxLSDG*aj1f;u4~i;Qr@_; z)7RMHG2f7t3{v3jmxnl7bR~=chJBrwH!TQSgmj=sd@7Kn&YDyBc!Vbjct97PgeE(V znMO=n2<xb>x-4VFkJAQt;NP{}ui%r|Gl41X0?(i!Q8$SSsd|Q8MoXFUHds?QW*t3| z7IYROPS80!vJ5eiAw`TMcZ^S9KEVejPz~>#y#iAYg9#o&sW0MrK=>kXI?F!B$Fg^t zwN~{DbHMrAM0S0Mmx7VVi1vb2j83rdLNirEkwL;8#cbpdlLM63^qstfL#YrS!0S8B z9fL2R6)hT1!bdZXxBuataVKm)!Duz9U^OD#MHuqq6WB-gE^tJyJJOayDIX<9q(Id{ zRGcYRb7t>u#sjD76xW>`*Ad%-2||sxu&##r10%6RN6=@y2A$3E${(u+@m1_z>5hCH zCF2(|df{b#4L&4PYUAqseg#mFswt}tvgztQwXK`7InasdKur!#4T_S&Sq{ThyofGL zUbVJ>AhyO#l9@`P#gCdsot4_CMx4C}exGK#q0T2y!v2XZIZ~k){lbd_U6O^DGsQYX z#%O5m%Zxd2@&scIC=5dE%OdupZYWz|aeZCv4~JVB=W8sG{7B;k)G^fL$DBYc@N%&r zHz*f<EJy_Ji78qTi#eE_7K@pa)6XZ=1Ye?6o?R6fTG|cQLvd9Y99`{`-k{nEQMN%1 zgyY$zzQUE>jK8Ec#$t+nJk0s_?t_D^TUtp^y&X%g4uT^BJ9l6oS@eEx;)&=ZUNZa2 zKDN1#ov{EU&V5HDAawUUS}Ja_G6OMEa#%rfasy``#DGcnr1y0v;4I)c_-U94Ivca# zbOhU@ZU|qPST0WI5P8pey^{eSu--z9R4?)8N8VhaNSP^#nKAh{fI`yFl5{3xrW7pO zL6qEh@tB+1Jr1)?E~;YYEXoO`&<Uf+ZBvHz_a*=q{(wU#4m*Iw4bimwMZrKW?{lN6 z6b5YL>IR1}=xmc0vv2a)UfJYzviN{*a>h7YGR<Rmc0rm*kuBCJmAGgR$pc!7cBoYN zxpN6H%%|pXVCZGWlg4q=?2sd@+&ly&V4T&|(0GEX1Z!pDFc_QlZZzr0)1>3Va@G1> zRkuw-f$LH1uwb7C?%PbYgUF3>w2|@{LMB%$)pDf{hM-)nFxm)C(~8$!h|;Y$c>oJ` zJaco?8xL#(fieLWg4G6uhX+vFDsG21rgwep`q_&LBpBG~_>=o^gbYtN+6IJmC+)9B z?N94EQyYan$8W<gB&1wQcbW`$VT1Rt7dB8io?*uNvSM7gq^xqf1nu<76@>7%Jpv5! zV#c(BX@%?(*TbonVm|YYWpED2y^^@iI)sIrEGYCW2mtA?a|Q9+NsiZ4bPOIbI;u4T z6d^bf0<v#Mzi~N<ykZgn*XS`bkgOg&=hHKHL7Q@i?AkQDMF|AODXC#1cy__`_N^Gv zO}pC%58r;z1JGgHH~Es$FC<ZB#=@m7*dCGsvCn3lCf*b!%!~P<N#(YMNC$4Y@c_z$ zM*6XVBcCwr&6}<%(f8;>`kpI`_^Tb9c0un?vyM~U^v;X`f-YFtwnO^HQ;eId-d7Ih zb^aV<b!P0&?t}ack$0GD9LP8L-cWr?W}o|7hDow>lx^7J0Nr@`<;knm=Aq$yEG>og zwXEEG6+N$mle?O+7a)y^L=pX=K>^jV{Q-Nzg}4xpo~Ls`JW{>S8Fwf)<YM_9L<K%t z6>~eDGCXovv4O0t@UHPPn%hom5eGn%^1=>~$_=pF!_7W{%|M$mspA&o$!)emI*kto zUwr&aAxEkZWJY^Y=}O;x@9qtn1&&9PYZ7)Q2vrdZ*;8}t{{_Vw0#;;IYYeKx&c<k` zt<*8hIVUi)IAmOVgQ0+~#p0<9;Orr}=^uB7KDih%HdX@BVv(NXBCN6hfd*8;f~8>p z<SZj}axPbd6y*dDi~!(L7h#F!W(p;e{(=f_4AjDLzOXOYL$O<J0~=6E?zYTf$c+Z^ zJt<X_Wg#=J6NH>gyqzJWZ8qD*S!85Y?1RQw(T_1dE$vg>2GWT#W52jUDR8<^{IKT` zk{NW(pE(9`rsgr*;y@UHhaHD6hgcyV{alsMblk{NaqKK_xsgp6q{$slFe-ceim}Cd z1r{js_+H_O$>0fsQ9G3EcY&qs?!%l0peo>T;f{vjkv$NkOk;a70~ebe^zQ^WmJxe- zX9L?inR5`r^-s;g$}`iMjs}@{(e39;2yR`h!)d=-MJ%>ry<SDgue$W>Tzvv%6h@U> zS+Y)x{BRIZ#I^JbJ7XrK7qAV2Mq}FiobkR;A?Jv?I`J4;^^Jt6><39%v>O9jthaaA zX4m53jWKtE%_R82Kz|84(?$+4<l?&1ldjZHJ_OwXM?JRcip61P_PAgi2ub9WGnvIB zW{b^r!iRWq9pQ8Yvll^w0{J<nwq$VFPomu^e=$dmKzqy+QQ^u;cQZ44<$!S;EVt^o zEmkSmW6@p;4U%yylfljU>WwFMjvdFhb8YrRoTe1<!iF^yL)@n6PV`z1afn@WCVMtN zjzUL_WW19V;8zVA<eVI~IK}#-SaP0=`z;=}0pk=kFT+W3ITI7nWyt9Xw=f`p4~VmI zs2~E&B#f@WJH*Pn%swSH`?YcE&cz7^7`e?Fh8QYsVNO%L5~-&tYv}%WJ>xX5kuFR8 zlaV~w&<G8_vf@Q+6^*$9_J?53lf%*D>o!}1%`W;YS=qR;WRT5xsFGr&cl{=2mYY;R z?%MRYAbM~YVbuQSDvnU#spLo2SGP5rJsAI8bP<w0dRwf*gDVfu4CGx!<~ScNAfwJ3 zhi{j%AKALqbDy4|2mPD$zI|eFCno=iSR-7$?F2@i_#*p2%5c<N7LYo9$~)O-k{r(4 zM3!j&G2Z&$lu_{+VDS-P2-{`@)Rx)QDw<Fsy*G|z9?!87MvyEEXm^E(w;=FX<H8Sd zdfQlP+fPF5&3t)`MBMWd2c$clt&(uE^RR01=2zey+}@H#s)+S-U|(i$x!k>B46ZdW z$N=ETDac-qt#hwNp?KPOKlEutulIL#<iIv##Q5N;eiKZU+5=HC1E->KhE(e?c+zEW z-W0YN#j2K0$yIG?apYqXZ<xW8m?EyJT(B)4$rDnpD!!T{%h?RMNF}6@&UOjB@p>%2 z`^gCVSY)^pP1!qbkoJL6hdXkH3U()&()==Tjxw((cz`CNYKl8#qf7<`XZt|#+O1Y$ ziHym7<miTp-^S#pdzMXpbG5oblb^JK#NdY9!{P3!#G%C==`(19O@GT^?x58E!b*oU zK^M=V8S(N3%!=W)CAkCtPda?9-GK1A329+oh9E~}`rNf5P<9*dP@X;&KtpC<MZy&G zY>>K7<0#(@o92Zxi3EwE946yf4n?@!x}{B2ps%T&5x3xupNyGpV7!g*9`1s+F1K$) z;plIy$+Wd(d@CNUT`9uQvbm5WAMC1+_1%fIU`b@upMx6@dLO*xM3PF0p_Oq9Hnt{@ zn3@NVdIiplv4eFBRK9W5V~q#!e{qXJCXdH(j7n@!y1|UK=4D#B=F;IKM_0RCQvBEN zpWyMG$DQ^!w0U-?pZ6xR!j?dU&nc?JO_-*NCmQ*q!ostj%-1fFIH|kL%oN2Tc0)|I zv04Ng`Iv-{FCg|CM9MSc&T=fwp9~{~`t!n(?0E90E}LY;#M@@HykbYW!-bzjXB*A} z*gggK$Aq@}`><GLhMaQ5YaSNK_~g4{s67I!;>IVHTyVN|ZdB%d>zEB6RnZ1<DwES0 zr@0QV6O@&FfuZ?g29CQg+mT6_MN<VVx=!KU-&Y%L=#0obHJ)I&#LS@)8_poJy%WY7 zCZ%FTZixC7jsS19#es|6LM^vS8<@n2*n0>!V9^KVv3VA417|nTq>h=qA5q$d4i9b9 zspEEf4c?PFRoVPCcA3M*uDLByI&KB}TgD!!(I{IE3ma+kae`x8s5pi1vxpAkW}fOD z8-uM?JaxUQ5i#Lo6CV(cn4qMDeDvxXY|}KzQhnbZzoVvHF;<QwHb;n2<0z-Mj>&Mp z{xUFSpTUNS?Q{F>uw1Ddx1XgPDI2bP-@I`8fLoxKMv66~6q1~PSOM^ue*L7656u6u zelmI<`-uM2MiF?T*oJn-xh868h#mMd8q5g;D~~Ch8fLpMr%Nl~giTGV!A644W6H<C zYm{C56??IhJSt|c={bz0;Z#hi(y@ks7tC$*Y>>q$^1*t;J!nW=+?f*9hzmXah17+L z3J@rZc*QFr&^*q}D%l;u+q6)blqF1})k7U)c}4tm(wt6F1g`=Ji^gZuv{jbM&ezpP z7!FOUybciWAQ6R}1tHiRFGVt>U#u!bw%M8Bh)o=#t6tgQVw38O_`I!{E`|mxfp8~| zhY-^u>`ojlYLGz9@7}({tuYu5lH*}Yfl-c`{vsVBFs75UdQxk)lqRS*rqJZf{=Jf4 zW<pC9d0-IU=L`XoJ~FdpS}^$CCdVtnXF>&`Dh!L9yCE|JH}#L5y8}`{cU(K$SSvGl zn&dm34E72#LVKp?aUMD1@k?-3F0o%+8z63ktv9(U+XXw2Ft$;!|41z0ZJRP|ngtyO zTU?vHQJ)jqDE@I92JS@N{LfQ+VaG7?91u*IgAC<HH`R##u1#{>qsJ@+A~@_6e;shZ zwrvyh3a!kx9GGBu;UP`~H`|P%0zTZ>Y~ECI>sA=lk-a4oNPV6Ktk0fJ$5F;@f)^qk zZ}$-JqEIAKUgSdITC82@W_@uRBQ^Bhj3o0qV4ASlr02DTBg?g2<Xg0hMb(BLTaz(# zfJzO17#`X9=g0;P$BM_mZ@cVC4Ka)O>NZmwBHd9k6idMaxkN6W*8T2Atz%0T18ddB zBs9o~GZzdYN|xN#Qvw{$5^!B9-8hy9Y}dWjI9DC`8zKbkQYUv|<b3|H;Z^J^6Gg)H zv$J#%-gn#t^^f|~+{;x8Dz(0|T&Hl#Y#xgSnh8?~@hEn!;{=+%@%G~*XJgTdk=14{ zZQJJObGVA2qe8Yrgf*~}jGJtfQyXoSI?r}1$RcLqmWY!8XF%Y~W@j+-Va9;}+xs;- zK&oS=cLP70t0uu1)E#yV5@-=3zNa_=D#tLDOx2(9Yc7{V9ykzU#^2xq1DW0W(7^+8 zVND4cq4jF6RIF8@*3)RETnl=0Fi<}B9;NNk;hu8=LBA*GFJh;g8|n&AuMqhDZFCHA z{OsmSac7hzq>o?>r!1P=V&J;~FX>6EgPXyl!>m^agkFwQZe~~3me!Y6mMwHUWL=cp z3~~T))*-GXVzZDz=bc~((A7fHz?_wD+zw;IBN`4?I4_C|7QzjE95i)5fw>c*nc9Sh zt6kqh`2L%6h9JUFoG-7q@Kyej9e;{T5AhcesqHcO$38561{qe4u4i);(m7CYHb*hY zv9#QFZ^fxsaCV0|04v4{c`*XI0nuSVIkCgsaFa2({6&A3Ya50G2XTUyD>r-BcE?@Z z+dQ#3dA11})S(b6{ZNwuh?b9Xg))_X@_@4}9(29wPRos}cBI0C<}yX}AhD!n&c-|K z>v00$GOp*77vdVkN*nWrvd^Q-h%MeR5or41FcUU_>nqnbanNs{H-{PF1mO>hLbtmD zv%M7Nx0dx!^y{^OnZsTTGo|8n5B{Q9<clnYq{YILEP^`&7q~A;ZH0nH?*B-EAD?>U zxNj+Lc%(R_VuxX*p01daaUSoHRK@I(VHLBtq$*~Q467Jo-UpwK#iM_X0^#-;R`Hdi zpx~*&8@6jYvniqQ5F%j@dn7R$Kam%ta-Yx}LOI>>-;l|DLT|t^t+58+_;1MMKG8R% zKK!`-5S$x}8lB)fQl8o;@*&v=PUt;1v{5-PI6eMbve{4Y9jw~nMR}c{$Xl`xoX~p? zRm&|Xnz(jih+lA3{(}Cqh<hxYRe1tA1M9f-q`}H}%+|2XQsb`Y$4oJXM+V(qTIPHY z2x9zTZ+T4=iZb8i1L6!TII02fZql}Ntl3+(fW`v~%jV@XeM?7^FyJ0pgiMv8?1lDv z&<DkLmsS?J@&;ezZ|RPT&8}-;b^5JfxXiWcmRP1?R=fz$pKSNNe2hC+vr2Gbg7bCC z<LoH9Bx)EKcNdx|V7Fapror->)IO2YIR1=f3_UXjGNzIurepc#5Lga$+qTn*t)uN4 z%#s$$o4J`8#zzYz=F%!B#t_&61Z=Fg4fA_l3Z5VV!R928WpGRBjyw+|A^H7~85H;! zH`q!+n40=}K24#9ZCAO^N{qa75Ufy~VzO2Q(SxY<A|9`dYuuqQ$qfoMF!D=<oPmP1 zSZrhM>J;2K%!tA)vmm0}140m*m`Vhab8Ik}_)tGtpnSE{?Y6y|4x;-uWcSG?Bz92o z5m^Shs90nZCnWN6#T>+}_!cno_AzlxpXt3`K^0VHh+5kCA~FWPnp9zU0lQbru_;_T z`^JK#)8a|{jphyvZiz{`=W&8S7<ffYv0Zuopy{-=N!g&&<~!offY`uW&YFpBN)l>P zFN`L-KBkNsXxw6hDc-2kVI(;taQI=Ba+IJK?BtZmYR&InUo7*=^qvbMD8z1t`&r^y ztk3i3Tc`5FCWl8qwO3XV1=Kc@oQ!b(h4EZ-9LFK0r~n%TP2zPy86zOLPQh8BcVT6$ z(hJ7aG>+Yc#Av8ffr+E264s|7V&H<Q4>Cia$~S$EnXx#({c2kJVJG=<qJ?MFg-(0^ zEp(&cW;-*%AWurq8`DeR!x`^Z6?7gLsS{$|Xr!dlSwLV+z(A6bEqEHW>0)5uv_Y|E zVh~9FP+_<K&lSz>K;|BJUlPSIMWq<Ua0leLHiTn4upkS^o(%MYkZx?46cK|cJJiHx zWZ8N6=tl^3ad<80Qd?nMFjfg~($WeGlkbC^;N)o><BQluoSyNC$6>9H8{@+y4dHRp znMxKYaJPmCL|$1-+rz!~5sTGvyTm%H?cC<v>T+)La5)Yq(PVIb8V%UejxcnCaiJk% zWtNTdDM?bZEeKJMx#B_IqxG@sh4D4`B6ChrdoVKtdWZPC7Wsdk7P{W;i&S$1J>Q`E z^)82aO)zCl3kW&y#$#3}9E7s&vL+^I?5ygff>Y4G?sDgC#4abnaNJSnnX@zkMBSag zfM3Had0H^X?cxG0+R~Q<6o<gYMf5TY62yL>d!mycjn7ZexEfImb_`io0?`5HF(k3m z%P^dt8XfOYv+OUpWKfwarswv-_|Y#wgSyE@;tZk>I{_!HLQpO1r|mf71NI=LSa8M$ z4@2iT<&=fwbb?D!Fo}U7gVbyX9|tPEVZAaRa66{t@jRx4B6CXJ<K>NigqmNRLh63* zbDf?OmNC<NWRO8WQksUQ?trAB{aAABnG+Z(@EwVj0(x3@F=zySyc@YD_GOnr{T8d8 z%HBwp#e(cPE);Df>xUFC6|_$*-A(L*_2G)Yk|hK-u5mi{3}}*zWP{m?_mD40j2W?` zi1~*B5q{Nr=&-4aO7#-7uSZt9*T<*BnKcT`b2>}Cp7*yj3%>BQ$<zda&yb%WY_{>; zW)>m>vA}cP(S%q6<C!8w%s#BheFr8cjnNNvRv=7==_Du!y~D6*?@5lkkJr~}EU@wF zYxbT#$O)P$eFP#Rf5`MepVx2tCu-be0gp{=3e8Gt4X4f@V~4&A+Y?)>0?)0)z#HE) zKYFCK+B!^0C3s%{C#;N?51LUY#xTPaK}1Uxp`QnKLSkRl6I(mD;Ry?ZILub?E}kkI z+mb<U%JHvgy52n_hw}}cfIZ8tv9p{_`a&GG$84=#(0)fWQ*4&0*{HiXj-3i36d-8Y z?wRc%PeuuI&4Y(l7O`IsY{S@&rVa%2;hmGbf0nD(<fFYWG8I32%_eT1n-$OOjPHUq z`n2ssJaes~&oD@y&kv~--#I(I!x;l4>%Y@5SLm;jcs0-F8ufhHMJo^Z6#5ciYG;@g zk{z*N*=g--ORBm--6R7LQ~P6ky$4MK&TsF;6qd}?cS@}pk9_;kNpJL}S7WH~aJE#Z z?T~k|AKmbp;eiMfIP}Lw{2^VBcF&mC>fAmvGKbqluAFaZA0oQ96PxrDX?LMTxE0Z1 zZ3s!TXQk6sSeo#R;|&35ZpTr`;dyScJs=d|gG12Rsc5mSV!S}(56}B?@cGR+)Q&tV zl&-S7O*UY0<a0%wRn+9}47PN+$Vnr%FHG;A1ixrL9f6&&k5<>$Oc+zt+Z6kJgQ5Wp zH4ru}zq|pcOwLn#82ee9iZB`TvDzGKR_f%<3|*ffT_;nB0PR$F*%@`VnFApSm{ty6 zv}jSzhmvO`4j2jVG>N#n<m0i3qdieH9NByvI|vp0Y>+;D<AF$Ic*fV(x~uDZSC**@ zADude<!fyX+C(bhmf#(dzLGrQA|XMB6*%c2(EAjmP`U1*wJsh{GDC;H14phln=~eN zrvyP<mE7-Fm~ll|?;e(0?XDjM`wd~)Ef8@9)P}ZWQ;fw;Qco|hq0C<*$8@xN9>LAj z))lwbfZf<fGPeigZU@YFx!4xz!v%K1aq=4sdFB!}=yJAmYSwc1<t!7731bFyb(ZwN zKmhY14BR{ZD6Fo<JlVu#<+$8a=py5h^SX@EX5HBIj9U7Zaca%Ih_&r1D(c0v*wG(; zURpQ@aTFki2`3b5dcm7x9y{Md2Ee;~0a1oM-&QEm?>!z&SNuOdlKeQ5ah7Hb4R?ZA z(1_xr20=`OsqG6`z^BIdfdPYwf5x8Oh#mH7W`FFBL4tr4EQcpI6mfC`wghppc0SSZ zB9uGZJ3FMR*@X*<JD}OGFkryPO-RE1QoP7ecp<etoh+Oi8Vv7jKtr-13ndGce?0pn z$)6O*jda=vgr`_ihAC-p8Vm$^JD>QGD~CG&SLdiSibKv(xg%xs*q3Je7{%>}c>asJ zjmK{wjtY66-DEV$ZMs{IkD8wJvlNrmF>m8A$j5T-qIjmHF7ZGhi;tKQ+c6gQ&3UiZ z^y#7q=7!<r7q{41CU9{Hf;0HYIKj#vWaJ_r2LHwS-aqz@*q1qY_8oJ~9(i&<^mN)2 zLP>8t?uh}WJ;#mp9z?GYiq}aOU6gt)>_On^%(}d78i8u2JJ_5nYy9b>nVc}x^9x=Q z^xtn^WG0D{au>q{2q&ZE%CzjWBi?90$vfxsPRf5JKJ#@P$8&1hr~3u66ZVT51>sWs z8_{GGKFclEs}6V^GS?i6C1Yn++l=yRXrfLb3wIcd{oy$REa`et9LTr=j*3TvLB^Oc zvAgzL{3X$PwT5CXseaDN)bn+0Wf;U9J+eMM2_DK{-e6toTaIJfFB0PU69ct0F|d`- znVp-7xZBB_%ET)TVy1Q{;w<8T_2sVOEQV}tAfD;Z(v4+?xNoZ1<`tEmp4kigU(jII zigv71dk`+eGZFg`7W^_;_|FgX;|t7Gw%9@miz^qm)GVSXgH+hC%+|okhH=yQgy3ev zC1fKRP*yrcv)uTAE5sj)#V+CLrWsZf4)S!g)s`RQzzI@P%e|k+n&n|gcy4uK;>0Ln zCck&W-hP&8Cb~CCW#G7g{lgqoF2Sl)cAN9`_=w+=#Cr87-VAY&@XpWNFY!Y_Ukn1z znn1E;V{m-Z3CuE0RfFSuCWZv2Tu$GQ!IK2vv8B|pK=3(*5o#Dqw%EYBx=$9SZq=o# zbrKO@H%6Uch`?}rQAlquU>OM=EsVnF%|g}QYkO&RU?L8wl(>(#jt-4>;jZLQbhJ|o zT)1PbS&~P4$K0{XZu6Vj4ZoS@_MCHY#wdgd@+^3HZbas-`aFQOpr2L832(P!-C_sA z(syAB4Nf1rI2O0_N-^&og!tuoDgY8S4NIzBsnoh+dSZ$j9`4T-fg-3qX9s1JeZMm3 zOPD4r)_Z0|O>$vf*vpj{{CtLWGuJVk=L-p0YPH50uJ8a)t=7KU8g8k2yH{$kc=uq* z8$xsW<RNls3+j%{rh<0E+Eysu!v^g#e3H>1n!#SF7t1S35JRo699p@dOMi13FUO}E zWsV*ix1)zzJbK8F$GPblIqm3F47|#SiNd1z9aGWi_WeQzn^U~2kFwyx;=<O#!j{NP z^nI00ac4nAobL-3wz${gHFwq<t*2L9clvT?ZE^7VeYn{txDVgpxU?O+7v^{Q^I+X6 zukbgD2WCd<%%uBjmnHG6NeNJcAh~1@<vX?uEHVZ{ma^}do`cgV`w)TIXV*Nx%+$t3 zZ{{dMv5y{q)x&b_8#or;kjV*;5)Q;Bux5q$sJC=5Tsixe!C3!47ZeR+Zg3Muvv?ZE zXmAT8AGdf!hejuAg1~3EW}Fq;K><A|D_{d?+(|}3>*YYsLP575n3TiNk1@GV8L4wt zq)Ihm#m(Olp;YMe2=X+<s|nNIeD@*t&p}5?H-7wSbSTB4<f@2;q7O>O?$pGt8P6I+ zf}RW@Omhn+o)QMQ02r)scE8WqdCgo2udqolXIl(EBS2J4)#_LPPg`n{9mIo=yaM3} zZU2DK8ENX)F8Cv8=+o)qEp7~^oes!4Igb-0-G`vvog^eATD}n!zcVH|2<Q}VIHwN4 z)nR^N0)kb@JtIUmz`k|V4pRui8n|n$mtT~mQ}BTz!NS-NG2-1R4&gw^XPrCBaMws3 zwg$qNK6?wn(np&MH#c{0*>dTnO;98fV0mr?n{`j-X`|u8dhD7_f_er^6RM}f8ul&0 zDtuynwJE7%&PV-HIvzX<EX~j&+tF*6+3*3oH7KYGdLs<}s9uD&m$6fKV$@W~5JG$u z9++uEiMxJ|XBTO>TsA2dKG<;pl6l}9Mbj1DNL}G|aV;_C+-c!{bW>~%%?5TN*l6Ib z9P7^T$DCS0A18ASjGJW6o1Az1ocln`Q~FFV%vzK^Zi#Ys!WF10H$m3%iRKPGgj^0} zs|9W<nS1CT=TjP#?cxaGsNz)hk^^WUV0U9$2Tj71$d>k9kIos<k1u1=hssesq?e~w zVcWuz{v42oakp)`b{<(;0XdI1seVtgVRKGtndrLDli8PpaJy)<XnCl8n|8Jtv>}Nh z94D%Jq3rjFjerd4RMph{#RK5GDn5HH*iWE0z^_uN5s!N)^W_dp1%%tO`w22Yk?8e^ zcDl9iHowQ1oL7)(jtFhTeBYYJ*zFGam?h24J(fFeXQxqVGQs%qa#bua_`;!;gNS9Y zdbADgII{2BKRtmc|NAjgAmijhQz#dc;i=8@%%sIjW*8{kOSl6UeULlqQ63W?y1hd6 zNG3V5FpBW{F!!-73@znbg;4<d*g%9-qaN$_<}Fy38~<?o_awic(Z+@tY2IjqJ0Uf* zzN?ss1h9`#ICvNyFhZmY2VX9+HCSa15e$iqB59rP;Ogdsa@p|?enB?3E^Lm>%QRTC zDfZw=w9|Vb9>ff`^O`9nfQ2PyGG`d*3nHi>kWR9eGyD@NG8rxLloBkYwu^qQKt~a@ z)&$Hc!IDfk)x!M#^g3wAA($t#324zfP08f^4uxWx<f4%yJD-m;A}7JqhS$0Ms(&f> ztg{H{oY`Mkuv~Y@WIR`6bumnDc@c_dF9{(zzjAhFzIhqO*;u|nBRUfD883Xs@y^_0 zv6W;(s#bDZZs!PVkC67e34oA!`=%zSbi+Z-w3G$up$Fojz8;9+G>z=I?==+z8qlg? z8#aGDodsa5SO9y4lqQD{8wYo42Yl0~_dq4%R;flLqg0+u9>>KQ1#^Zy=C<6iZ8_ZF z_F0N#w|}NVn~z&zF&O-u2kpRTxEV{)1P&K+6?A(^nm6y5K^Vv!vSCa~&acIxPL2eY z-F=Qj@>hLd7bz+d+d&05CeX|kuxt&6t&uTf+h}WbqGQ60<0vaZ=W_DOyd(a;3OCZm z)wwR5n}X(Hud`UiT9A;NfCytuIO>V8gnm3lfm$&pK{oOG+=%H&U{+aAnPhOe%kE?t zgcz^RK{G(jeQXJUF7z}}iZO#wKtqX`{an`Jfl>m;(!Dz-L7nH52zI?r^KfhJT1s{I zZr^@ovYXw7fRT)g8}q5|ef~IY+bEovYzsOb_E)e<aDX*uv6IA+r2Zr(EEk^hgMxnd zN~;4=>cEh%8#MLVILzUb+{n56dygJo#Q7jPSuu`&j{9D2dj%utL6Gg}DZ0ejkT-KF zT1wgut0oc<a+#dCR7*3I8qV6_sTJb%uuf<au#4hxG|-KhRuEbelOvpm^ghThbpGTu zF(MMNg0l@6E>$4?<k74XIB+bf8BEr&oKWaxGmLULT6#EHRT${2kjD|NZr8=>Ya1;E z$~jK-bALR87SN45J=dZ!;|3{lnsMXes{j<))t4V-(S$I8z@2zbC|3frrjCdYpqPhd zA|yy|PYgu@j@cMxQ1xv`R#(<nAOpJ4VywedifIjv*lw;`sgy8-_j6-`Q<x<Ef>X5T z6Jq1y{o|KGT9=|V{t~%0a$;Nqki!JykUq5`7|+3yF0MOv@{}THX62+;QJVpo$p+)0 z<~r0#y~qwCm?;b@CDJP(bZa;>5%z8;2Cy-3E=o%vmV!bXqx#%)>A&1;(wzSg;%6<v zd4k6Lt{A6RpTFGOZU+a`V30V=RO5aIS*Ai~i}3;OCq5vogmw(~uZ5JL!;CgP7iXas z;gAzMq%-=fZHO>oQF;F-YOj$Cb}ET^>?H)-6Z(r6JCRl(E_Loa6zqw4gq$W2>%<$s zlB~<wDbBMYwVe>fa{9ZFT>YoVw$Ak<j>)mJeNK%HLR+U~zuRXJq9zpml8to-n$ha9 zG1f@`rb_iP>^_|!#bO@T#*vRgKo@VqG0~y-0cMBe-#7sSrysv!YN!meF>})ZoT0O- zMRW^)ay7<?|C3|Hmzh4nI;A0StD>l-xIC0ha)`iqW?DoA==63(%4tsT!J)KMT<GzU z_(lx!M0|p<PJsy$O)9R~F$<}ywMRl|y(bS0ql1_gfrVXGUlo5vJeK2O=)O>Nm<<bA z1Sx1rB!Y^>ZEoudD})`Fmsm3(h%+V93Aoeq6VB!{o*+K-{f5{k#X9Gjg4(JA)qI2) z1c<F^cY;9CIh?PDWjWNtfYD#T(HOBhAP{13kwAZ-@C^%$(Tw(ywWV%vfFOKyv)w+u z2e$>k9D7A<U-?Igo@^=khuVZ}fyFC;Q5P5?7YhM?sTOx3oi02!oh~AcM>gYdRKkQq zY&duChAo%_+!%D>Cih0&W+^uzcmMxxu^X_%!9(8X&0>nNe7T)j8d*~5BA$$&FyHgw z2}=i0Sej4xA|N2iu>d@CQ~s6#f3fCjgW(xB-lfr7+(0)aP3HdO`;x!xE-tZwSQX_C zo^m<pDeCEhvs%Nrb-M>7<J|)SEy<Fd<C_7oVmVV4Dok7x_s=<JOPuXhDW0LpHk>`Z zauTaYuvPI4L$F`*m&ijnO1gJyX0MSAGm|ohGz5eL<(P!Rft63~7y3kBycpa#mP^L7 zq5TTPHg55p*#Vgl4_ZU%G|_Me5rG+Y?tz7Tk+yO+pJUdm4%Q2oFc-~;f!|whL=ZWR zwmPfFi)(m-VGV<om^K}O@RYn{u=SWe;EjwJB`-V;7n`nRhoZCfY_~dEq7R4De(5?W zFR20uB_!RHc8A<nEZJs5Z}6zK=HD12JRr%g7Kna_NK<$T>6rM84M#@C*WE^V_hn%3 zrY=XoZpXV*D2Yzr3kinb9v8{)=`k-*HzSx>q7HelpPr5a(Cf8S%6Dx<jL$;4a*Vqa z&q0B$lOvWh^>ZdOSz!*SfH!i$baA}1;t9FsB~gZAXe9z|j4_jI#Q_#g!W8fWyQ9T! zZ)LTMqo>V3ZP>}v?bVbsT5!<x!#I|u&<NsFLfSLEjOg=eFDC?=GN&gutfjB&<Lv3q zLG`r4x+t|2Q4Y=@+S@E~;VwbXXvWmd_)Pe)G8lAXZ{`;EnzwFfGi8OrMJP5%T64pP z{AXGv;{pW2;5xJ{GmX(?z}Au--UHrt(rqxUcsuKYL(;8=CXaKZ2p95AFP}qmwpI@t z3F0JkBFsc3p^q?uInJ;I<B^dvFpgkGGPE7b5Y2h!=El95A4s+HX)}Q?RNYmG8Kf14 zJ=6dr|2u3Al_-XN<tU658|DQv(FBf++}>(mJJ*E(GX93xlh7SqI8Y>w0L7RejOgr5 zJB$LT!Lp{u!3!il8ye@=ssH^kc24H#LQ^FiHTFqvL%X!r#<9JJWChVrCD@!0Yvc!5 z?3W$rJ~*muP?1_D5qNPFAI6Ae$v9LMQ(!mj`%H>JXXl(5DMY)QZG=BsMWi{1L2ak$ zcAdSYLom9dYm#W0smjeR0LzvAAiw8!587?K2yI&Tf}Bv?s})S%;ZCMK=%hDjNsk>b zs@-Vwz|GCQ3UuhqonjYLj0M=x(Z{r8wm!%4PQqdGu|P~F!I;>qKh=%m@%D**4nac8 zn~Vi*(pz0Q(p~0&T3NYvsmqfb;3|PwAnD6FUWY^u@*hZEwv2Asf_XmLJF>FY3@-$? zF$}YYSEfUS*dBrT^t1g6NKg{0L#K&sIOf8+hk}2}9K;-0Igo!}LhPRv#J8kt8>5@? zf+oa)Nq2@vW)_=tCbn;gZw9m2j_5hAu{=yKt{mTwKm|K9Ap~@e2*gl~)ruKrn_2h; zafjq>1<Zhr8z&wfpIUsS4?)Yu^GfEhX)c785Vkl_nH`h3eOOLRAezzRp!dw5$!xHl z+qDleJOht9tYmb%2H%KnIT>m@y=o71<rK{L+oh;?LwcAD8a?T8qp>u6^l*%l|A5qu z5(OrW-*9Q#6T(hpX1~*{xR{GPdUp>OE~!$>WzVmBiUh0epqY4T9RllR53<804jC8U zzCUx|%fnj3=8C0DG`+-wrm+Zi06F-BIU30zuVIu8rwV7J*Ni~52~(56T8Jh!v6=?d z8`Kn{$u`^~Z%pKTCjR%L2)_o3@^T9R7J;MPJY@T-#E}<eYxv9+Ds&CtzDN(!K-WJP zGS`sNIx($dndH1gLZ9Q-Bj#*jOwJMNLNj<{BMD?@Lvzn^$O6F-Qh}>|JwnM(P!Dr5 zXT!MTIPCo}2ssS#@G6hr$pkN`A$UP;7iJqb9I=|mRwgIr!W6ZM6o^mV-a{Vb*_-hO z1YB3a1-a+Gsus>ir<{@FO*zYu+pL7J)gL5b9V+>~CqNsx6nhA)Jh&9i`x30G2N~c% zY3dAcETRdP+SJL;JdQS{5Tl0M^taPF7`(!A75ozz@Tp_%?h%Gok)YJEZ<(umpu!qW z7l-XN3=ozNHm`?$jt*<|=Og)XLT%md%P5NGF4ul!OC+*1LK*v}8>Pg?#kshrLgfz* z_mDGPxaUbXn6^L_A6U1fRZ!;Qmoale{*9I{>Bm4$JhMovzuAS9*`ICYC0RwSV<{^? zHRd+JIy<8*2L0=<4pYOSGbF~2eMSQ_gF$+?fRV;ji3R<B{tww5W5F5VED_5moU;)2 zkdByWqq1R<cl(#Z2C<zR*K>t32~ycKY82Nx{Q<Y4N};`)&1+iMci~mGe6U1ca&vF! z^m2w6ytZg!MFW*KVTju&1x#>EuVj5<fq39L9{2;wxpe%{4Xqp3Agufk@eC!w+N0p^ z5F|5ffO&F87Ws4S&{7++SdmsNLlD63f&Hmw4CDo3M%?Kp#jz^CUB*?36v){@uoTfc zqd0UL)iRQ$P#{h*-{6|kTUDk)L^*9t0ZU0gn!Rh*g@}?VRuV-aq%2~ujfn7nTXGa8 ztgVhR<_*9Mb$J7}ylEl>X&sq;wT-%Q9_Ls>$ZrZr48ue^?e-VOdSNYaE7<-Cc+Q;A zsWU<JM6aGEgJJ@afia7<Ov0Q5o(a3AaGIM5q%9-^YPO8<sZDpFx$l*^LWx5kgV47p zzixmN+9V9N;Ac$7Y}hYg(Y50;ozDT-xzO=~YRiRr@k<rk0%22Z2MB4Z#Cp>Hw&Apj zLzKiewgP4d!@qeXlYOGIf(e(&!LGgYv)r?9;YQn;PzLg*K<MhsJe(b`XGOAFKyVAL z^0H*~61vnWHlY`TQy#=py4m@ug~=J%b?<S(D(s|2^lI!CMcps^A(WWJe8@m60<61c zML=t)Nn1@zJ@mG=+n8_j3z)&CWh1k@QOV{Ek=%GKj1_8?a-&?T<m=c=)oT@;e2()y z-PXYvWh{%@JGi3=YzKk<H!CCtse#-Wy0#rtbJ+f3WtSZm-|ODpC>BelS}|X$)+^;& zty0g|_~m|Yk;Bq}X(X;n0=jx+I+~^9sBo476^>eQgVBJlvo2^42HJumpCR~*WeB41 zAvOi}P2n&4w&NQr@EtmG&5dgiVdsR5QIjSFHIB1+M*?I>m5>0OW6^Y>`2*_)T=M%g zZ)S|p`zFXh6DFJ^eIcQLV{OSt^&w_xm4258F-q}dM^pGAACEJd5b!{53Vk^kW7nG0 zbigSA<mfTVr0yJTt*@_wVSy|Ve=IE?#o^!0oUXc(Y>(i)xi%7Y5bL-_o#lYrbkYNi zht5r0A!@=?pPD^}y5t_*=mQ)#Kqj~=Kh!$72D*(#gz$a~PI$}PnQayrv(>)t=n@VA zL-4+%t7}Wwcl}emOTzA$8-2AlGjX$+0)R(3ga$NLH|l}i#t<fleo&Zk0&L*4a&nF) zBixNUxtro>=<H%>QM;TYGv@Kc1VXU5q2!K;EL7YHk-%g*+9Nk(#85eq^R=)h#3DY4 zs~A}+;kxFqaabvHr!b$B-J>I&n9vOfS}0-3PxYbsX4;5oPHx|A)pc4ToRE+&nu~5i z*yxtGeF_VxIkw2qRn6gz4Pusq%5DyR*e1C%EU~t6f%C!iV44)lkDVRhaec(;>EV{k zJ=^C_?EJ?h{4-kJW`+nrn!;d)8YP?K%8G^6CF)4joyk_9-N>bM8-D+iv9d|+zQ<FB z0Nym5Gb>OV#=<6wY}j^?#wwf)Pw(R;C$7ZN<7vr8p@hI<l9Q4^7V<t8D24Rs^y!%e z_#)2lpQg8MJUQGU6Wmg%WxOsvIS0Oy<KwvQP3rL)4Q*p;@&~*>%PbCOy3CxvW4R3E z)cqF?EK6{}B$pY}O*6>~^p<`uh+i{9O}g7y!!Yhr+*+PpDO=<RP+P3c;ViMK!qtw; zC`Cxl@D6X@82T?J1YYk3*>rr&A4L<6Wp0oZa5Ilkt1t<PcSlt&1lXCzULW3=W~x!0 z47guBopD77`ovrjtWVJ4n6obKp%ayuwK+v`4ZLX2eAA*m+cw91DB?(L&1=}SMn8iC zp930d#1k%!sgpiYEwl~obr`c34YYUG&NqiNhpAm)F&!(QLq=rZmv+Zz%aBrJwM8<t z!rDdSm$>)PrOq7B^?lBI%iETSw<zVn>RNBbW7mAIjwN0y;tpiRjB17!`&fq|=<{Yg zB0EqPBU~89;clF$Y3IOz5r9hsb<XTknW;cx<cFdi)*F8oWqaZ%O)6ru#Ou~_#*?^3 zGqz=<LO-sU$?P=mNC&1F<p8`l7(bpl)Q6d!qWP$!)nXE%kC}oWG&Z9a+9ffp5rxAZ zUjB-HBM5R}4IIyjn0>>DCVi18s+e8dyeNtSV%IBJpJ*K+RdW6q2|h&<Cd1!7z1_+1 zRg-W<i<b!MDU+JU4U55ME_USNV2Ncc@B+FoW+_PmobCMdG}{dREeKf^u%h4%XC~rr z*%05^OUM{qGm*Jxyp*d53QIR-4MA`FzHnS`Yv?({c!bWVFr%hGh3h5$s?l{g;btFW z&yqEbU#5th(~lnC2Yr+=9_b!Q4$G05y=~(hKU1MITvC?PI$|B3omog1VxA)w+<-Nf zkO-0`MO|}ItNsH-OB9pu*a0U&zen~aYYdd;MPn}fa6XwaAc-^;)#*3dQ-XW+alrjp za%`xvo@U|a$Tn9%n_oM2#zX`o(I(Zf1+eB9Kz~l0T6T`YC(wp?1CH>DfdmOoFJ7!- zgKXdlT8Jv?IVl|X4Yw|f!4#7TR1MN}&-6Iyz`i{)-E;IBt1M0ZsF8&RWG}?*ASSua zVK|T{`;T0P!H0(LFyiZx*XI)4Y?}MB2s-Drt)RQnmb4Y!kFAXF7k}JU_OvTBGl#FU z!EqtXUHF+IV?&dA&lpLtEom&E3%2#akllmN*f)a%iXpM!%4l3;dhBWfU@qG<CimLU z`PUggL3A3kM57m#@(5l80pQZ|!KL1fquBkduec=sMsN8A91EFq@1aQ}>_w;dy3lT* zNSa+`Zt;viPd+H%4UJy_?*yX@%3e}yJa%Fnc6eGl=74%TpZV#veK=uf?eNn2)ZruR zH>UmOL!bB5oqkU5Vc5fD?om)C@{5Z)y2{Q8>~q=pF7&Spa_tprATu2Q8->Bar}E5u z{(PIkMUnzLKcszNW2YWsTyr!(jL_j*wFkWM45QadOq^ktgN-fu0EGdE^Akg+;wcnm zz0Y9*9~R2g=<yME9ztDNpesL%c#kHtiNu(zWR*I8OsE}{y+VyLnOfK6C!U(FUfkqc z(aa5<T$#-sTOa!S@!A+TkD4)`LYbmoo6BRhF?d2=({16jtb-AQUQ;Ruk1|^J`h(ap zmB9f*XWw>*u*WxAHzenx^KOnup4;dQYm@_5$+eY{V(EWi+YE8n2+E6w({S;dR=B(N z*|g$nLKbP$6q}q#&O6Yi$<xyGL&q_M@(%?<5%j2QZ(M6~XG)%w-Ve;{KVoP^9b1U! zsPM#sq_5VNK=B=7gDVYA87gepUAvPJAp9{kk*w6VIS-~leMDomZ8>*Y^$b2Jm`-Ua zk4zVX`^j{}US$d%Ywp`~U^U{kD&4*=blIRz>0?v`V+wy2!>!res#D@NZ+;A}KX%KO z$56k&g_*WImIQUjZj96P0S~AZHc5#HH9pxTUVEk{cTQouwi`6px#_?}c6^Sz#<Zh4 z4aM=p*GbVHG=|XycauFI3$OcS;gNHz2ogqX5loyQnKYc5J41OCjmo*TQY~tJt$ti` z^ib#$7#g^a7<__kDwrHjkmVTKVNwXwZ8B&jS{0rM$(kYNjV^h&UoRNzJVV2!fr`O+ z1%btnXBuypW-%@xbXwUxgIG(XqY&vyvtuDOT5B{>#4%Ybhg$2995$Pyxy^^yR!`?5 zvhDo5JF_4#6Lsqh<589nk1~+V?!YS;+#z9QW+$dFyt3|-*qPa2a;H(Jh6?3@wrFFG z!WOxi>=~$nE=^Jh!-WiV+14NTw+keh64se4$M0`;n~=OS+|Qxo{T#SULkzcFru_?o z%NOEMS+Pq+BF3raB*yUvEEu7ua1I+pJ8Os(FYP*L)_;lYF}BT%Kg2>FrR<RH^qtmX zyMx6A^)xda%mb_ev*Vb}o^2>o;;J1xH{dBApF@3Vt##<gH7%ncWKai(I`LdZ?3`>H zv_S^~V{gXol1<HF(=X_BPCs?}0X7DNOX%8|ln&Uo2L)ty7+Op=tP{@CMvX$L52OXD zvsX|F%JN9Ze5kiXh!WR__dsppI~b5Y%D5Ybea@kVL~jl~G+}YVt!-qCoGjd~x?CfI zFGEi$K8)4MMDJ;#Dz#Vg1=8-lfMrNcK&EpXr&?SQ>!~Sca!m{|(*V(7Jo+fnTUtAU zQ_6-OVLU6TFPX>CP>4$B;9J<m{Kd5koWxxWuR_ES&wHU($8g1#i*6K{?Q{E0o)Oq) zIoHYUvl&Nv<}kK`p19sB3-XKDK`f(e*gKOstX{iy?0D=Hp+E*=p7fer*jI3JWhIAT zb>Xu`TY*(<n6bf7pk3|wc&<G^3&vxxex<s~RTX_?ftbjn;ydvT^sd;u(?>7&@h`|+ zPlIL0{&jr9B95S+HJGI#U`(Ju#)G!T2XlOoL2+VPNo`YI%)2H~c2e7P7?E^f3>TxK zpNykjfI$>zKEG-Qzj0p?t`6uCG}P?GG?*l8IIt4L+KE!t1r!R!hM+?fo8lOp#ML<- zFK8(&F#9KCJ0;hhDBn?Qr{D-9DwcQ#lHYMd0J%45o+7H|6^WF`j$Ra}F!an`2~v-x zWza^`hBzt6(lWNS*Q~6ryYnI9ASG;83r^x}4rOPBZ*L#nxzzTt*`{f@oQXMmhoaNM zV_=-#N9yd`6`I!UAHf(V4NMZUb1x2vLOVbr(99t;7{-K?u%{I<DP5|wL>po*LObZu zAqFGZh)SlA+C1XjoF^m!Cdp93JW;XFEMl+EAq(9=h1N7q1k5W?7^c=ajDH(`Zg_x# z(zguLc43x0E~A+gN^T7DX`2FB6@F@>cvfszYq@i%i~Y52e&K0^&)}xlXf(EVV3Wfg zX%d_zT3-nwj5Tqr<a&3Rq4Lq_qc`Desccy3F-6WE7mgu3zWx2M+|ruGV`LKS=_AZC z+-12acR|a-Fd`V^LzC+dyM;Rg>se#TSiR5)BcRRYA{GXt%_&<%Ojl!AOeqw!GX#8Y z=uzP~0pUm(`Zv`han22afZ<nfA(XLr_!*j(iE#@+BQULHfy{9qcrr>XF!QNmp7#M| z4q(4N4|ijRcHuoZA49T+;4X|YV}!{Wmg;aKQ%2B0#F4Cd%JMBF$KI)Nd^R){dAhtY zf)lx=<)epPukil^0>e442a4hldewpz#p@AFyyiB<efP#)6b@@3bF{l99u^qWduJE$ zNsWrl$YfS<ekRibPL?q4<c1|4$C$jKf{rWsH7hq9ZY|$9dTiT`G}gyCk6TAaZ`^_? z(OWJCq8+k*4`n7xWK&Ck8gC(D4Fkm}Mkup3-6WMU&lIR&GgeLUnL&x{!<glG9pecy zY(#7~>N#kNgHUE!DyD#$5`=<<)X*WL0RvZGXNtJ7{q%-Y66l21RB2(3$#KXOqKBwh z%Q9eAy@@$2cdJD*SL~Q%+r2xA;NpU5IlpprwcTC4F*gCJ@b>O9j)mU6wBEH-8piUK zi%N|xITJ!f<JBmNTHV&-QnYCs{=8G|qVedIJD)m!+NRS_y7S1Ho9=n?y*J%w(^(_; z+jRd;57_j;kq4i$dDD5D&P3K9<F_d~>E^qhd6(#ZNc-P;_+$HBPkY8m&)&5C%rj1o z@A3N62HblSu74+UFB)6B@$h<U5s1Uq4X^Qkt#%KM;gsI>Xspv(Z$)E^h_E%ri=FP` z(Sy*Q_EvDq{%$QU;*2Yw!jd0m#6e8U2fL|f54YN@csMES(9&|(KaTfDW9^m0hr1Z% zV_>w$Vndr$Aw8V+goh5Uf(YZYPWbmB<h)0ayNth2!@t+z-vs`htbf^jm*Be3H#sC9 z@A-UFL-JuH#rbv&$+s`aw{u9otAc#HhUDu6`KE{DI~3%5)R27ZLB7j|<hwb@$8R6h z&QA{V?HQ8qnL)n2L-M^K$Tu@2-%EphvqSRT8sxitNWM1(`R0b?dwY;?en`Ie1o=27 z2DRVs1^E_+<ojfh?}{P$J{#oQKP2B5gM0^u<ojBX@5&+hz7gbm^pJet5Ar=`NWLEh z`K}t0@8nI%ynO7Cd}jvves)N{dk6WNL-L&+<hy!EzVm{7ts(ig1^E_-<SPgH+C%bP z66EU)$u}9~>ki4cJIL1?l5by-@8FPpR|Wa58IrFP<Xak&?@*BMaYOR02l=iYlJDjq z-=QJ-o*d*mJS5*UgM7<F^1UF)w=yK(OM`q|PzTYMTZ4Sp4axVWAm8ecd~Xl(tp)jh z27lvLbPE3Q_Z}ozNB?8}_<JD!oo;`*|DE^zP0=podmWNR{9`_@$LHf8A0NR#{toy* zT+;6G&#m~!{Qfrcg}fK<@mI#bpgLCGwo~nv{m<XaBNf)~&@XR_@~9N+N6ygK?~(Z1 zKZ8G`C*L`W#)Av~Pp)<TZ|3{R8OX~&^z-*fyZqn0HGO6j<@kqw{vK&?SihIPa8q=5 zTx0znihsU-925Q-{248wyl<VvzueE?<Jb<%dlSlg3-YnNOYm<)c`9T7-J<A6ecCTu z-c`T0DSA2DhUGncNO|*Tx%wlE{RY+VM;Oq%kb~tt68{F(?^!5s4EOzSP<fNDM*kuc z%iE5BgUWk1%6ow?3^=H~b(Hr3+-G@{_&2D$84ObPoBs_eul$;%e?8xM8Xk)KSN+jM zc~AF+0SA>giSk~A`>fwC{2Nriub*K3z8KWc^PT<b_s=Mg<J12J)$bc9kM&~xcH`fm z`W5dVMdZ``Z%}#V*KUfgK_-^x`OeeuceeeWjPmeb{2Nr>OHm#^#mbun4yxbFP}pH# z2=e(qv-9KaDDUOC$@+P|vtRx048nOL<7MCLlku`|Nc|pw^8OL`{clkHIw<dcs-NdO z`_=DmXGhUyUl?#uc{jgdQ#6YE{N4ljH>mvzDDQc=?|*~JyA|cJEdKL+=V|ym+rJ+| zdH3~&0SA@0`;AHeUWI&v>i2n+cbzX}NO>KU_b%jP{XE~<uYS`HKC%8i`?jQiuO3pr zD^Xqr_x;aTH9P*cp}aaWv3`sAH|Tqxjq*;U{W>Vm&yUWK@@_?W=i<Kq4XWSGC~p** zSU=Bq_G`b7onZUj8noXvD09&Feh%fKi{sy*`n?_H<&cZ@^L%H&`h5@O-CMMpg$^q3 zvncNx<YRg4t3mZU^_(br4GYq5P<fZUWmEKd<Y9T9@9bB<+fd$>ck-nTuHU`i3i^DC zE01$*Q2kE1Ac`(VKK~n3zpLJf^1w&1exC2_SHH?dj)yy5dAGiAQ}jq=VtMQMH>iF~ zD6fF~{x_(8Uqg9*eq4{tgUb6gl=oxLgd*Rd^3Hxg_$w5``W+im-iuMWm!3fTee%Pb zqK~Wn9zUeK3O?d#xbJ_1>i2>_Na*R!$UNwK-;45o(-#IDRNf_@+!TEU_xZg)hkt|0 zyS8y+>-pKAO4joy3@PuuC~pt$``@7YJsIU4Kql7j7w~UT{q79rWzz}t?-x<t(~ytl zJ$XoZXIvUZr}|1EpZ_yUpF5uh{liU`_mm;!-SgomMxUSg#|eFY+K}=_QQl3s?|*~p zcPq+!5i+rUzl48-+V52;@69Jb|1S9q>ZkU5=8*E{#-k{Q`~Ekme*6A3q0i4o=0Wva zMS0Klg#ibZw~q4Oh5P(o<{wnvN!z1{@<IO_RNl7FZHlf&CYJYn{2Nr>0?Ip)_4k=5 z?|v$e`;|fEU5oNI<G%k5s^6_BZxoqWzhA|_LFGN`1k3wmP#(w4pz_{~^1guk{x_(8 z-$!}uEY|PW@NZCgPn$R~e(3w3Pw4$ihm`kTly`SuIpCoBZTmvPul;&Z-V=joSj?wT z-YI?7-&=4m+@D{9@=n7we(%fi&wuZ;@Hgv_$3Ol)vnz_aXZc#WdrYy-!+iCtH*Hu4 zdH)soH{#f6`~~>|^407w_dn+0?;ZH(|7QB-$k*W?`muiey%qn$@0i4Qu&(@$SL2`m zj(gy5yf^-x+}ad<B2Fdm;yX_Yu3rs--PMq-ydKwHi+?PS{lj;L<$d6(s2}7J{ukEW zUn7RsPmaF(<M7^yNve`7BPLx6)0Nb>a^#(v+{Rx;yU%ZTzoOlLlTU6azZ&1+A0x(* zB$q}aEOx<fB(>9K{!4<pOusynex=nX8PDvI<TqlHn=t*zB!Rz1OmdQ38ZpU7nBI{j zEI$Tk@EeIJIY@pZw(}3u+_@*ek!Uta;IEOCB!Fq|e3RcubVZWDUn92SCznQS=NP81 zN)nd;XEW)mGwH=lI-CJ~UoUh2noOEIhvYY6oPU@m=brpVY<C-`$vG##5#xNr^z}&s ze~lRDnOqu)$T=pzk%*jM@*6SEElfWlN#L&$<D8O9BPj_d?~`*$ej_PPl=sOwB)^e} zD}VAEiMVnnzme2R&F8stCclxCq>lHwawWeJqk>_YD@XDhiAedA-$+Eto%}{Xu^|2o zew$1-oLo3*Lywd0Ccl%Tk0%NIb*Jc`Q|VKp3qt}Fof<tRl|C(kSUUKf9(^#CzH{`w zRQinQ+>ls;+RUfYcZr^yO5ZhlTPl6G=&Pyp-J^SkL=_tP?Wy!VqqS7}UeT*l>3c_i zl1kqvI>j#(_Eq<ds;Tr@(ZN*ue$k6k>H9|?O{E_Y{Wz6=U{twN&|KKrFQw8Cihezn zesJ_hsr1i8r=1c$pNqDq(&t3irP7<DSEkbEMxRNg&x=mOo-O&EA3ZFUen_;MN?#DY zA(bADzLH9BiSBh;Qd$&U80|`>w?;Rm(%YijQt6ALFQ(FC(OtvEI=VR8o=WGVqp5Vb zljeMTRahCMZ_T7rgA?~tgA3`@;6N(XnMkKP2kBJfBAsd+q*EV<bgJ@52MhsfIue1A z2!11()q5nmOK_L@@0v-csl!N$Q)GT}ImvG%x@VHWUn9}IGU<C~()Y=v@0&?OSrPn3 zQW`OqfB)bv(+|j`sijMPBPmH3^FJuLiN8jo2WQgM1}49eD3>Jg*GP0uCcQb6J~xv- zFOxn$lYU4heL*HYnn`cTq%X{*sZ~sVBhj`bfxku~2z!FxNJ`Vh`xggynI@;3{6@fW zzgk0(Bl8~M58s3||MuzMLYkxgY`gytKYowWympW1AAbB%q{*+jbS3&U()_Wd?g{?! zi%Rnv^L;y${t?p5`!xJx{<{QIfcYPoNpH!dYe<t{{f?gBk-5J=lXkZGW9{g?PIO)? zy5VqntT5IqRXer%Vy#hJEcXhPN}<}Wb-LwZxmqhX7K?4mw%onp(9+`AHDmR$ZlP0d z)Vq}$yrUb{Vy}(I7rT{wwa}_I>IGM9+Z~F1%@_jGjUk>_D_<?4{B{X$YvpdeQ|}de z-EO5(SzIg^><vx0Aur(t#nM=#(&=`~`AQ?7Z}hsQ)?&3(X%!lU#l>2w)2>!6KTR%I zkiUd4DA!AcLZ{QMRjRFGtJ^NtN|nN5rQU*3Z*Q^T^LM&EJW#0D#v0u!GE^7qi-l^p zP;TIu=SrzqX_WKjMy=F!-+(vZFhjngJXUHI@gJHd-!3*vi=|Gn+bVYJjbgn}t{1wl zN=>|=b@b4>i<p83t7C=EBC=NMg<c1rQ?KURXtr9fSm+eWwJwhPWgpPsAGwQTjm37O zUal8w<wCd8Ew&ovN`4WoTq?J!^>R`z_aUWn17F`Ow=0XSUa!<^6|40I93B=+INYJ$ zX*JsAnw7uWg<T-OygJrf>^1ns`Lg*Ob>W}TYt`Ew9BR2(K(AVU3;4ncmB#X&M!8X~ zR~HxCtxl&<#eodfVyE0|6?*l0xtD3$a(=9h@{8TY#cmtNB`=m*?P{%(XMgnawQ8la zn0~=nx6$sl>+MFqwTLXWTBp$~HyYi1wbh013(Qp6KE6Kn{8+EJ*y~{AbQ`@=8Dpwc z%NN`ETCde<ELOU(c4vM+G>T*8R;yksmTSd&vD<D{+jR`~UZc}3l{)oKPh-_*uVUo2 zEBRg<1E*JP^cM5&cCXv%v^g^xg?6P;_r<%pP^crsWwlT#p>x}d^+v1Rsnpx~9zLdk zZ$UG=_Qwk}^s0q1%#>cQ-fDCzodS$N+l5NCT<Bn=w%V0iVX<egz|jE+w2UsOk9B$& zbG3X4o!M=dy46OlT&))?iv_e*w_5F_t5m6vl@Ot?many2XuwjVRKS!(w-qpx>n(I( zMGr7CfxV#HYm}?4P99^gh3{z8^6e6Os@*B{+U3Q(p9?;Jbqtx%sJ&jL*e%uyMGV;r z=32d#@AgXQ7Dq7HsBX~Z#~S&?YNOJtRPyYDb_p$8$EYh|*yan}ysHts-Z|vTW4%Vc zTc|ba#X`GW%~w!<3(bY|!D_8?r&@3$=-3h1$R6&(>VB<xWDO5i%VYI=r&i0iI;a|G zQL#|$b*hz8t%qUJZuB&^g9q_cp*B`5)EkSXTD@Mw_^(#G)pnuW!m!71hgEsUweK<b zR{K$iJ}hB`EVlBka<7E%uA=ZxzF4Z2%av|BUxYz8M<JhSt>MrDPQ6NF3@<2_8r6Ik z<OY3R@07dwcA;IYw99CqcF8>izp3@3{GbXZADXG#sdh`fYPZ*|w=tTF<;705(Wtb# zwXSQoW2@bR2&BIXyW>`a4N(}wfaxw)i;MM24J}t})fZdcdcN2rkzXvu4YAfe+F3yr z4>u3C+k7%Vwphe?&vz>wki%BFP(paNavAfpSSxnBMVxNP4>Qw$<S&l(x)>$p#l<RU zI))bdzfddJ+ZaPNd?(IF)@&3R1*L9P8iiJQvC!!?x+ovhxUyK!H)_2Gs@O;x+emx8 zG}bEPgE8WJmHJ|_Q_Z(pjBr|N*SZ+ii@tY`!q@D`TJxG4P%BXPZU-&UX!UBP#UAEk zz5?O}n!Q*<e->I$!dUmXhwwz9UL6A+$0V*}+;`E)Mf7W}+`*eL@v8Y6Jbc}ka1v}k zx^$@1UB!cqF;oL|3e%;Fwkj7ZwJIh}5hS^oFI20GZdu?!==$K*c&t_)>!R;#m3FUQ zu@PG7VAysG?LxN)B3Uo`vCuwx5WZ9PS%o}EN4`+P5|UrUvlY;#a<9ACtJbmpU;(T4 zG&9!hDZHmxsElES!s=LU<k=jU3iVzd0}#WaP^h<Rbv5`woVf1WuUf=Iqy#-=tn{iF zd<BfBMhE1lTu0y$oRVkl=N@AFVVwZ6srSn09!%bR2k}9>i=}q2)55CKE}{?Y5n8Cj zafqY4IM!`1=Fx>{w$>sJpDZx+KV}eyd2f*f+MZw^@eQ@HdbN&`*{M}KE&LA?r_ku2 zEov>$&Kl;Gs}p?>n}_g34NqW*6sqNVt(8Yh^?2Gwqm2;_`}-p2kDfTZ+D3c<d!~ft zI*)a_g5|J;igX(FUcHD9$9U?t+n|l%GyIBtX{=setarP;UcOf;<gp}IumYDkf(lrZ z7t3XP#C#(8Kyj?l0%figu$-1V?M2P)2F_K&YS!xENH85^)arq_MXh5?E;i_fV9e{S z!$;(6xwO25xK8rUpGIP-b!h4F2$Iz_7mDW5L&aVnw@mu*HxY@67(YJOUF#-=Av)9Q zx*qK=cjV8R1aY!h67jS1>nlf$ci#H?$aZVnfZR2meOqMQ`_|Vv+4weK9oM(M*4ejh z15#Re_HRZex8C}O$n1r-0gou(I*|E}G2dGvlaBE{PvCVRdFZnt;HK1y*PpBFl=+<f zTd;-H^$+O!$9etjQS^0P|AwxAU)OWk9<#pZ0a;(_|M=c*y#7Xf2d@L`OrxHcFb$*~ zCGYRnecIx(J_ncvLNp(p4S{`!*OBiUUI!jy8qY(7Zsl+{ebSv>JD!BCEO)C!?mCIw zJ)VRuJ9mM^bBNdib60i}w#M8oF<(V^iEu*rDB%Gi?W~!<Cp;`<yYo8rki;hl+0IN; zYDfHS;YWmjEc~+Yo5CLoPsexix$}i3;iPa{_&6ckhxwl({1xHrgugBPJt0)0mj5fl zZwY@SyffO2<=s#C5Mf!kU3j_hDk1Gc_}ulvHwu48_%R`6b<9V5PvV0iP9bg+K2$g@ z+$U@aSA@3+Uo3pB@EyVr3qLLVityXQe;3~6WcU8Fg<FLW6;2Be2r28c?-c%`@CCwG z34crYLE#?>zbyQg@ZW@ILTtoxA1J&~*bwd#?ib!5e4+4_!cPkST=*^FkA!!|1mb({ zCwz#oESwO|3$GSFj)*>67OoP{h@u;H|4F+3RN*sp|M|NAGF^X#@YTBiX5D|U@Q;OG zCW5YgP3i9vL2v#^>5)^B2Hl{nlHYS5BIv{el)iun`ho1xNvAtG1M81&H+pay5ya!( zns-JoP|ib?zF0`T;z<yJjVtZx!#<@SO@v77Y9b2j5kZWWi4c7qC8AvFN>765>#0h= zK=?A@tBLo69Rd+V%+rncF%1#eM~D!8{VyT}FMmozrHzh2#P!!qL$viRVlIllPdq1z z{+)>T)1Kp`%~5nW;<=!cL|orYJkQbblg@|T5z}adhVngvcmeEHh{%715US7Uq)|tw zd3}ZHEf^2F|77BYu)82`jUrE%ew}F$VWUqMMbU3DJr+gpC8C^<3Sn9jopf;&{TVTj z@6+{f5(^jy#3JmPh$#OQ(vuR_1!5U;BO-|W1Bq4iD-q@Ag$<$6Gj#GUrt7f7B|>F+ zK=-dEqWo2*ZxTL<_)yq26CV~uzpU%8AYxH@9r03USHkytI`~0eM|nmMA09=2tmpom z_=qU_OX4G==x>SR)V=`m{24;O-cgFm>lgxt=u$&;f#JnMzs{kGb{$0;?iB73(jJ86 zT`6n|yTWUQ*9mVB-XeUG@ae+m2!BQR65%U^uNB@Ve4Frhgzp!AMED27PYXXM{F3mi z!oL%KTlkN{9||{dyx==+J^=5c^u2_BUi^&GejVPbw9OAZS5x{@;e^ny&ofFd2&p6E zdu`qT4=R0FxF+=T=jWCFMd34q&lA2-_%h+EgfNM=_q<v74&l3n9~6E}_$lFMgkKPT zS?K58-z)uH;SYrWCLGZ?K3#Y>;eCWQ5AogSD1CwOB4J7B=j9`mo)TUr^nAyDr5`J7 z3zvi|!lObzZ=b02Q-#kG`uY1}rGG>CYN6+6-m3IFh3^%9SojIy9}53OX!9H2Z}S^y z^Bee0-T$8OUxYsv-f6`3=NZC#2+tBeNO-Pri|}G$Mffn`xNxU%k8oairLZaN3a=Gj zC%i%E`LHJ`{dD1TgufzuiSQLd&#&F4^xK5LBYeN`Bf>urdVcP6N`FcCRpH+WJ)ifF zO8-!}N&MESLeKx*OX>Rye@1w|(DQ`_rE9`Vg%d*0FU}~vAbgClCG>pcVWroEHwu4V z==sZMDE&O)3xzKedcO1ZO21k74&l3no*(^~(w`E3M)(Dx=TrY$>Ax3#SNH>==U+## zP?5f!F1(xYK0?peo}=^y!i$6@q33rWq4bpSGU4Sy&j&wN>9&x%bJk-;cvN_k@QK2w z3ZEtXW#Nm3zaf0J@QuQ^3g0PwukgddPYC}|_$NZokN>68e=Gc^@O#345&l?sCor)5 zo->5^5S}G`knmjL79s81`CLW#FyXjxr*MzZ^ZQpS-4u3(*9vJ%z;bU8-Xb*qAJ?C* z^mBy2B7BL^_<!Vkt<tv%-zNMW;roRj5&nVj)56aQza;#s@b84*7XG8~hr&&#y853g zyo>N&!utz<MtHt(tFR!f2`?2+2&aWJ!Uf@Dge~Dg;bGyL@J8X!3x84g4B_*HFBHB^ z_$uM+g>M$VL-=mt2ZbLKeoFWm;TMEo7XG#H?}gtL{y>Of>c*$=j`FAI9xLZALTsfh z{XpSnq33UZQt$m~@x|Ht-`?-XmdM%%TNguYB@Cy8yM>;ww|y$+T}#)m5v~ZY7kYmF z$x3JInN8o({{BgobG-f=)UJcxk1e>hBev3p4-sOkYH4gO4gGt!D?Kfo748@QtgtIQ zBwQ0dUid`e(}d3v{;Ke0!dr!J6hee+_3`_r4=DXHp~(x-?|-877lmIH{%_%Th5s!4 zvG5e}_kN#rZ>1k7H2DF_-=Z|-zg!>u{^;RKPYEgi<^6f#qlJE7M7b~TXZt6c&W^hW ztG?$8A!4v{N<wVaEj=#WC7cmnA$+W`BlP>;Ri$qfK0)|Y;j@K)zxz_9UnPWS%HIE0 z;k$%>pZigzKPCLE@Xv*RCG`8-?<jq|c6re4%y+KxLv&;HEeIhRvGgN^JA`|L`-G1X zE((`~M}%H(@N-K4qVSo*LEkgz`dNC;f2Xg%Unefs{ff}fTR#qV>bn09PcLt;9Awb< z{IbgbHQ_6SuM@sm_}jww3V%=N<sN^m^cRF*5&o^v<bIepUf%H|T_4eWy0h>e!utum zoZ}%%UnDFGA12%`^zw~arS}VeR@fCD5@!2t5IugN>YH8X{W_N|$It&k*ZsKgbRnBB zoA%}T=Z<&(j*hqgE_CMy>aTwn-bwv^rqIjN9-#C&!cpPH!m7~A(Y&7PGF_h&UMZxW zkn4k&pDinWR7gD`?>|Xs@@J&I-0VfV{u{#A2yYWIh76zg^0E&p{R!b82|p+N3!#^j zeM9N*3IA2N=_FU~X+kd_`;QuDKPkF)i~9FT!lw(LBlPRtOO$?v@W1PKy;k3MoA7Ny z&wu&#{3E*V>G!9V{+#ej!mkSby8dmYJstm{(kE#goi4n)@GRkjh35;m2}{C<3de=J zgkDbV^*WE$^^Wjb;i}Nfr=OtoQ-#kKdOgoemG*M!Hz@s9;k$(I7ka&qmq&kA*Z*Aj zSHiy&en<EN;lB&-r1@ofAk5=?Dg6MUmp_jxeX+1Ayi_<T^m6AprLPp4UI^tMRC-zH z<;^!MZF(Z)`z58HCw!66%b8!J^lieo3*RmLkkHGQ|48Z23I9U)*TQcIy<GWUmEJTW zIwZWC@V-JXPd-oSt-_+PA$+9J%aQjgy&$|w*cLuc=;g=9l>T|)Q-seFzCh^Z#;;WR z^}@FZ-zj{b(94TIsq|-re<u7(;n#&;PW(?w|C{jSlU+NVA-t#1%ZGDHUmzS4R)m)b zy<GTFN?$JY_5@9(dqOV{URU}i;V%fEE_|-g%YlDg=~oNiBz&9jcZFX5`*EfJQ23|9 zFA2XU^m5;SQ2Jkl+@NutJXLsCp_libt@OD<Z_iLrx-Rr`-W^Ks5$+QL>^)})vwYee z<->m3>*G&r9oZy0d8*Lw>pj1Ae_i+c0>7SY)%Aj~CVaSXO1N7%FC4VLU(x;Rg|`UJ zZUE!z8A?B2_+sJ9g|8L<rqJs--=p-0g}*QSwD9x7FAM)h_)X#Wg+CP1W`yJ1>oxDL z^jX3O3(psB6PAPz6^;wd&H&}jD1C*{>oGe@Un}%>2RADH1fkboK3nNu5x!LTD&ZT1 zUT^s>rQa|7sPI$5&kDW1@~@QsJK=YPKM?-A(CaDB6#cxH@BzYegrmZXg;n9D!b#y} z!a1SWOJ1$?LE*CSsPJZ?*GK-6($5pVNcbDV*9g5H^6g5$TlgX2Cxm|_^!mrYQ2MWh z-w=LJ_^(2*cRWq>^KQcX3LhjqPq<ZB6gGs96z&x66?#46RZ6#oj}u-eJSOz|#iuC! zETOk!dx_Go6necP;{$O%yi@o-;YWm@6ncH)pDF#9!mkUzE&L~;*CU=Rx_^f7p2GVJ zb3(5_98<a?yhJ!5e3a1Z4G$>Y6!wINh3i7EFZ>0ipDui^(A(Y7H<#_<^@MLy`fbAB z6@F0oaiP}_{;ASm5`Ini_riY=dc7bG+HBnw-c@)X;n_m354=!m6l2fb(RK8A&wDw` z`Ff9+zaH<o|E}xz2h<K96aH6~!~f4Z?dHw@tkbR?{=2W!|G(0!|0ucDPkO)M<-`-> z&u_0jVolFIUid`e(}d3v{;Ke0!dr!J6q?;K*8Sg6`UAp`3ICVyPlR6-epUFth2Ita zv+&14vu8&6cM*Th_?%q#A1K@`+#>XL%{8STE}RnX7S0PFEo=#|5v~ZmAIB|9GX@La z{|w>th2CEB<x0O+_?yCa2;U?0c9OrZ^rwZN7k*jzH$rb8`F*8-C_G7g_36U93(pdI zzmoHn_WmU$rM;iYxYE0XGr}u`j}>-=-VSnA=^KSl5I$A-Y@xS*e5ul}623wBR^hvZ z-tO_EN`FfDS>c}x|4QiX9lxXW4}{*o<xb+S&lKKE_yFNK!cpPHLdLjZe_tw`6kaBr z6J9C2TIlT>mz6#$yjl1p;V%ijJtJf0@O{4_e2wrn;oF7Yj`2fEe?sW}Yd)v+UkJVZ z;y0B3p739Vn?UgS-qVEMZt=cKKS+3<aI3H=YzQAI+$r2ETo7I*^mdAmQ~EmLG2zb( zpCa`3i7!z4B|`7-^LnM<BJ_5N?^F6CLhl#!8KwVB=<N}|uJpHs|0Mi3;mO)Zcss;< zDt&)pPI!TEOz7<oFHw3z_$cA!!UIBYci2<<uy9>?lkgXW-rn%JO21HuYFoeF(f!UH zwHLTr?>#7779JJeEPRsir&Z6U-rp5oE4)s4gYfq1|6Zx*UN8L5`o816XVCuic=kcZ zEBC+J{x#b_Z&5$JQ}{mNM}(ggen$9b!oL)LUHEO`KMDU$c(VAJGlcgPdO34W=?jEo z!iw+`q38D=rS#>(1Hz`TCp;`%7v3cN1>w_$&lSE<`0K(~3*RJsoA7sq9~6FE_=mzj z6@E$hHR0b2|3UaK!btqgslvMo?;|{0c&_k5VL@0IK0>%dxJS58_!!}$a7lPXc!Tig zguf_!rtp`Azb1Tz@O8pB3x8Ya{bGJk=|2#9f446v{T1Qg3cn@%N8yizAnQiY?;<>& zeXzG1sww}&g;T=a!g=ANg)QMV!WH55LQfB$tn@R4&lkQ}_;R7w^ZcgL?-0I6_+jDi z3%#Ad=av4l@Nb0Q6n<ZrwGS9XuLfN|OXd8e>DY<3=TEv`+x0!u!dc;d;m-=Y!b8F} z;p2r*6h2M(9O17DUnaa&_(tJ>S9{$5kpnvV^PeRLJRZIKNza>cjo+QZ|66<5L3Hv& z>wTW;u~k?UHiVB9`ugrwdQka;u4n1rPdeYZs@E3b#lk`Ri~lP2p~oAan={|-*W+ya entl*#yshUT-uL5kNLzlS%SzjNjkM8o-2XpayL}q~ diff --git a/quad/sw/comm_dev/Debug/src/uart.d b/quad/sw/comm_dev/Debug/src/uart.d deleted file mode 100644 index 9d3b97b2f..000000000 --- a/quad/sw/comm_dev/Debug/src/uart.d +++ /dev/null @@ -1,94 +0,0 @@ -src/uart.d: ../src/uart.c ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../src/type_def.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/new_comm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../src/mio7_led.h ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/timer.h \ - ../src/log_data.h ../src/PID.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtime_l.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h \ - ../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h ../src/commands.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../src/type_def.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/new_comm.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../src/mio7_led.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/timer.h: - -../src/log_data.h: - -../src/PID.h: - -../../system_bsp/ps7_cortexa9_0/include/xtime_l.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr.h: - -../../system_bsp/ps7_cortexa9_0/include/xtmrctr_l.h: - -../src/commands.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: diff --git a/quad/sw/comm_dev/Debug/src/uart.o b/quad/sw/comm_dev/Debug/src/uart.o deleted file mode 100644 index ff3ed33f1cc9faa83004cab28a066ae2c5302c2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129140 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 Nk+XjgIp+f-{{^bZci#X2 diff --git a/quad/sw/comm_dev/Debug/src/update_gui.d b/quad/sw/comm_dev/Debug/src/update_gui.d deleted file mode 100644 index fae031bcc..000000000 --- a/quad/sw/comm_dev/Debug/src/update_gui.d +++ /dev/null @@ -1,65 +0,0 @@ -src/update_gui.d: ../src/update_gui.c ../src/update_gui.h \ - ../src/log_data.h ../src/PID.h ../src/type_def.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h - -../src/update_gui.h: - -../src/log_data.h: - -../src/PID.h: - -../src/type_def.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: diff --git a/quad/sw/comm_dev/Debug/src/update_gui.o b/quad/sw/comm_dev/Debug/src/update_gui.o deleted file mode 100644 index 9c051f0870a9d8623af89b3684fddb90cfd10df1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107884 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 JF5?>I{|)A~{z?D< diff --git a/quad/sw/comm_dev/Debug/src/user_input.d b/quad/sw/comm_dev/Debug/src/user_input.d deleted file mode 100644 index 11f7bc7e7..000000000 --- a/quad/sw/comm_dev/Debug/src/user_input.d +++ /dev/null @@ -1,78 +0,0 @@ -src/user_input.d: ../src/user_input.c ../src/user_input.h \ - ../src/type_def.h ../src/log_data.h ../src/PID.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/util.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../src/controllers.h ../src/quadposition.h - -../src/user_input.h: - -../src/type_def.h: - -../src/log_data.h: - -../src/PID.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../src/controllers.h: - -../src/quadposition.h: diff --git a/quad/sw/comm_dev/Debug/src/user_input.o b/quad/sw/comm_dev/Debug/src/user_input.o deleted file mode 100644 index 540f4082e4fdb47bd0dff3b3e6e594113b669019..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119868 zcmce933wF6*7j7*OeV-Kps1)LYr>Y9?2$z#$z+jiOePROZ9*1^h9qW@MHCT4WKk9o z6qQv#L0JV{Py_*S0TmUzC<+L!Ad0(J`QNv?du9T7@Av%w_x#+O^LABtS67`n=hUfF zRpSJ2R+<pPV*V4B2um<!v9ueeQubK&K!jzvWr@1q8)@F@YhXVElMPHYFwMXW18+1i z%fK81^9=ME=r?enfrSPRG4Lh>Z!vI~fx`_fF|f?Qkp|vsV1<E|238wbV_=<ucNjRv zz;OnSH}Gx)?=kRR11B3e#lWcsPBU<Zfe#uu%fLAXK5XD41}*?vGJ1S%TQ~Dqi+8h+ zg<Be*Xwm|IuB%R1EsKx-eeT@1ybgEHJrNFE*I|;nXEV~9jI_l_zigzN80oEM+BNq? zuW_H9vW$D@)b&6CWcgd$G&(L@^gA9AX*({R{f@UzYJOa}`W@$YEzZS9`R%q&<C`d> zyHQ5BkTMRnZCJ*bi<HsMC?gzYTy2!mE~Jb#m+NJ`9--IclZ%w$G|GrT8LYdd#o`9_ z?1=jo*W%;6XM4B*G0W6#U(LE?$_@B?b^F%nzW943d-TA*_<P0VdAPxI^0tLhu4=n$ z@zKz7Z0mZQu%M4R;`z4dqju;cr?c^ij;_Yw&s8U!cwf4TKW~9_3tU?)`NvyXEN|Mz z4L$YcxUHw<xWlKqjO%i`W5~0!u6LaNa@=pHyNug|`~6SJaaZB*FrMFZy2T$qoQ56_ zVOqa8^wgym%Qt3u!YHrZKa^)hc~+Fi=R(T+7t{K^p{HhDfB9*}$9Jb6vxIN^>Y8&= zN5_X-ERr&5v5BPSum#~;Ef%j^<ydCucT_^!9F>;{ixgq)=He9*{&zosw3jtSrgWTy zz*}wh^2$1k47cC;2kwPC3cmr^>|>uJIL<tzAY&W8WuxAqkOi+<EcQ7AES3n_xgFXc zHoU&fBD+vqWe1C6Hw%cMjgcK}4j1YtBlT3c<Lqrnb=6Z%9Do0SRF4D{Av?5i{9Od> zIY^~iJ03rXR8);hwROD8y1C}4R69o_7zF8lR;8SdF*hR>{i;fJw1f+m?nbJSBCHjv zK1os5R)2t>2|mz>@8GFEf&2WhexHrTt(yb4Sc~8-^VKnd`>dCK-zaqfGA<FUpvp#J z8*$w@>V4EZh845NTw$@akk_|C*Ey!%iR@lFi!6=-alw==Y;4i!z`bzCiOAr+CYHu5 zMD~6cMN6BlIK^UVk|@*Wu*hXsBQM=7^7?0y%H$2%A>1(v##!E|r&>5}pNLd{J=IqK zT(+Ka>Q%|nQxSSKbM=%9a$}1;gf`7!Z|8ME*-ctV-wB{zNWN2j&S;NcPucWB3iOoG zo`HG_?P>IHlr?BM%W}z~ORQ+f&>N98%q;8I-AEOgWfiYRYPea}2Q4AtBaE^fN0M-F zq@HTwILTDGo@(uANzJ%TPqlSSvEsc7J=M-}q7hOxddlhOa2KAe(^DNCBQYAvdOa24 zsATF6J=NXPcwQqU$DKjl?a|p5OFub2#)kU$>xk^Tbf#Gxiz&Ew>#6Xt{?!&aK`)?1 zSpRa1yhl&84(nfHkrVYqTgOjp@Y22dOHRjChmo43ry?9DpF(P~o^pkiK&$W5UrV$! zW;NuLHQ=KC5M-{cocbtg6qaX^59rTW!ZIy#ntp8yOSQ=9`gOQto`zRv=&2?SM>0|~ z^%Qu?Pd=!pT3Z^kX!%fIlxz=gVX<_V^KEvt`}J>;y?~cA5Gjxpxm16rt>cq_A+=0T zwR3cBiqvvF<#hDQMQVjExE;f4hg;;z)~b*QOH<}D(Tv`O9ZI!}O2x0rRm)L<<_{mR zSU$JPb%_qtpfBuz+@P0haU5ZNHtH#xt{$89uY`w<C>mvvTPbd`LleiK>wqulPxf}q zYa2}Ua~$j+Or<*Bn~&5>k19FOaEwM}<Tk!%?QoB9Jb5&joGctRO5iK{-KoNHI0nh> zdUA$v+zP+WOwJOHjjMvmhlS&QcrkJ(#mU-XfpD}t8B87$4oFe(u5?VIp?_U}_>goQ z?TEWZa)H&+<%3}Ikk#=tEzd5aWSgUHR4{qS=GgvoFuB0)SYLtU9?Fol!y&ulaF1Z} zjNP#sE|qzAYMA4)4oJSCKfE~1apXiWxi!r37CO+p`)-({%hyQm)gS&U%+b3fn7qf~ zXz^4qxxnF2M(=GJPHTsC4#)nLxVxWr$J$}L!%_4llJ8LftR3EU=rWUml#&^%r7=ZB z9_U1o3b##q5k^>){EG3ku^L2BElVBxk^jUzyw-BZUf$%ToL$#45)2ZJ7phb>1dt`$ zY*(VR7GlIw-0P@{VG+ym*PX@eV=?N*j{1vrmP<wSWw;Y7C;)trBX}VnZu#LZ-cXV` zyQJmcy@IJ>EkD01n7XOuJrD!)$-<TqD#h~TY)i{VF5c5qwpRW!q!RQpD_VcTis893 zxD;(_O6x4*di}vV%Vo?Tk3T&>MbC$Pp<<#_vsR6*&8}+JQd}xpggu%ZhEH|0G;Z7% zx!|^Oi9&77k(=2HD%wg|n>B8HedAt@1(IP+E!J=*GFv5H0tH2~Suh#iMs#VC*@_P~ zvRnB2CCp*E@nwN0F*39g!6KUqp}*4XI=m9q7&btC({6sVMNe@<6a6zRoptXQ_DHfS zwxvB#tVDe-z1XAklbcv9tzsKI*t#*eaj9U<+Tf1SBo=X*eh2*GKPZYtTJBN^w(vTf zNa>K4J9%6EW17AMpCyjhufvHHj?ibBUZvkxxJJLW5h+BW&$dJ9$ilzCry975HvKNd z6WwPK)^Mx6QJdFs-PmToYV6;*xY}-Sn%)T)&BN4FHfsxqT|SJ-lGPS&@BKKu5gT5z zUxs1LV$&Z9q1N`7=qY>0em=a@sj*Q?k0$oUXCbiGrgodPSyTHZOEE9AHfd%LtA_Qm zI-2Xx*{n@l7zLzaie#~Rjq;37S$norw*&dsv`h8pb!zR?szI`ev^R=MWSyI~wl^w* z09%{1v4>~v!^I`xdZE_V#y6~&UuKuT!HU_eS6tqpn5J!2(%Q^;Qcsm!VMAN4)StAr zxXRur@fwudxSh56)eT;6a*ch32rtIH=ft(f<7<V}xLPN!Gp^Q)_V&~pzrb@j9qj#< zmEa<?qcy3Mal2P%{laFwv5Q@vs>SW_2;<%*CZij-Gak|*lv<lc8c#RtYM&+SPoaQ? zqMJRx9!Al6OLu#pU0>lMx#NZXYO=p&4|}(P@K$a1R$1%GsAfIw;dk7Rx0*)To184b zMQektxaYE$`$r<H#@(PAmqy#e8)FJ(y`-nj+Bn88r(s+%ztGC4f9M-FinCoj1y!<( zN7s=4ySV`E)Qoftd}6!!0WlW4c%z=zry-_x@pu(!pFc>ej*`CgJ!#kXNZY`)+Ql7E zcDwlNM$)QpNIwr_IcpE|`nO+5bG)RB=8@X3BfUJC^a+e<c5$!z%7%Pi-w2(w3m4dl z?>bmc<T_p-g_*L8pJ0#e;%8OPcj}oPa6Rqf<QC>nQ1v;a>iIOZ%Py`RM4FDV$}TkZ z-2!N)UF_;Z`Wmc{U1YpN+V~9VCvb=DqO?D+&#AAsQd}DL6LTt5ox85)b#)qPG$hR~ z3SsQ+qD6Po(~6Tl-sbgR_mO&=lUfzWn%u?fEpL);{*82h3(_pbfpH#QAODcF6=dBm z_9<>p9>(iiFkqmi*`yh&wo_F3x0W+!^%~L_6@MnHuRp$tIakdmy?qbqSd5l-u@3VE zyXbd-^pJY~F_;OvxbGmTKZ5jmRjZn>c|8eAWEb@hkuFgE_?UWkhT`N<IAL}%Rq?0Y z)x7@rQ_{z8Cw&Fx6gjGAN5h#zD^xvSQqLrgV$QM^r1z@c*{L{Lte&3?V`>-E&XG1! zHGdb;JiEBw&z$lU(ga1@s^{;IW6pa@Zk={sUkV##7r#y*{ZeuAuRgp!)Pm*gwvnc) zmey4;e^ml$SP#<Oszpa)dA&(}<q{=<CzYIw1<Y?7O<H{==`2-Ro3*^2taR#-s{iuc z%=u^w=~`9V8I`|NX-6le9XG2lJ|Dwp+QI?1i=+b5AC)9ee2UjsDc$U|OWjpGSv-T+ zg|kVe;=ra~d7Y|C^C^yXQ|%hxlKF2hCmpK#bhVPP>t``%r|OZ1+wgi}BhrLHq?2wV zecwx(;v_9nT<xkja7}aOM9d@|qIzVJ;_$dL%y~oA@Y>eAe(E05uVKaP;?^?KNcH@! zxA6LjF{C?cN&6rM1IsXu*Mkm`9(arN*D0hwt8!LG@!Ik#>2LL<Jp}0`s-6|<t*)n- z^YRU(2e*@c^8;x?Dru>D_p>x!$Eo@p+pX@ZwqKz%+IlN<?*EhYj?L=HPNXj@35l!W z^^3DfH?AXnQc2o&^_6)OnR9%SqSd7P)$?tB;`I#G<G&B&HHrsaZzZ)WZh!bJuRq8n z9ie!;;VWK0ejn*gs$VMATU~OQ)51sko_eyIYTW~WG3WXtq+$!{gUTZPt)#2B>bs$r zGCxMOIxmseFSRGVdmib#*ODf<NvEo|=l#L!g9W5Rrjg#Idf%z6%Bhc-Ge+6`Ezk3M zzsj#0#_RIiNsl~3`ndXfx1qc)?Mb>}BWeG;Nq@bSbk^^r*L_3!m(sXNAMkpI`pQ$k z^7<9^Ob^vN%bHMTZd4NWwc_e=)sLN;@X4LsNpDc!I=hnBKPvgDI>_ssbEL12AkBM- zbn;r#iescxqe*9eNcyhgVZG|>yKiRBkp$A*t)v@N$y+sEk5KZqMA@06OPTYIlKk#h z^ZF(w8&}@IYx|F+19y>LRYUs9XQVJ5pq;NG{Y$la&S75vc?aoxsy=H}X&w7ACtmS6 zj_tMdB0nvS*$bA4BGNZrhq%~q6`n>ZX?BL+ZnK{}ZR=?b8u1Nj^dIS<@tHZGN$uHZ zy$56DQ*Uk+`Hx^C@``A89Qiv$F4_5!@NWS8OYHpxa8wN1Z+z$SXF4OJXC&n(YW$s` zu8b3)v03v#;~pTN<JY_bnlLH~G;yy7H0j>wK(B9|1={PSWYFaK%|KH=ae$^?eE`%u zu^VXmmNB3iTgidU!COH4x1>DeoS_~KxQXT5wt~F9`}?*=ovvNl3hC?e(9^0#FNt9f zBjaV^<`}<CEMh0TA_h~-UKMw<0oz6EmjJJcyZDJ6BBLCzQ@9oYUKf?@>s?~{9>8v~ zlKs3##JK=(h!(uJSG4X5cvI{@3fM1BCxL_CinS;u>{06{)AWjjwcpJ~cKNi{s94yg zZzFwaR1eU03#Nc}ZZQDVB_@ORp3P?EENl*1`s7V0s&-o^<4t+(wa9JkECp>crUPix zUx$G<`<u0D-WE^WTP$T;T85Jum#&)&+A8Z_(AIr_18p;CFz99Hkgu5Zsci8DKJkT| zRo|e}_7+RntF60j1@%^S0bL<pI|bMxZ}=3jRkjZYTVIgtA4KX!IpKc5OY)gzfS2Wo z6@YCriq+jKJNE><DPQ2o{+9goBvNzjzpn+Xgx>%-WWSj#e<bWS3i14~&Lw~aVXOWE zJQ_BWr92jP&v?MXu<Zu{kB5Ct&OaFzODS3uHk@2s9QOCkfF)sx%K=NnI`#uB3rijg zSRQ7p0z4J=8AWGB*eA4|E5q`h0jvsplk9ssEaCycGhvTYCRT@C+a9ncY+N<q*|1-D z@42w-p8;#bhSPys7uK;Dus+N~zHA5^emP)c*q;)xDQxNwfak;3aiH54)@Kr6SJ*15 z`oXZ{EbNo8r@;c%3zxqUi;UiWG+U)3`f{L%Y;hd4+vcZ0dwfqBnl28c0cMCi_U=qk zxDW84XtW9Nkg#n8%o3Zw1k4s)+1+!*U;ELoOT@V~09`cgQ{^Y@+Xv(TmN`wn84Z{& zi>R(MWaG|&nQ{+Hc~H)w=sYCjJ^{><FR@={%Tma>eU9u$U7ss|O9ebE%M$_f<g<L_ z5t)R}3R@;Mn8mO|(u#V9J!mbav6^eGc@rsJKkQFhzcSRsF87eBO|MM>ZRU6#w0Yc0 z&=w<S7;MQqK!F(4gq$tBv^nUoH$DR`_b&yl%%ok}C-NwX`^EQhfP*5R?KmvT-UWOr z{-EoBQhZH0`ATeJ&A%3PLjd0hZ!X|l;m<?ueiB!MePKU~c2vec#0CyP=fpvLIqZn_ zqZ^G1$wsY^-}LIUc&N=Pzma>xsM$#OtG*P}b1nfidBg3XsejV-@h&-x>$JTOf~LRw zEojD|PeC(xy$5>ZUMFb(RqVX1iOWE<yIcY~U^RQ(f3ppA#8A44BX?0c%I~AFR^JHQ zZJ#2R_6N)m@pAxk#Mk`X0&!U+QVYd5l+Gu`ST|s~h;I#8DfT=Kct#ZF12&6Xgc$5w z#B!J$`&Mxb&4GnncquYp6Stp0YKQ1b$$3*8q~z?i&BinKw`^;_0DNa#JsI$TJ&rti z)V`J7u+m=5maMira{z1X@pizo_A~t6bM`K5!Fsy~9Jg<<Z(z$e+HZp6XMfp#$7!Ut z*(3G=cG@H60(RTy(9Z6&=X3<@w?72-D0R7%Hs9Xrug~>#LvjC~ieGpEhR(32>ja8w zF$VpmioX7uKauXWY8Pmqfv<ylYstC?#U4`#!arYvjHZEcXW-Hpqz8+xpf`O;u4{jR zU8=Z7CG5Jk+Xo`|idAg>mHAfCtL)!_w!4$Y`D%@l+wIgu(C&h^uSfFtpgq&3fkq9b zl)LVMPT1X@-vN!D(g-wWIzC}fy=yn9_s&V6X*0e8O;5fKG~>!HpqbY}9ql(RB!~Nd z#JgFiKL^b#S_e8Htsd0(ezsB9e!Z_iI%jk*(A)_Q-kZ+a=a1csYyU{jnG1&W!}Y+; zv=W2nwFE6(dL`)KD=64QI<^5F`gu9%O^2#LZ}!guy`|s)sJ1v0bXfQ*(4scXA3m5m zT|CYQTJq&+(9+>0pk>E~gN~R$Q#$f%@~C`KQ_x!{Q2TGY>P^s!85N+TrnCDhR~3L( zo#5B2k8#+zJr1&BuNn9tXzg3~fYuGCOH;p&zQG+mX;;P`q8yI9nzfoN+EaP%6JcRU zO%eB;1w0_;lTXvc%;y2qg@+0|LzJ;|W{M*}0cMGKHfOeI!*b_{R@BS6;=m}teDNT4 z^)WF6U1eV?wvjE%#7rvIa<S_Hz*Ax<Ez=4yH5{-~l#*ww#FAG5PYWOW@ELK64P7l> zVjr&&r+WaN6+`X@JSW<*YuAcrqmf!C&hmTf#jXs%2J!LxfQ_Q+4!|aH37h=9I6DTg zSqvw`wunDDzuhXDQ@CCbFR{;G6upK5UJ{ZVd|9kG2iPWdvKL+vCsP2giqqu8c2UVe z^))f<R=^H%b1T43akvBEbuovn-6dX#0_+xI9$=3cz83I?Si}zBD{gTD-V`6P)^CYg z4mod&Cn;d>h(~4v_K801wEe=m0`R`r$@dP338w%bh<P=D4@Cj{?<0}PrW_PsNu&;m z2k!)YEMA~?{7W3!12`;>+yMAQSfc@-inEsjjtC2@^qJ_j6!5vY&jvUu_EUzA3Hu*_ z<Knx+fG@<TO@I?(Y7@Xoao=lzFGZ_&0AGpUa{yn9-R#?M#N@GnZ^br7489ZR{79V= zc8Sz!aoHiHz84*r1I~yitbiZH8?5e+qS+9@S<#8#`$_ap1pF*Y+5&zNqvrsA6}QqP z{U&T*0e%<vXaI~>?C?Luw{HOcExJAp_)9n%0sa=>(m0(HE`IhNxsa8gD31>V+$+0I z08ElM9R*C5f7Sx-lOOZzQ{)4z+5K|%uYjrY6$<nN^78Kh)8yZ81E$OLZh#r`MSgas z>`5lil26by%$D940dwT-ae%q<+GT);WfF^iRBoo&JSO+91}u~xMF1X`rIgPn<Pjg> zN%?tGz#{qUzW|Hnw^X1daw@IDQW<>}V3|DA5wKj=?gu<2H5R=>UUd&(rIclWRq|?@ z!lz~U4!|=qb`4;)T*H1?BPS0+>Nz=yim+b3N#WZd+f4>+l$X$mZ<6<Z19)D3Mw75v zzD*8pkzdUOY?Wu&+85*l<jae4=PJO<a!n~<x4d;1V2}L$H;X<9v`qLN8JE@#0KI%X zYjNd^+d;2#Fl5zkI(zo&1-(E!tZs~)j$^4_ow8Y4=bui4cH2!u)N=wI>Zlc*l)Gl1 zM2>r75@__0NuY_5)PSVz_u=~bxol6bKl+09p1ct>WfPxIoe~S0@mg!p%+^%*?C1J} z=InSG)R%rGXnxE@&_R=EWDDP?EZx-gOVFEteirnWhlhb`N3I1O){IJ1^j0D0@Zyg^ zi?QMcQ@(_@v~(SXrF?WB&|6#Z-O7zkK&y7LMYU0UvTkh^=$LmYWMluP9NpEHq2Id~ zkmvV`$6bI);-C|7zu27&m?~PbJu}2O_SH=BZ9BkhF_1zrM>w+pb4A8(z{BEj9blgL ztPJpoxSmhW7n_>{7Km=20Ui~js2-0Au9v}CdQ}1zi5M!xVsVO9St6RGA+=QeLQ!5O zhLX$6MQ7UWr$jF6vO;7%1z0JDQM6WzzEtBiqI4x-oyfZauwGnN3wT~cjst8K15W~8 z6x|~MFNx!w0I!OQhXLC~@3w%~#i3UKyM%+1vR9021$a~ZN*3%BE=uNpA=xhnMEvc5 z55$#~fJ35oB;aGQuLSU^_>hyfBVrH7iDP0NMeVq_@*%*N;>W82Uy0Ay>!(HIo`4@j z6}j}ISn@jHtax_{;CJCU4){ad)erEec#PsUQNG?3Fj)?wFx@8yv#X}aZ4`-Va>}cK z>GJ&pfEn`N)WbP)5gRsFPB;X3SWfK>m@mtU0Sn|WZ04i#Lk=a2<e*`IrSkos0n6lp zM*z#^NlO1y(sK<`E93@t_)7Uaz13CnVOHX4Ig4WUjO?)&uv(6b0<4!|tnLPxL>6q6 z53yG^$tUXp&&zDe;%518is2UNqw(1)u?K>>eO)==MHy!UY?m*;57;TEvwg42EdsDh zj%Jx}Nlyh*Z_DPF0p5|L?*<%@Pg0yek~e+`I4Ez70UVN%6qJwU=YIk|lOt0BpGyx7 z;ZeB}yKn5r<Y3n9D|vbo;9L1O>++p^mZ?)R$_h9wo4yP9UOrFt{#l+F3iw5~z8~<b zT=o;-H@T1|<ac?RR_=c5)-!-<*2x_K)2+qp0W+-oegw?4{>2K;wQgp2JZxQ)4VY&= zLRosm8pbCdw?4-fEwcW}epqZR=X*=6jnV-tt#3RGSY@?QEuOYcr_QgnmT*e2!TK$& z%0{d0PQWIs<cD6g_Bsf7$@<+Az{}R1to#n^13v?HS@WqKyRCDM0QOjK?GAXux|(g+ zYh6uVzhj+3LD^@$<sQI(>tCk;?^^e51H5Nl*aL9TYNH7}WbGRU_}H37E&i9aicCIi zE&Kv-#QO78z-QJ@?4!@ESG@o@YCS~tJ!YLrTkw^&IXmZDYtzAi@2oFS|4vy;c<-!r z_H%%rtezsk&(^f2fIqEU-U9q>-On=5S)X<T?y>!J6<~^O7AtYT?J)|`RNHT??t`}Y z7J%8dQnGcvEfJln<_vv)pM#8)v+UjUR9d8*&Qzz|?~Z}q(wIe6-@gUdcU|K(-s!br zBGTzGd?%yjC7>gAKMy)l+}0bgKs?nA@Qm<(YrGJrk-4c^9YDQ>bY9b@?89~X*k+&^ zZ>|N+?6m>(#w=E$f4U1aub4vSTXPn)U=zoNL3dCg23J!shgPxsZd&RAz2(b3pu=us zHHUl2uHycOK}+M_0UeRM60|&e8tAQ$+yz?kBPF0}75Q6Z<*dE-5`LvFFBY_Z@ui@5 zMzIn1il-6*lSJ4vfXO0*yqO{zjR)K>9@_|*DV}4Q4~aN(VzyW_9PqFhNAAoMjrsu| z5lh+w9u*750-g}>@!n!Fn3>B(6MkWZ@I3%nC63GmtQNCA0<0BZu>tFamoID<;pF>P z(RUr-MRDC}z&7#1D}e3dlU9J8qSg=CEvB=uH$)${<Snu08o)jg`77W(k^OJLL9w0s z`7cqzjyNpp=?i=!djE;kr=sf_z!C8%rSdb;ECO&`44}H55UKY7PKqXE{FkEFe!y4a zEMNFqymTwz8xcPS@V)r9IpB<V={CR*;#b;=v*L#L0Y8fk<ixMyUlfMlg)0uJKSlSu z0e^`$9HGvM3N~z_9H%-!&LUs#lY5r{9+1~k-Db(Aw*%(L52pj>%0W?p`O?Gp9+f8; zRaq#{&@X;MzQdxQl>LtZ7RfpM>=GG%Gg8Z>{TIM;`Q%=}D!FwAV2$iE0r0GBk_&iF z&fNi6D|>TVx=vPRA+=s=l*x_qy)J-F^5<&6W_gZG-XiCcpIhah4<hxVoKMAkMgFb& zNZv&*y&>yr0B_0W*?{-uiTQv7Qho|JC~pe~9F`L{0X~y=xd6xIT{i%}lsj1KZ{-O} z*7x#0HuJ3fg);b)977rWS^j(g@QaL~5d9(hJq!3#UO|iVZ@Ge^@s~XP4B&71{c6Cy z)-Txh`>jLf0H#~_?FKw({YV4Mvi?>Gm}{NPMn7WxArr8`YFz_(+`5_OWRcZ(0<gq- zJ;(p$)^hgkO6$XrUERh+(5$8IQ|g~P2-j)vUkRFil-C)5w*<}H#he?*HUjNGmtBzc zZ;rOvohkD<N2&6;FS90jZMJ|8c#n>$uQ&tO`HN|1{m*d79u!77DO^K)H245zd&tDE zK!;8^2YS;7l$)DVuLZs3F$$J;X#wc4e(b!WWi%<nV;F}h-prhmuD^qp-ZuiYY}6Uh z@<pYfw;p>P^tOo{c`8=Wn2aj?3$#*jSgn%Oo9Z3QKyTm3yES)4gVugu1X|Z_D`@@1 zdeA#gp8_4d<r~m3FWd=wr=uKn{5PFJ@7gmQ^zJV{0G;qXzj%+haSC9fICB%=Ua@pL zV3PQi!gil{;18sxh^)&1Q^lbnfCt1iG*#2Yf%gE@MfC%K*`oOdz#QR81I!h*UjQB! zAKwd@CtjTZm@n#&0~QEB4Z@>h{${{qB8DBaP~1XocwEe&ustEN$lpbbNLgUiu4NxB z5#9L6QZa*tEfZJpk*CC?d}M`iuvsg`gY5uMi%tUoYs4@L>9b;DE#NsZ9AgdK+22+H z){9A0iVfnuaKJ|K3?=tdZ0!IX5leOgJ`*h{KA(#+w*9C$NVPjAZjT4R1Em4_LL6HT zI3c={Sto@%9jPxx9+mJbamhiz*COU5;2YtfQhY0JxE%1kn9c#>j6mIK#)f_e_zAn) z0Dp)t2!D!a-Ua+6R<{BCEk0v+PLvr}1MZbe*}nT^Ha~m6boN1Ns_fGXFil=E3NS+! z(IU^3DK`M-$j&PObEV~Tz&t5vU>}j6^#?4F1qpyh<$j9RV{$9yX`$TvCg2HqmlN=$ zJjxa=k|S;eES8D1AWLOG4`7+heH*Y!=8XY7Er-7kSS_!o1$kChwLogEe1(s!lUGs^ zH_E760h{EwnSkeI8YOhI9I_3tRVI<UFUTGb174J?rU71-QQHCA<Pd7uEAmCQVY^&K zA$m<NrFqyP)1#5vDbG?qcgsW6tv#|MmHG|&V0XY?*@712O}Tz5;4PU)1$ak}Yzo*X zuYLxwUw%xsz9&bL1@FuFTL1^-(X)V$WEFMvknBj6`B;vb1^7(vzXtHReDZI=G5Pp> zz;W4zoIfcCQzE~Vo7w2EB)4_jzn0B*0lt^nEdgibZJB@{<+mE(th|C+{j-e80Q@Sq zyaxDPo_ql?!**R`z)aiEPXQjZbt9J^vi<8Fz%1J_es8wz%l3ddwmNctp6y8*nMZ7q z?Be-0KP6;=E#ZE^qqeJK0FT+OUI|!e>r3r;+}4az@PzFfe*H<?6!zvK+a)%@Qd?0D zV41Dey@2JmA31zIWxIuqUSaF<JYc2mlpV0jc03XAwCzh){ux^orF^yRb4v0W+o9_K z&)VKqqn~a0XGpEJm69*(Y@MnB>usr@05;f~uyZ!rzU~RwWJ}lzc;0q3?`^hqT?^P^ z^OXa(+Kw{yf~^G&-^;c(JpkKmS>pk(*uG$oy=rSsVc2d<V41Jk-v1J?!#0n4yVDkx z1bE$+G#IeU_Ui3`-L~s*0_?Hfz=pkH>)H{p*Ea7o;7wZ_w&*R}0xI)9+ojZp{kB;T z0p7KJ0?ATiQ}3wnk<s6I4m4{kyE^xT03CG63DBEno&ml26A!4i<Phkv5p*3&#+Tu` zJc>e8_XL|TdJd~TZUWhGcbm?jQ$*oVz=L8Wn=w}$ngMuJoNNJDD*pTwuu=?MWz<6+ zn}`f=>}#NDud-E{w>|)RqoW&W|MAy>X0@St%I^0jXwI>lL34dwLG!M86|`s{Eq3u} zDp`r#jqB3IT|mnU=Yfv6_892MmnfU%cQRyhtB?G-t!W-|DwbakI;!bW(A)2$E{&f~ zS7*W>4qVR?8Y?tgl;395_S$>+uCtx6Sd0beD2?rRZP^9tUcV1CX3Z4PxM{hd6|Dz> zR;93GYVK_VT3<s|9n%bBt?GyTSN=lUA3-H8xR>>)%sB!&Nlc@@&lgTEA3Y;J<N&)> zY@|Bv7SFM1ABZohW5+~0r%}B@4jP<7E1N&K?Tes8t{Db8blbC_H}!oG^yaY>L2sGN z3Ty9B1BbPugcU9O19W)G9MIz9bU{kmzJ}}4YF4eRiwCs&++on$Q}%$?%t!#OonH)E z_Y+xHe+x^vqdo20=!g$N$82PS#(sM@=oE1!y@vZm_f|+v6<g{64~Pl0Rnx?uw2jln z6a3-~k#HYirf^ONJSeVt4)BopVk2Od_<({uTTHkbFh?|{l*|>6vqle#hw=gQ#JX_6 zBjU16fcc`D3b#Pq!^S@<CaeHFCY~M%SSViE4|rVcqg*^8T4W&gr0DxKV4c{;j#@AF zP&YP+4NBd`Vh2*2gg+ASyy!_|vst{r7H<)~q5xaPNLKy@(RTshMNz~TUJ`3N0A3ag zX+^h*>j-a&O_u`R7GK{9ct;#M2>4j+ehTm}aT6PMLNq6rPKpY;X5Wk7Vv#x{KIa#H z5VKg_KgH`-z`w<chXGUM$Z3H4<vu%LsvPziV1bO-26$99B0MG!&{i#!>saRFvd4O) zo{*!S2Rtbk6af~=!FvIV<z9B^YFRh{utu)F5%8?sL*xCN%p=d%$}kG`I(dlQv0mOj z0kA<1$OdebUw;eOBv+pRJTI;6qs_98Jli72v;}OH5%qu<<Uw-c4cQ|C@SgmE6?|Vt zu{RIMc)IT&$oQX-`c~SS0sfW~*+(<2{&c{T*6}%p0=y_5PeIO0qM{bCO%$*`Z;Ex) z#ka&Yp90<%Yi9!95pfiOed7Azfc+x567a5=Lp6I()c%Upr^3s^j)<!%I-iNFSjo>t zeHh?7(UOmx64gHdPK(}b>KW0GJpDl&xdW*m#fK{aXT>=(^C$5aLo2_CiEknGs~Gem z080#|fJySqzX6lwD-2cNCnwYDOp(uD0k~iO^dsOidG$+x(=y?6z~Ax#_S%Ei{ObXW ztQ&R!HdqgzGuY7RmJP^g+JZgRtk*|I?u}Qzg53TeM1y7>91EJ0$d1bG&d=sGrj`!4 zikk0h@iMOS?`DJj$EYI(>Fno$ZR0?Py6LRc#dCr=O`QA+iO0mJ-vQQ%&aCWiai#!p zShO5%e7f{`+Ra-(<fwAnI*w~~uMGpeLt6$q<}k%{+)Y%?@zuP0_iKru6a14wCyGq6 zbCQUpU7alMy$5ig=*|z`FZT2VJRo-P-DzU&0l*A#bRFP9akv*?mU!<rz-)1r6Q>2@ zai*RWLpuPLh`ZRs7?o}ZEEB)92RtK|QxjK<AskUQi@|*Fb+Lge|Gs#at^QoJb|H0I z<lF`LQ><nMACMEe0H(`Q8nK0P=SINevKv42gly9S@TA<m6R=2DF}$=`UONw|CGsaK z$Wl4z62NA;@K(Tf`6ZuxP0slMutWaE_U)9HjRCwa=k*2bk~=6hyXA~)0DI(c_Rt%0 z2D@~x{DKnjrp#n(-;yOA0dLC(+<<rFv0Z?Dat6g=zuegga7eyKg*+<#91)JoBl`d+ zq@9dBCBJ6FPRlW5&so`)R^cc4>-&J8<*FLMIT_9`OtkjollNM8#{(u=5B>(2Y(3iu zaG%w|UY=r|`YvFqwTi5J#2U`&!K2pisTEIHxAXu!X`TBBV3GBjzX7YPimmIc^PfU$ zhqY}xz)tH@e(x>o_KAQGtZS|X9JUtIK7OL#J7x7!tp9Co-W!?IZ6D1BEVMmDy?fTS zn1cM8t#T{iLtEYpfNyQHG1RI-`JiyuA?F*hsTlB=SYQLplGWg;y5HilyOGiIoo_%d z9li&&_4>C#+f+kH)D!MUlaapuLw0cAuh_B4k5iA*>d4<4|DuE~5q<gH72>-004v3B ztpTgVVN?Rs!|%TaJR{oh8_$Zl(*Wy)a}8jVnAab$MKpE-UKH<r1lTQpO9H$l;;Fy~ zMFd%KSnTKrI3ixJ0DLB{`2lcT6w}t76c+OQYtf7*?>jN$GNis2@zngYVn|oOQ}Sze z_0Q5x75LS9CE-tNr0O}_->l$#+Zi@=fi0Ik@ThJ4(}2fpAD;y*w7ne$SY&I`1hB;R z8r5;Bt&~=HnXNg+XSwaYO@OCtGw%Sbux;1|SZVuy9AK3#Y&qa*TR)1yGq&WlfYmm~ z1i%_w4F|txZIzVv=WJOTV6E+m8vyHUx10m4w=JZqZm`Y2AE}MDXMO=}vQ1$dp11LM z9vt;^e0_(l^h3Z-+m7b|du)yQ`Wv<+FJQ0j6RO;sHcUwMp6$DrLY=#M325FNYT$qs zc2M6JEkX0|q?q}i_#CvrPS<VV?+@X6P)8qV;ocO`!6#>d4!ODjbl8Vcphbu4L5D|G zftJmS2fb}^1Zc&9bkI?+^7+bc?2>!M&zA$R`1XcHug{$iv){)b=F-4j3tHg%?!^@R z34(09SClsbOcF160F%WIHtIgnwg_;)7|O?|iX+s)Y2t}OqsVsG@l*ZkXj(m$?8D@J zTR>CpZw#6mkqGLo?gM(`o9ws#JU?sCN`DhH=k-j`+$)=c=Dl48I^ZNlKK~V}iGLCe zbitTTpac6*RtocO0v+6k9XKTJO3<Nyu<1AVpo-k$_y%;?b~3o=KzGpM^|hcS9}WU7 zyXAJ!5!>%E>V0`@>P6ez84tT+KZoKgkMf<X4zTary|Wke+J`A(9hY7Q+UXrPXy>;! zgLauY7&Kz!JD`zMS+lOI*m2$7ybHAZx!XW{L?(bnPvuu)Hlp52)!QgOU8eYSx#Ck> z#iuJ2pRQDVx~3;3^IGq8(CgNdukBxX6}01QKWL|^X(%fLjg*#Vq~gzJO)dD@7J+R1 ziJm>9YHNxuQB~D-QHA9d<&|Ti+_60qqB8TnT55ijH?@D%h|2n?qMA`rxEVDZe|V*$ ze0bD|;$mj^7^B|mQCc*-JPL32jNt=;|DXRvd1Y}$eM#y6_YX$Zj;;Ow|ItxJ#Uslr z|Cd{9vQXzS+ErINN*i8V9aUYMpcPlu)Rm4YO43|W=5zn6eQOljqpW;PX^F*BUt3zE zl~-2R*Yzx>Jk^b@F4am(%X*GvD&($8*VdJkSK*elShS+b+H(D}vUD`$Nxv?xsw^uX zforS9QeIkGT2_r~43TA}MRoNxrM3DUl%szG5{>Jk8oq(+n$ptBI{guiH8CC!T%#aX zuBg7EE;O&As`xhjt&o?@OT1%N8+EFv8ljaG)fM4!v=27|H4j|lg`x@+$!E~e+Pa$Z zO4cv*8YSgrrs{>%7uB%NC~i!3QBBdP(z?<bRvgALBtxq<^Z0xqQC<;f2%kr?s1{wq z0-3I@1KS$DsEr(L+{DAGH`Iq}OY2Lj@bW0*W=-jcfGnAn2|S}g_k)F0qk(noaTHWc zw&60+*yQ^1ijvYAWU+y@#q}e~%~$nAgZh+?DK4$9E3c~5ORKFYEu{dU;QG4q3cZj~ zMRg-_<v?*Gs>`batk4sI;vh+NHB}WAIy3R{+v|%;s;g?tjpC65`-pm4EY`+i@yJP& zCQXs;TdDuI{V6KE!=y#lW@U#aj|d;KC@V)184k-?=<}v)DS7TV&F@e4xt;B+-ErNW zuI|oG_;VIVli<qT-V%H=Gbi7#rFlL60-slNo&SpYo~yk@%O9L?KA5j%I4zo%<w;2? z$kx1h`I%X{Ihy8ljdADoh;e82w+zn9&DZ*;I$b?oF=Zj2OYx*+c(we@Azm#r)%cp* ztf2ZD2)<TSIijLet1hoA9;rbbwL6L`>Pu@W)ulBx&Irxt_2&3{^wso?NK~dkuS{BU zrXMwN$0N&=my)l=L^Em8JURK9TE0Kk<4e~vG*$gHpC`qCk?Q;KZdz8Z$FB{_^`&a~ z^ZHPTW?W@u`u$m6&6|^&=|QV4>`K@SR=BLZ0xAOQQ<&%RX@!1&N?yJer)B2&ea=E$ zBEzjkGmYjOx~M;!m!F`e=Vj(<E-l%U@Aagn`oK=F%jNRm&ytp>4e|PNoza$2WyRIC zH4%}{h&$_Hr$$tkmN+5g&Kj_&7wQN-QFXnes-g&jS*mFf&i12fY8z1q`07oS?VZ;< z+xMwy?~LF}k<Q3o#@lyATGBjO`Cg~XQV6j~^$yHTK}Y3-Z@GDS-c)CNmfn|XdHE?m z&6k~<>eaG6`Td;{G0xt-ouS$2he%67J~-#g)%+PgG>JXgP{NAcF@{jaKq$#G^1<iH z*4$dY<|)h!WkwqQffuM7IGLAS;4=8=j7hNQ0-<Ha$9lBng0zV0x*Bju0i*<Gyr-sH zV67rPwn)PdD@6vsHy}SR6MWCeOwS16dn!I>8SEJZ$w@EBLe&O(vvN~1{eum;hFF6~ z_*fd+=+Dj7^0PfzSx$E}c!Ub3<)wQP%^D`g2J+lyUVJpf%#hm5fYcTiczk|JO5vbv zowcqpY_!W2lcw`NJ<sQMIcwZ5iw3Pr*NJ~{p4VAXRXIYDKqo<SeBOaZ7rDly8J%Qg zt1i+d)tl|1sJbB4UcZ)~h2C|$vWHjKYN?q6-A<fT(zN_R=swq&Xw=2zH<UT0Kl&>t zH8xS_xoT%>wkOazvGL$jaeaDuv6fn1TQ{htysp$&IwB&o5+gumacN#%O?RYo%gSm? z>$<0607J)_Zv>u>2z@@XN8c1R829MQB9n`1OFbne7=mjfyE`KSg)tFP9}^v^3XP<Z zNXznr8HH$@<}J*Fp2Q>~x3&yMrK%>Pnj!-Vi7Bfn8d2-)>_n@*K3}Bsx;{=93rO{* zxT6!b{DS11Tp#*d%g$7Wuczvw|3KW{9`Wwjm{bS{)f~J|_4qwnZdzKt*AK3`Vxi<& zo;=O%bSEhmo032!%ci#Z^ZA_qFFMf0xZ}ylb4Iw?x6$#2SQn};bOlrx9jC<A<Ihgf z(4t(QmXcclGX!op-ENngLQ9inh~EWPh@Z7&<)-V^rUCWkQra!%8@YK<17#3=-t1hz z7jl`K#|p>jB~!7{ZYWGXKAn@6nGR{wb-aP%q3u+>ysX^(d?#c_AJgKTaYhAon;Na9 zKpFdM8AF_*rZ$=u7PtCqX+G}&+zo!)la?7UDj^?COLV!C_`%?ih}!wlI1O!phM)<t z2Gav=%`8NB6s8q`0f8Q&hJ%5y+gi3aJJguOpm_dk@Oo-?pf}NCybB|X0XD_&%W7cr zP(A*$Kwi@daw00>gmtg3sj91rbn@D%t}S&{6;-24Ya%qQI1(~jI;O4^V?$LXBs}6y zWYG1gDr3rcVvMtoe%;GiURz&XUCKdK8x!fg!5M+kgoTW8_HcIbba8fbb}8zD5hIY_ z3&R9WpFi7&>T3SXZ1jAZCo>BJggZJKeTK#q<R`mB8^Vz+Mm2<ka0;pt6rF6CeUFcp zH8+(Oh7HEQ#E?G8fuy9Qc=MI)uy-1cBhF$t5sE}}9D#CWdmwIVm~|#VbON4HN|qOc zc4p2%=q{>}m6-!~WYGDgC19v@$98w3G}!2@EZtKutTcMdP~l`xPJb6Qi^an($2)7{ z4c8}=u8#}H#qqOOS{+I;EC=m{Zh9hU5Tea7a?t-^jMQtB>d_1*Ck9p^Kcyf&6DpmX z8DdKm`!GNhW@c%gd{{8QmJ3(S=VK3{F8Oe2z-QgeaG=ljV4Q#<0!`1%_oF|Rjc~@P z(aiV;N6C~t47+N?4|Egy5k;gy5DKZ>gPrbJ7xDrehc@K;2Ai&<7JWXimDh*vi&wlx zpT);&9L^vjfdS1K>grfB3evqAIxvkgI~-noU3sN8vVKG<-Ndp8W$9CsVVfIRdQ+a@ zq+lE?rp|@<8v$FC7o&7HH>H6ND+Pu}5PS&&exc70O*Mzl;53Y$X&l{Jh9_TH$85t8 zhd5Qyv00Y#+S=-(;!<5bNvW|~MOD>p_0=k~vzE{CXHZH8Ds8Z*0aMVc9xdocpzX?q zb;k6Jbwwve$HXR-c8f_&qdY@`j0Yh>nuZ_C)zvZ3WvRK@9>}Swaj;3}cbe(8ablp{ z`P?+!5z(Bwt22PoVklr7!~r^)?#*^<gFOA=Q5uQ~4LAEBJu5falcn1dvoAs%;j~1! ze#%e=E6MRQ%~OCOJ>QS{OaA$F#N0>CcTh);RUE2epORqBE&9Yl_t{4kRn`|(Xz)I& ztN4qZ`gnrwMU^jb3RMROWgBB&nwBycMnxY^y}t7+kwi-ZZlMx-!TR{6yuiSmz=e@X z=ZWzU6cS(0!Q_hbGfxgIA6)+cvofPo^f&YpkPN<GfH`<xt>!B&DxsSd;v5CttVk!~ zX<BAwOmsx(1Cg-xA?{O%yg@$D&v|}dYGzuR(ksmw?T$@|O^k_;O;85Fm@Fi#VL2xk z76JZ6sxv0b7`im%W%zOj{lgIEH1Fd(m8GR6ng(UoD&XEB1G)~Y<kU38`-(&IF_NTu z(=eSw^$^UcEH55a?c_x<TtZx{iM5lnYh{A-&okr2MbNqOy0Mn@oC0TxQ$+~zHS`2p zYARV!Bq-8KCh&mH_z)q-d#M9V!yF%@zMN-F>D9*(imKBpN{ediFe9yFtOwDz5{`nV z3UJzEihf33bifRSszF*>3XQwscqZ(AK9tw*rTsO=UspnWNNfvVHb)4<ddD@i-qD5` zgk9%^oNhjSWLm3C_-HvCl+{pejCeGu9QE?4<^fgA$<4dKtg9gug3oA!@p7hbfX-EK zDhzls<N-ph_^n}7&iA|H4bh5;PKd{xPU!@{*g)8dE5=12tkz%xTs*R<=0DGX@fK&m zo!sY7elZp1Ojwl|IuQ=GE-!Zw21I&h4VAl?(G}Cer~w`$SLpa2lZfG6*Lw67L?=Y+ zLv^;UN{_@v)J8fx)HZMv{W<V5O_vD1V1SpYnZE4ch#&1Tx&ux~tg|N8LKmBEQkK`J zf;Hwq6!g-er*MHxC!L-IViI|oX&{&cdXgF8;5@+@7n2AbrWe#8!lH(b{G8-8y>=)7 z&W5)z#hd5PL@)?bOf|vrB<I5WfW}Z@@CjN5z4%mTbP{GA#)Ko;QvjjJ!E`g9-!_}9 zWZifqpH6q~K*mLsgX5x`0j|QL1`Vh)HU^bt*i<VjzP-M@rZj>HNQ;&N5z_|dQq0jU zMxpRMQ!?~vOMn?H9lokX^9M|xQ+)|@hz3rrnmni~Djmj*-RDiw!$mQn&Tm4zSIr?T zS{h7NW-g6sK4KMU3H|$^3DBL25QV4PjA74Ecy^CrXV2@RIB*iJ%gsyn_>#eHT1>=S ze3`lQt1-iaSwJ5e7LY=UXkAZNL59zg@AdYF9l=D$g3%cxGt^r50jd9?28wPX9C0%& zM01gytii9O+By~2ix6-cHC!vMuhB*ojfpVCpL0L2Kf~)|aG_z0!IjN%7C{D=GsGJR zovej$BfxJB-_3%w@VjmX#|&fTWpzWu1@XPifdOIS$gitoiYKR`B}axCvA9r>(=rDr z31%cicenHC3cC^;*ittoW}pXC3Uma9CCn^R+0mxsPu8Yl){CG+sO|I=6zZDtUtJma z$N?`xcMveY&&B+O;}K%F#=Ixk4hp4ddoP&KtFR&>(RUyuua(tQjY5E|xU?Ket#}jy zn7VO?&aw5nv_V`Er3e~EbE2G+jk&cxRd!LHDX--SkR#lWv9}^(O!u+Wzw@T0!C7ep z=AE2xVoEv&COG5<-qW<PyfGFxuESKdvZ@9l;L;KlH>Nx8MLIioR#R7J?>>As60=j& z=<2SP>*ApT*M*^iz<6dhEZc0A-Y86+RNNU}c)rh{o1M(SsK@X957EZa#kDncRilR2 zB2rycR~iYvjHoH99;tkK*84(7KSIkJuN92fvc_vUXo_-YMpc(L@N4|pc}n&<*-pnw z!$lmv|LpBu;OgmKNT>zFoFy0#g#}C0V;ImIhBo6Vb#xgpP={*V1yPZ@k)?G-T1i!% zp?U$yHG<2jkXvIOcD{WHs2hD3DmwzrA+{eAm&{Z(P-W(D9`9t>qoxv4P+o}zVMM;2 zn#b?=WhNK+y@>1~HeNBhXl!lZHn>|{H46TJNv%a=Ej-y?%zY7D#+V70GElMn)PQ3a zVvW2ms61s|)8Ig+Aco;j$;k2|OiUd|t~p}r<~E{-tI(Z?)sd|J!K>gvg!h!~O&Ms6 zyBNf^^pq4dAvYVIo|^b6=Nh3cuX3CU*ad02<8-kp;f0#&$0CoesCv~=c}BQX@M%n4 z+_6c@#W4GWRygJ&ad<qGthbx9?BMcGL_|qd{qTy?$mpKY@JM3gU9m~gajqD5jJvdl zJ3h<Q%M1KyWCX1iwGeJhoU_J=+aM9`tTCrQ5Yhb1^c?suxdm9D>7SXEg}^j8kE(_W zEarJiU<1=rGK;fQtPA<FRUd`;-mw3n-Wig?8I{S7Q2#tc43rG$>_ElL?lSsA%^olw zDDOKrI~$R5qkG+MEC2)~?4L%*2E$`9mXKkd8`^2Jc7+~<vl`4-Ia(&T>ERormInb- zZ~=}%s45{m8LUTW8#D5B6YyU{A#ez^lr+Y3LtTTQ^kIn0!~)7-nhSkR5<{83CTTAD zC78h<eI`IhTKWC%M2JyBY^*CGCc%{y7w3+5$H5Z~R#;8JsQs`Zfyq<QZl$HD$c+kn zpy`-lq(mS@S_~=3^Lf%$+)E#;;k){CU;yYr1O@`-!s-JvSB4OOY&ZpQ7RLvt0Hzs) zOUd=J;NqBRvpfhq6cyiAT9;X(OQD7ZN_>yrLP3slP1WpJ5A8<4SH@x`!aiof7>q9n z8`E_DCzS{h)C7h;D5z@9H-B(W3Sz&*;iJ)EYH0Az7srr@IzlLMsu;+X;b|ezG$<7s z6<Ex`s){Ldx~G)XK;q!g;=VE6FhnMg%c)q+GUpte8U(swpf^Ri)0$eIYp|?c>^7IR z%`ne}%XKOiTLzXh!mckHz!G3ESL;?R)ES}rXgGMSe>5IT54i&o-9ghB%nMY-h#dQ~ zlC|uCp7W(4k<tK>z@*o374#J{Pd*&cY}j6NX)?ecA3EN2(;F}eTB&IR0wD#AvZkhU zi6J2Bc@0$FtxJ2FCEMfAATRX^8DmEX_~g`8jjWB(m)My0R+f|(RpyT_s&>cg+4!X4 zt_H0-R<2^yx)nx67!nOJugts*)gKs*RbY-n6=V^7V1F(~Lk$yrOq?&+RDj5UvlyI; zZI8V(=E7U(Dja(%H_uoVL&;{tv!YYDeSl`}f`ud2Lj~tF3~=e`42fV0l%A8#QB@0_ zTPTa6hMNn6IC*Lyfdpap+dt3gj_c_vvs8~PSN;p;PcR{gW?(1~eP!^$qUAU-2iG4l z$7J1v#UkXG6rT{C6jxxOs=9P3)?4+@svC6Jb=Ded>kO(f$WV}vDUUNETCMt-VFu2# z=tRMN2{C~f2Dk)eN@O;s*E#>yaUF$mywY@9sjRA8Y%fu(h7>DrD&{wF(Ofw+7YN`l zz}-p*Nl(jEORc)c#)TgxBf)aiEJ>}P#kuhxO$doE=v;FZ8loHk>@10f>F;l{gI3I0 zoD}%F9xdgHW{8{UPBXTW;J@$_x{)MMWqnP9fv1qSILkp*^9$6HlhYM!VipJTkY_o@ zqVme9Fj~d{K!GnGlg^0Z3ha04t_L6J{FfK2eHzTbgvQk?U_SNLL~nK;ChF!;;ey7} z=D_#CT0eCF5}%eC9U4{Ox792T6-voKU?D3rSvTWGf0)ylfL+$R!Bp1lfoVQy5|(7K z${7(0XSlwm1}=uC$H7OGV)IQAcbf1j0y}NWD`6jvvUR)8VLF6wTyip%)p+hapTMkH zUcq@@2*R3*=iG?E1yn8>sck~~fB<(Df~E)T)qWdnB?*3u@kQtrv{P4Ul|~8<hbokj z(p1cmxd|niUXWQR_GQ4<=y5G$Ndy}LxK#*dFiSC0S7|s7hDTRB65ALXu1D!sBj`jY zD49^+xr%EtPN0IAadDW=!AGvc%r9gI6EYZU$Fksg?7hfRn_@4lMj+7C!2V;J=Aptc zbfuPxoR*4`nuwwj?uH5O7gFnL|8c_*-eS0PXeam0{}eD~nV|twd{T9oF>fj~Cwk|Z zqF7bE49`HUyJ8{Oc={sJ@*gD09BkkaDK85G%++)#yXlg^2MbDlEOs<<f?(Kn!yPas znW1kr0*AbzD+<Ci9P>Ci32~zsl8dJ`gRAc?gvztk&XBd(iw@_Qj4&n=T&3rH^kS2L z&io@I`}6@-vP*-*peYnh&C%R(TyN3CQ28*pY6XBs*VM#leOjtsR@#(;FmPr*gR-XB zyI^rmPMOY|dfm+QnY)i5mTJs1y=FcBk)4e2#~`de{Fms*sNo2Hj4logBj!3lj$bL0 zT0Vy)>pNgfLvKM#QZo3!d9!dmI2urLBm<L1PGaHBrF)&cg0^Arg1W-*Q)g*)qpGo2 z!igaXaV&UYxNq2whKdx@$y6i?L4Zv((tgZ1O$*IvAF2Yo(lCx;_6&Sk_z;1c<fGS% zO);T+2O;~$<Fr*OoEc(F5#0`MSkku)VC#{kZX|Yp)K!$?rV$y)$4-|NjD<8VHRckS zxdNs_2ud&g_?)rx23Hs9ikORZMWK_@1j!8s-io>p|Ig7pY~Vtug+aTbhS5B{hxK~i z7>*ld)oO$+FB{9qOr*0<AM790ay&WC@#7ob#Cw68D!iu~PlQCc`^<<21YK(l3nmyo zg8_cnOs-?)AXaL2AA;&iK`_#UE}voN0yG0k&k&b8#*A?#!pks<<2nVR)jF%VFc~P( z1*?lqIyqQ7Y_P@|(N*o#i8QwA(DC-DjnD(D%1b;dB84&bPPHVf-vB=-tD4pw{8Bqq zH1I3<V!qls4L)9Ee+Ra5mSQ`4WiRJlkdQ!x=t8emMJCQ)vVk0`LL02(aM=zw$S*Fl zbMJ4!Hmj*)gCU6KQSIOgP6!O2QD0O_$-4L&Ii_*?{uZw4!=S@ykB`;2#JQYqENemx ztLrOjOEpsiu*x&qS*(_NY7kp>M&U6$geeT7QhKD_ZG@0?S4ZEks=S@(L}SF&W6#bG z9me1fn|aj)2rIM==0EYNoQ%OG$mEtkqv&AVGq`^#KO-~E&)DC90#7QoKxeA8unQP= z{&o=Enx`;~5AP(!&#fz=mLL|J`-`zhVQd2z7GkR6R3T=I%ugZ{R0kENGAh$>7eOF~ z?ZvJwEV!lUZk97Tj^YB|8*UJIuc-;LvZk&v31#{}K81yD<0+SgYx>*{jkTbXQ3xhD zFSY~O8POg$=}7Q@?MIc4s;U{=K2qP7kqS50k3a`jpxjuJDr;aA*?{0cj+VKUqe$0S zpAf;Mr(>$C_!W^5+=Oi8qq8IFHfnd2R%ijoF?jd`LsLzCF=Eq(deh8v-XG9v!%kpp zX1<zGV?opnGmIGvylYNCs<4kWs1N4{PRyOO#v+%ollFrBWavsp*+P1f&OMj<1D0Ba zqS(wJKe%^Q?Xb@BBqRKi=fk2C{Y=X!?1!quiZ=eUbLI%c_zG9~&XX*NgFZM=x)Gz} zk`<>uX_;xchPyyt!F1}42>p5WWLQbPm6xTKAGsGHurmSiq6BUmH;cGn65pUOOyXIX zVc`AQ#?ngXi|*v6PSll;D%H1h8>_zMmF0B|k=EDLVlnIDi@#bjmN+>FPSxOmsxV7H zpre$kMb#H$A5Bztd2vlu3d3XWgdXn1C~hT*svRB0Wdm&CxFagHba?#;OCDW}lJXj7 z`zTys!-Fxb>yxCI^LQSz&S?Z~8?b;uTd;tk0{8zcR1jQ~2AhrbaMLw%#&U~=+6|`` zeH+B+;}BL&j7tQ-X^buH5#vgv*LhyBtAN2S4>!#<h`gy7j<Xoi9PYVP@A#6O#WhLz z9@i~&7avhZXi7GE-wXd6A~*<poD&&jMNQR?u#m>nd?}$f_qjnB8xB#v0ZyZO@clV3 z=_``~{S7YXbANU~iz%Om&A`0V<HKY?w-^of#H)N|F#^)comLlk|GK=J0^KlVt}jBI zugvDQ9atM|OHylj0S8UXGWRNCqfO6*q=fh+teC_m#z)7%*T<$kbP6`Cm1uc5^)#xw zsuELl#XUH{<|2htE$;``o78O6RhVG9)CQ`vIS8PX*Oph7VMWy$5#oa(sXJNbQo1qy zpxw~t4YYaz$!0d3g7aqa4b~F4e00%B9k%wWNubek$fda>*6oURb6`fv`UJpOM_1w6 zfD{LI??*sl6HrgXc&k~<#Ws*Ml%Z4{T!Q81YCa+a2o3m?x&1ZW@afD+Qew0^*<;Di z@_O^=^l(C9Od+xLL5)<9VW>KHLYuB)G{s*XGeEOKE6REr=OF&e-n<BUdjEBEUZf=_ zIeBnsV3UGq9-9eWy9rS+u$}s4Xal_>H{#V7XnZC$z95HDEer@3(|VpOGqs)v&dg9# z29DpTJ@fboEjhkq%rue*=jjJp%<;>-LC%MaYXK2U1_Sf3r6q7eg2ky_;YKLC;-aB! z>}gaH?ofpvhzS6<UntiPfiBus1W<4?OD!nq+8#O=j0+6KA-oC1wbf2)6!(vjZL-FY zNgU7c=lURSW@HbsMZ+EkH-yA-wb%$lg)SB+Wavx9Kx#$EYOt{nSPwh~7KHQFwr(&f zR>`&zvQ?p0L@M$TB#Dd0@uYMtmSG`O&B38y#?p^I=~0K()VjXfFcdH;YVhEWAx2>J zoq1**=-wKd<iXO!g+aD}fF(E?yTGn0<z8Sv8J!um`voVALITN#4xiWe?!=%K2U}5d zwfUDbM&tBLT%@I<9A|E^&|g<x$FtmKH!w`ZLo@+tiUy06<f$MiW^{=7H5?Nzysd@? zb7<oC%`HAKS1RTo2=s+)jWs9Q4fa0z5Rb`8htI4;FWHY>Rk0`?W48~xrgLdbV1^1H z{&4E@v4nv~i;9ck!;Up@96F)4d>m#&PD_XtS7$gPB6z2&4D(3rtbtWGl4TWDMRk!p z<DqH6cZ|obZ;+|>*Ki|^v7OjkS%d`vCK?>XQj^l$dTeRM!KsiFU4au?Jwx^%V|TIH z9f6)uXS9O$?*FO?9Mifxq+op$q3X*>=XjhY3u>aT5dH%4Lb7mZ!HaD+Xep&3g|<vz z;!8$6i7`W;&x3{Q3)X$rA{LghacV*Jp?U5n#Mmlx1)@K|!;I$kcKz&<aYRYYTGg`_ zoTYU}_e^jnMkn$wHZI8(8y6iDM|BQH{L~UlK#<j&*c@-ce!KIw2AE!`u?x@;eoPv( zQqWo0N>Ec@U6+{(Kfo+L5V|yq$A0k8C!=B`on4)=<W?Yxk%KK{2xLTf$5itK9u6Hb zm{DHlJTE8s#>K)HjLjfq;Vi`j|9?Feg2fgTeb)tDjG;d-7yF+7v2)EKP8}J+nq-=P z5d2tJo8G;nV{ld$=k?5UX=>>$)fZfw3=ss*<@AVgs0mkbC*=}jR_6B=co|G$%#T4E zL?D!THqO8V)*8+IB!L~C+_Z#sO0J;M>j(*3^yE3hr07KKns6l~V%5I1M*_nb*!`k; zJ;|Byso;gfH8M^J>EW@!z>#daeR0wH`W$MNXzre%JDM5lj>4!Lqm4S)f*BJR2i-W? z5)dt}w7K27jWq^CE}jKkZDU<l0nIh7W3X7B9^n1}tSn<XkqsXs&W$|+<eQpIU>^i6 zt-cC$f$hZTiXc74nn5(x`aU4Kb0M*Zc-^Br&k8_9Q~(ZZ{gjpSeIaE9;0tk+JIA%G z<Y;WcRh#icCcrTq+pukEfX^Qd7e5xqzT7c!@b431u&2cpn}~r8-EKq$&R_r3*FAk; zRK7MS6&@>EfVo&KL?y>Nh--d`S1`QqZ13*rPV7mc4e~AIoKc(-6Fq_--1_hzHZRu1 zCic{dN=l&aoa_{0!ht%dIfuT^7BT}d9#Ije1`{R<KNiH;(YlABj&<iZct+osf@jKW zD~l@sab|*%9#uixu#dxogXuZB%KveKnP6~0N7Q;eAEV*t8U?87)W`93wlN^6Bh~>s z8f!QNY6#Fz37Y2v_0CVZNaq*3v4M%3Jx~$zD7M~zNzu_UF_>1z#3#nZCM3iqV$Frh z5VF16s1tR>^pSD00_T6RjW{>U<3|YCX`bS@;N*UJN%=p-*CN`h+l|U`wjay5BN6Z_ z#V$up?XE!O^eyQP)*h(+I22|^S{Ou6_n6_9i$z;-j&W2GT#gZyxS}^2T;Ke!2lljV z@FyKXRZN>WyN$&V=ZcF<N{Wqx2E@8?)<f;f=Rl$h63r<l(f?>pRg^&aP>A%anRuxC zu1~_1Z;!|&Hs5msjEJ3DruS>X)mtuvqA9eTdQ=y#sv#Z0lM?z#Z{@&SlnZ6Nfz5p8 zYxE|K(bhOSr@{+{nS*!-ilub;uyE*1igq)kZO#SYhNuJSm;s|K(`hso$^t?f?M_j8 zL_2Wa0K-jL#t4UVsKq#l8mhDx1c700^kwh!%?(+_f4bSBuYck3S7i<KBQ2rp`vFs~ zM@@o@Ule<_6p0t{<4vYAx)2vkQ&Gu?%I@m$J<r~kmDFm(%j;@~MpQ;d<)o$3FTUA1 z9;-&~EXH>uknil|H15!K!&xzmi`r-^K8{w6WJu4nrXfdVDX<V#Y!_wFKLVs@7T04@ zKt9}m{=i2We>7*5R(l8JFfe8q0aA6cF)%!&<OPmL>L+c^w+`?P)!87ms6m^pwgLn; zHvWTs2r&fFYLBn69m_B(J(K?1KQ9gy$MRPOlu|&88b$^5rJ8@-(HU$WH(Dtd<otG- zJ2sWoW4jt|K&FGDueST}gC9m*KO#b(dVuNry^wLYD^94oW8HB{(UDle2|Nh{p}N*Q zbBNW;pd^|ydtrbpJ|-)RLnXIGqVdp4)8}rm4FUdgJa-EO+iRTp9})~-Ak?7rRzFXf zS?kk}M=-e1@X+LS5&s;qF|7%rmAVq+yh335flOba+V`VoX(7*=*%w#>E}6UaKoty9 z;Fkqdtd;wZcw|SPv(PItOqmLbdVJjW6>65igAfj=6Tgi61a>vTuTj4lqaSla%8c`3 zQ<58}%-peXYTQ_of>n=kC&H2^CdLC3l3ei#ZcbW^@2j|+e!e_(!IVoY@Co2I#+pt| z0<Agr-+O#{JT{i%!%|p?onw5Me|oibuiT97TqK@r-cs{+-5MGt;~NcsY2hEgs_FxM zfusjwd@&7vP(c4J3)WJPCh6fa{CGeJ^Pn_z%P5xUaP?CwA#RikgHx5TT}eNw%wtUn z44~1H>2^Bk*{fe!a>o~7Cmif5oFe>05h4ZLB$8i{N5;YTh85tMFba5D9+q=4yckiE z7!_ePPJ$Wck%ukKP|tZEQU?|+BgWQLX=4T=08t$xGl7VhzSHw!XF$~|fqt|<KV;d^ z6b+~VPiP<%G6wysFa97%URPC8=2TdQnyK@^Ff8hK&yZH@yXP;)2F!KP6XUkeko94% z4y%7ATd<^|WoGAPVJVdHmSFfN<acsH@9Xg&C99?}51pi`T~*5d!585!*<5u(&e(~Y zlM9W+CIyTpnDKLvH;okI<k1&DW}&wC!SmD4&jhTMu?hJ<{d|SmhRm@iH5XyO?#`Y) zdj`MAG2tSSc`%1tXgNt#%WA<>%DPydzkdqyrZy+xEF-paVO<pa+X5nq)?Gv<;q00# z#`<}DutG_B$k7Six`!Mu*L_V)iS;`n8)`Z2)u(j&4@Ly$0PF@<#W)a2-N4$Yx8ae< zB>vJJk4T@tK9H8FBDMho1}Q~zc#zVJ;$p^@jZRaxFFqzd-kp??5FHZ_KOajsSg{GX zgZdI+LPNvLKqh<Na2atz4SUc+?3~(E%|$@`B7!!=_$jr7n79}&I_QFaAumuN$VFC; znqtOA$8%=sN=!^lijRp&On}|QoA{+8ga!ZMcaCz?0>5))>}*RNjQvuW0^@hBa#J{< z=;nmK{gtB!)77sI(W01v!pvHK4SqjyRC!%meMLpXf%5-hob;=6W#<o*MlP7C))E72 zo+@CbOQ#<*-F*H+7f(u3M7bPl`o2NuaAZ+!o;sRAhcpvEnd1NNE-B6({<BAlA1^4b zsva9r(jAAogTGP|njH`?Sa0sm<LZ1eqUZV{w}!!PpW65B&s9GHr~lYmG<SUmI|L^r zxQ$o;8K@*4G*mx+$X$kNyVk|_8U_y<j@OdmNSo3T6cn<9-&8Vl-U&|5)*|uqLPi)G zPIxaTU2tbt*bn>=13Y#;8Ci|pURCNBhRTtPXdIq(_BO)O&WNrk9UGjwbwf4+jOy)f z-Sj7er#TrILO;7yKnBVa&=>Z;iW(WmfXo}{XwD0;bvJ0p3>nrZ`O3#t-aR%^8h$Re zAvHXi6tb4X!7AiDzFG#x9s-_2Gr!3bLi*44sl7-T!te{5#t%(uwIM^N{=1860fY0@ z|8TO%^tx1?)enwj=fcx7f5Gc~|J?k+5jF2H1>M-)z)h;bsU_BfLe@jv+)dK(mp6=k zUZ%%#{=seI*Wm&Ow+r)ev>kmB;@L1qCDl%B+{3vj{TINnugByW7?zgET}yQA@C;7S zdkuRV&}i1&9540RB^@#+A4k%B3@yNXi35dNuENQcq&T&8%UqBRtTRVrsmSy}vT>3j zo4$Bvp)-)j^&<8+hH?FbJQlng9=Z%n<^J)ETG0L0M-L2_2wMfl5dMOnmOL0gGxpzp zVNxFe@j-nXE_SLpc?j<RwD%=&c3ySaZ!!f6ZQ09O;5OYRG@agkffkr#Cdtqwlg=bf zT8fuDcS*)(V`kDOv=xvdB8#lD%MKzSA|fg%s30PsA}A^#B8wm(s3<BR-}C&>bIyC- zcjn#%<bzK?@2}}I=Y7vT_kGX$-~U*qT|^XFf|$qc>25{h?=*tlm4%<c7Qi5Ow-B($ z8^fH7gyKXX;MmN5$hJsC6Vmo*u{3?;fM8m%`?3at2k?ybQ6pp?=(zh@1<d^_X0KGX z6Krt&2+j5oEwc|31oGm9^q~uQ)cHMg)KnE=Feb~Mr9Q)_^dsXQeT!{TCxOXe#@ddQ zF4S-eJCdnMHF-MmCwC#zm{%*8L5hL+B~6)9zC#>X?I$pnq_Hys%xMrYn!hCR;fl$L zX%xN9Q3x!tXmtgxuoCzlR4RghW(cD&opBi+LOyB+*9|%&xPet595ml9^G}8n#wq4@ z^$}^gH{*3W%R}UZu){+n&;mb)mNpfZ5e;+$Hr^p7d&?__2R&3>K6d`5!p(=4ZXHqg z@bZ#1%K)S8?xw;8w8kG%f33E?fkiIZCfu-El+8o)R4%vN1cKRHuvB!RUe}65TdF~P z1s=r|;FKSrlXHp{(uuZdFsdWTOSeNnh$0@3ye?Q>RLaTAR?8kN@NL+oWZD(Rb&V-N z2?h5EOag=0%Thj;#e};g6g+NraXRCPDutzrW>Gj5?F5wGM7kg_+i<1Xvwe07(q1vm zc8a*eM?rsA#R)bE56(f8@VNbSNW9B*gT-rx{cyBsOHx7h^=|Ca5KMw9(@JG$v$t_d zbBVBjvd)f~m;}MuG4LE-qFzPRsn7zH6zJd}j0_z?K6(FS%gmYCug*qzdOz$!Ks4f* zGI9z;R(AVY+oCYC4U&5aZA>aT`x2R|uXbGbM<Jft1R^-mppL_S?fhOP$)+kLwLMdG zVLSWWNoav^!db|sXvQ9_*kRJ^k2etTP8aU^8Cs0^E(cdKMDA|kcd2PU06PT!|8b-b zVbOgW#4-<}VdS!ZELz{<WWwp~1p<6wzl-BIc3g*xnv<>w&1p_|vsI+NW|X}mVh!U& zjly;D<z+YNN5Y5_IGy2F=t8xy%7@BG+f(^aEqt#|R5l1001EgsX7$Dr*1?-wjs0QS zr}H|DpX~(EjQ0~5qLAew2C;Tdx&<($nGXYb^Pr(9s%}B^7MDBA-Ni+56yu)P-e?!D zxUyJkM7DS?oCQr+oP7^1oJfshmx!rxu9Dq*8FCt@@XAq(M4JBrV=COQFeE90ks>7N z<R#*MaMC(UP`CG;D1lN0QQ{1?MOu4}0~CeP#*meapCaBG<_9*C?4ggjQRe(GA`I^r z*=I3Y2alSJfmR4HXeUwLrI1IFL>6Tzl2<8_%OI#=uFM57=rLSj!Nu2y(t;(g$&+Rm zQJtnvrP^IaoW0PCX7~abrvgjSCu>7Ce!OuOkZanx;0VZItTs`byR3-+k?&kM)H!m4 z8^j#Pcyl3*?E@D`7pyi4MaxUsz?UaBUJTBZ9zibrENVEDrc170xx@m|ipa)}W~Mw@ z>e}=|jz6VZDBfoxNjMJ@H`!f;NXGu6bcYIiNO+)CFH@>rs=E*r<yxcC0_`rnkT+2! zw`7}08sWXrC?!q@8~^gEAZD4FBk?6n<7CzsPB$9XF}iA%I&4SSV$gWCO}Ram+T67o zv#jXe1+oo~02{qP{T8=y-tOOTsvcPW!ss8aE6^0f=E()sk*LZufomudw+HIfNHLSg zxrtHSo1QA!gFLg4xRdh}gl4e+Gk>`BF<k{d3uyd^sVp>TZ%YOML%q1N_TlVFe=1KZ z7MTZm0p@4-&TW~VyOuBSo)#3J5$4X!A@hV(I@nU*Wx+>6=bQJ1f@2L?Es^}dj1a|C zhI#5E_t_y91nS<zbf`!@NCg-SzRPIvFw~e|S(?Nq5+2XOB|!1WkVL_Je^u-itY<$r zB#CmmnmIWCQ7RwUDB1ZUP)gbwh()L8@DX9znx`ZfRVSiPP)w;4jIb<*oPDafzt>8n z+}!h{qd+t7K`d>*v+M8+O1+e}&e&jww}D}*kC+?gBi0MgB*gAA7go%JQ~Iznf*0a= z1us^cB#wJ4MRa9&YkRHqMtB^zMPY7-u{Y-;7aJcEU~d*489~NDyh2cXUvF)TOT@-M zc097W%!b4#^Y41VIZy7~?GA}mK2kp8hQ&;Aw)nL3b?@$i{e<qHx@L=KZJlMXX-9&* zK9%HSY$0lgl@>>ar=?7YQS!#b@oq{M0QA8SsyRa*A+`;OBa%lt54JKqKiqaOz7#pp zCLNO@#A!H<=nQ;Sg*earRJGi6k)_gg#_g9)Pwj&dR(xoheUJ|k>gpq&LwCt<s)3Bl zMY9jr`A0UMJr{?g)aJKSM{2Qg$f}fK*dFF!@Iy-@E;}9}AB35mBEz#({9zhKr%I25 zO|@MBDx^07gK4=_yo9Kh99}taY-xPy$fg_Db^&A(lA|{k5Ng%QMCtas1VfGu+&>B~ zCy7F_q6N7IrXdwf74Nr|jQT1HQWewgs~jDm?+X2u(G}aUtkI)n{7fDy`E~-?J>q!4 z0{X^HNScz7>8IEI?ga%o^y59oS3=d*Nm=L;xx9u;WE)=1n0R{;f?^v2NIE0Uu%Tzg zzpEnBA{+|CO@nvGsS|9jg7sB43<7;v%7d_AGF$&1xAo&x@n<Jj>}JHl^XoJ@fiNM< znsB2QX*4KYq&&#OZ$^d*4Yx*33ydn1$pt5}DOlZZMaBo{NhjwaF2Fq>$uu`-n+#~0 zo*#R*??s?c9Uo?HfUfnFOjexjbDdC{?I}C#ckFrRXga%fi`TAjX3&_3G7P7Z94Z0^ zxdQcWCKxQac!kf4rWbk=b`KU>X?hNfY}9QeKKRk@i&GR;BO$vv0poF;tPli>XmdOr z#6D}p(WzHaDfCmYc;_y*+7{YETKNFx_BI*Hh;M`c@NhWLBW>&a-g&y5(h>oDVW8~z zm^?iq>Kk8%Fbm%{85sTRJ-Y@IL9uHRmS)61{ACx{2(E@+R!u_&8BFNNhs%mW1{sCr z9hK&wK;ofrf<0?O6}p4s^f7sm6thlwyE<g{%FzrbOh)En$Nr|WM6ZGHSzpv7Y;f2I z+4qOM3-3=?G-gL}Nfe4vuVG&7-VRlDmLA?ZMN!O&Ek265_iC!<q)s7JOf}3Z^b!Pn zCb7fA$f4a^3`$TQNe~L*T;aV~nudm`TVcHLtM|@8feCXIw`Uop;3BYA`N}~=RdREe zv(;Q}+b3eLc31!(T{?`QvBTUGoi%2V_NTtD7)!1cXKS49nA;Ka&E#j9gW3F63tezV z*eM;+LOZro$uRAuWWbZ%KjLIbTBzPYGIzH7%T!}U5?|W@EbN4*kqb?Yh|7)Oy$p4Z zTfPK;jhz|B$Y_Rm^t5wmemG@QEe;U|6IqcoqMmdZ$TJ{h9;$-7Kd^*+he$Q^!wKs9 zutGMbuU3(>n8=&-fsgmpE#l*XiJ@ZUs+<%APAbf?cmrmTCc05n8OM6_(KANeZSNTh z7MriB9CJIg+e4(v+YKoic0bDxhj7o3Nrh-FlUuM*;6ws3m8WO6?Y;(U3eyxWLYa4B zVxl1O3(GPrCR>c$P5kJueY6#$xtX!yfQpS?Zzkw2GbXxQHLXGmsp*^p9hYWyeXMEm z6u7F>3=5Qr3Z%6PyA@MB@`bn-1OE`&`>-2L(~}aO+&M`kn+;NXcGnI@JE!Uo*PRg1 z?WZM^pP8YgjV#pmj5F_54Ip8{KAC!dVo%}P;D<pK<f?_I*bAXY2pQmVYMRqsOc%zN z`4zkv-YHh$;_Cc9#hMV8o!3GPBULkc3JjeV1`UZQqRE^uX8J?7AD`!OFT&><d1<ti zcRUrnK*bi7yK9}A^ZTMxlgFlYvyOdC=c~*L(FsKC<i}fKy&&d;=MXLUxgM6`tIU}V zJ%iIN^URE<qp?;$L%5^~3W_BNN}T24Djk-OF<FbG5m6N9Xq8zMXIo{Qht8%HZ=xd_ zaY466)_`^c>jfRIosv|B+4CcbTJ(I3>Ml|v%Mn_VD&q(tD4`>6n-Po)_7^!+N4w?7 z+EQ%}w=BrC)R`bn!AZkiZ`U42v7ndvMBdn<0Pl7Gh;#cHxC*EI>dXpqNXM)RnfBI{ zK5TM9LxTt+)c$^C5c#xx{yEdw4QXBquDr4*eW?%3@_wgb&hDu98Q8Bm+o&k_10+l` zv<?y(1dd8=?q&+jQp5TAlW!PuaAQ+wR`~JrbFNgTM2?%85%@PjvQH~RZuhwzIy(QO zxVqu2n48`)38O`-EVcVv6d1}eQ(BO$QjX;Jx@imez^UUxOc+T@(}uO;ek5k{2}Txa zbNp`NgYrVdm;N4y1R169Oqg>{7MnQ=kxUR3$bRmEXtF#}DV7;xq*aEy58PSnP2{5r zzu*!y<d%LZvJs{FsRaW7{G3*tBs)8~+n`Hnl}Y82<Mpr}rst5g^(se%!axEUBI&w( z`W6z0djBP}hgNxn*~9nKHmx+;-4n}$O)%O(+nPww5TgGh>1yg5m@FZ{(vAHsu*IV| zSi7w;GbI|)hR{+rP+8Us>LWzaD-~;u*`t%W<`PseVl+62xw)CuX|Ax}nyd>keLc^N z9i6#Hjk>VhnOU~f9W%DGf$Q?A4H2}6IiEHGVK>PPhvW7q;`75HYggo>bK>Z+{t=sl zW&s~hLB1BJVEX*mkQCTvvfkBs!o19cYGFx-J@vRI?a0$scK1%e?#&Kr3>2$H5s3I2 zwgps|tQ%gn6cn0stc6o?Y#&rt77~FS?u74Z6TEfKJefIW$Mt5|z@qFN@N0JihRbPa z91~W!t`7uDpgff&)RCT17m~MjUC2!<vQtUb&3G>M!mLy8n%tgsG1)W`9iM`7<h2@x zgdyF0ZzJ*-wl#ALYfBtGe({>QdlAs82j+u*jSyt-Z134O3;o<URLC>54w~TJ?jKkW zk`q?Y@dtt+2=bUnx(znQd4j?A%%_r0XN@znr&xs61S4c4w6$bF90ioJ>~b~}kfk`B z$V@d$^$~V+ACOEziPbA}r5eu-s-c|aMp;tz0`iHqgL@kjQ)nynNt2=_?HC4(jEk`$ zW4t1rOvB{xPEKT5Y?Omk4?+PS1dO#EF&d|NR=gx@E52(qkyek>EQI)SQZQJk`N9xU zC~mHf4##f5vI!l?L~|V7U^$m2zbO@RmC;{R?9t8Ldq-neK=y1Ht(?G3`LSXGSf*$_ zIc2Wi3pU+1IkG$fqh3a@QD);}GJuwb_+#yGHT2iSVAwE#AoLk`8HL5~3c*5MV^xAL zvlr!5hKX`giK4aRvTth7FtR-F(txnxE?x=e6uBNe6$MVT1X>jpnbU3Wo`}O??;5um z?Ga>)%s<5qN?=bjv^A=bwuas7RS*t2Uu+7vJ^RZ(bRK$n#WEkz@ozcDrcx#H;Wk62 zIJ^$V#d+GB;vP;Ja4{zJ0a+saZOaXiAx-jp#>9uI#a$M^M?R9$VrP>{J`z>6)~2@7 z%6spWi2a&TrMia=Hy;}|-bMH(GPbMaxdCr%$NcARfr7i)3Bkn-sQX#CUTmdHA84GM z_{zSA|AE1AA~+|h2-!aCb-Z>N4tXx?XV?}a#SkWfWJyfSiIT|?@UVO<lo5kdGpb1c z`p|^kUL|)EE#a0#K8}bJvl_#QnU%98Cc9~Zdk8ZN=vI7&F7&Ej=vDu~f%x^#9GctA zmBtQ5(sGvy!BW}rJ$MzChOGiZ)rFU$6INv{84QH=oWbDK6+y!EGcJS#q$ExYqIux= z;~=Lsqk7n?n#{tDkQ2z;8-v5fGL?{x+Er~ROy-N>$g#wXtp=|}Iy(9E+YCpx+FG_q zYuN`^>&Ch8WgQFTc74YLRU$5kMt9g&bKXrds#sY%d3t&DxCFr5WMbIk!1L-Nyd1ZX zywI{x_Ir9@uKc8o&HB@o!NZtcFl;$+8QB>TgtRHe62>~Lfk;T2w6EgyQ{*IvZREj* z!#N_o*jLvG(}V*G)-pKJLxAzzaQIl`?%Z;E^Js%4oz-AyaQ2RwN8~nG(qZPMhRnvt z`^(&yHJfrG0xTf<>YKrnWf{%8z1S0Io|bT)WwNJ->$bKdt~AU^&kE8>DNJu$s~PtE zYHp#qbUe{3x#)9vC7i&_D$rg+S_Y;q$0>|#ZUYcwmtBV9fX)C*a1kn6u&QN-G7a?# zR#6Gb;XI`3$1c6poB&86=zXH`ErijxSB&n29X^#m#3#Kaf`lQ8R|;~Ss(FhEo=td0 zs+Mb)Ydw|pnXiVoA2%*MBm)b%z!2fh9?_23tib_tI61OTzZ;^n2eCzk8<Yj)kQQT= zl-65oG6zK%RB_+g@#G6@!C_I)!?wfQ-+(MgqsJil%>F$&{^&^mrU|%bAV4JmY1JVA zII%(ogwwK_G5m}j;V_^+i+6n4^@kaOhXhk=tsT7i+ETOnUMM+j-g8=Fg=Lrl(l1kX z)@YB!e(NKELRM7Ab930)lOV?}Oa-@S25{jba7QBp0fT@+stD-EWqQfe8?gZ)I_%f$ zFtDT~q`ZBmP@nLjPb&2mg0D17^=fPSGODwej~!pN7`j*x^o_9vVcsz}X+dzkaDm)Z zco=-_R5-LSprHcRi!BMOU_N-%PQnO?>qHmNzp`-2^+zsYRgBBV^bVZv=xwun)57sV zy4+Zok;w5dYuvRa&~_KUp*m|k0AzmopW<R=&zo8ng5??HqskFEo-<FS3iM>33a;#B z_&K@(*2-AZ9?KSdbjQ!)9ETD(&i>&(_M0Q!lV}{nEzX_6hG3S62#QQ;y|+LHz&$=z zi4$|cY{qs(E+Bl-`$eS*M`{%YQznH4p9Heb)AOM4u0gnDrZI%U2#uF9Px-`a6IgBm z7TSx4j~!p?bKCT9vu_JCQksZkbV5p|qYSoed_R}Kz_cXH=3@~E<m&BHAejqNDn3we zb6;Rk#jRV?NW0hoBdxBbW<}_q%~%eXk;25j7!SMSur1u^P=kFJctWyNv%fq#7{K5e zj?7$}n-Ic(^E7<L(oMwQFSrT?)d>4GHu{jD4H<QU82~LA%no?%&?UKmVWR_=*tDcJ z2HuR$&&1ps-MQ-{|E;d%6r0%t*z-ZM|3y6Qh#2R2Ys9<6ExVDS*pu>@N%48S);XN6 zKy(sw?s!IJRcupZIAA-9wWv6Ts{$#-GsjyOafyJ~ZWNYinvr^EdQZ$2t=2FL9jiwZ zpR4!6D%W!!B_^MS#hCeDYyuIqwlx*3%UH>KTV&12@TE;k@@+Y5@Eo24@n`WwZM)g8 zZ-)VU+lN)#ZZc$FG9UO!+vmM2Sj2IJjVzTJ(F<j`In6Mm+dVs>tFd#PVyfV&o*J_- z0hXO<-nJq~%K6K{ta*VJZ5r2Vaxa4EO>fyg%b!ab-5Km>fg*qnoBK8Ff_8wWGM7q$ zTNSQ*2cvj>;R$I&9urbU3cz@x>PU@FOgbyH%RDg|lZ-<^hgIu^)cr@+$CzYoBvR3; z1@Xy`O(8A?=y0cze9NgJjT=FpO}ra>Y=kYTbN-N<70lFp7>r<oX0q>9am+1N8<$%~ zuZ!aWF<A<m-1(sBD?UaoIWI5WDG!tGq-nn5J`H=8%Q8_<c;3@pB4~&3B+&AuqX)YM z4WC@IBXt3<cp)`9+?fNVOa)x~O0_9jm84oL{6df!gm0&t2#s@?y$j=j`I0@(Wee*Z z3uF5NZ))syT=)$mU#aFQJ8BD4ffO)5@yqVUTnJMYDQ7j#tK0@N!<)Jd+N40`*#08k zB)wC5*tbB`yM3$0&1`<h=B+kIxp*Z0!s3ONB7G(r&tsL)uE)ha%pB{IvU8!Y&DEI} zUQz*0Zx>HX?T-rNx~ejKriO%a-D-*z9L$itgy|OV0c9t{yoQ9(&Y5|bRU<C0mo-+{ z>Fxy^I(Q0ozBCqG9P&0I+*1SUQ?ANrG`K2lsjrcMjbao>r;|H#dvTF+b_<!zv>#Y2 z2afc6=1P_fI?IsTfZ~P`lPK&AeH~H2#_x!Dg|1*z0re438GiJjg)MLe=x`&mdDD5` zgAs*U8Od7`fsnDf`11MGbDTovxYFr9_V^-*xl<&qU~8g9p+%xl)CEGdNULQC__Kbh zr)(~FWEl~LGb_7jEqqg<3mOau7W%~^PUBqEN{g*#GBX=iGd8(7v$5sF6k;n<l<`Cj zQ_R9|I$mm3R50@JK{6ci>IJuvW6iF0*JdJgiHO7%O&rQt9G@30Bv57<O(<p-xLYr+ z;?ab_bBMmV*eg63MsK~v18^=PlVfgcSsyhRf3^{rl!vu={B#>NOM2z4lxa6kE_4Hy z2$a*?SCBqt%`o;MBkT6P+omng6n@@w$p?=kz9)#GaZIuxZm>O5@q$ArD(kOE>=ycE zoU0Zcl1b-!DYi2#vW*Gn_xNQD6t;U7+cCoD;Qs}SmKjDM5Vosm)<QjauX~ZE<u=03 zh(PBVn!ro}q)g2@YgVf<og2yQ!aF#FPqU>CPqo&(z)oPj1d*7N!B&uxrjZ;TIF|*C zX_^`lTxwyYS1-L7;PJHDk--t28?MBiakh}nj+ma2)}I#J-383ZE;!{g2B8hZR3+rR z8d+y{A6;HtL2zxisW9<eKFbbHAskc)W8vO0BzhT^Qv`!cgMN82rt8v4wN{IAo#@BZ z0!(psV`qthz74SlLYsQzs0-QSFF~OSlesGk7yAncKlP~MqaPZ+g9=BH3o}=vl&yh= z^EJv*jm0Bf_p3-M1*Q;+V?G!k$aC@NNrbv^0r6MeWZWTt(WgJ{LdARl394MX`Mbv5 z_Hl2+mJR85+t?!Twu^il#5eL^YST6N$Z;MJru$9rI5X5?*V`^dY-s0LZFzOo0VHiS zmRNnKdm|DAvg@Nq!8J&AR@aSXcE^t(Ggi+;ciAt;mB47N9KE59?6zzCa$FHM@;*Bg zhTS!oAEmgy^{oHKTBA0!ay*K0rA*A?;cpZ~m8eomhbV5zLSfTi+P#Sv^%>(5b@JL@ zDe>hqUpeKklvjPFJmSF)!=gF+U`_^ks;^`o%)T<}!R%Ku4`yE(^<eNxjb0ra{Mt_x zC7YhWA$#;VHsQ?Vjr%oQ+4Lg#5`zDZ`buhWd^$gnseM|%a8oxGtDX86a<xzE7m!Oe zWaK{eFXU>U?k{9s{FLJmC3nRWo#t<3ylGG8Me<)bt>3w+i-+@a&Qt$NzWQnY1|RM4 zf;@vy=U4JyIIZ6~RIhfJ;?Aw`ORg_ovi2$>i-RPQr%^MqqslHCoO~zj49lHX?s{>; z6gphdl*6V^5pFLY;d+lY#BgVDWLZ1Zkgpy^xO)6{o92EK?ZFWX_By1od|iHL&DPN+ zZ3G)5iI96_=pUg_9ri-u?&8q}p1jc;`CGc9X7lG7NS(D#FkI$Yg;XSx7nnUSB9f;f z124@Y<7k#IF19Knc|v*yYk8y@u-ISZok8rnKrs<X>;lCMmxW~5G&0ou80Q4$G8=iU zfFM}dj*Ur8gSI3$EFL<9P5MYLB}mP95ekjD*;$5jisaK$XQo<s(Bcu<>5Y;+LrKvM z#0+2)B7p%pIF~j&4zc1n6Vqh-SQ%hyAo$F@Bfm|_fxRO+p43pbVA2aRoA^<D6`Urb zgp${pgE&&+O>cz<%G(*YkfWy+Mv(GY7doF+<cOh6$c$kqVSouPO$;S$C^(82ly|Hu zEK%^;>-W1}GXiOO7vl1iWeDC5J}ksge+O{sw1&jfmnLeBVgtcn%XNrO5Cs-7YReVt z1WKd4@U8&qs8cG%&ooM}%cLMA1t{Ne9g>EO$@K}k!M%ku6;zfjif&E6>c4OOO_L$d z8*as1mqe1xjFY*+o+;`Q@5kviZyW<R%6cg9@ZQYQ>@i~}!@w=l2QQ;*r&8FaTBt&Y zgEXt&==6><w5K=Z)U?S$Eys?YNEU)w{ufdp1gM4kQtEsvK|PI$m}xpwAM#J;-sv7) zg0#r-gOuZ#g%2#SZFrp*aeESpXfpePo2F48S{S%fSaqB1hx%8&1VWPSHPL=<_S1sS zs|DxGhn?Z(>t0Upe%n&YVYJP^%O^{V-Mjp+&{mz?ac(|AjFVkDrZYg>jOM8abY||E zoU3kLsGp$a$JPm3KF&gBfj0dKuC7vNQQ*cMI56xGkVZQjelHD^mf5WsCT%N(rre@a z(RoybvrJZHQOqcIOuU&PcI@Hh(5rHLun?l&UW+a!crB=<A)!gr|7L#plmQ^Db|fOo z8)6<FbdOo6hVMyAveYeXC@dW*Y#1#T;bfk|bWZb{vd^3`*eWX}e|eSXY!GGI?3|Xk zF)LV+<CPPvXlt)~iFKnY3ohsW;H<eQ62GjVzh`z~hAE`<EH^5|5H**>d76pV6WZ6# zZQU`u4}r|QekY&4H#iuk=aV(cNd{HM4m!(YhJmTPs*P0^d=qgfQh5yP<n1Q(-HknK z4R28<Ri%CekLirR{efI7W+Fzp&}?>urE!lTBXMz$&E^9B{*?DRk<aA(7Mke7FMaEX zb0OmPu^1uSWCqh6)8mspDqZ~rSB&<cYi8#5z=V!Nwg;-cVPob(_C;|}=|be}DDYUY zzMaK_-bM=w9C2Yf_(LK}O3ICh%O>50BsYcNPb=0<vsJc2=HP325FW=o2urH1O>a~P zPkSJD1WrQUwo|T-^ev=)Vdf6DC3K%DMlkGbJXY_soa*=00T^cV0pA_kK3p?@7>*dd z{=A;1%3M3U+cPxAK!pO|9}_(NDQstsmc*U8f|m}bv{KY(L5`aGMXNIuFDJi+Knbu1 z$+Wi5Vxw{)O`NqF5BJnc4lG4D_J;%<<>=W5>d8v80{tYC4&E5@T$#HaY+`zggMs(B zQxMT1TQ%H4xMof|GhTJ*<PI~n&^EG{Nzu`{B4wPplGAAnov~O=5Z{JjjD*+IyJ!c$ z16DI2j&`PL;ln;Z1M8G<wwgJik7t3-isO0gzRcwS@pB~;U=3S^wArb;Gd-SzCb@(Z zxI74DpUv2UoIyKg>C%f3becU(0EnNN+&Mpfth3ZPOsOM?TK^|3evTY4!$Qn%My-Lk zmD)B<3Lj4`<pDy+&<-k6?<6p>O4HfFu9NAQ+Bf!*${mt#ZAWnJ-(ACltYBLSHd_#o za@i<|rzhD9Nb2Tf;(3xx!~lk2Z;0yxJ70us1?5qt*J2Iya<$qjl4`D25&w@F6!;72 zR-B=(Ox;CA!zpYAK$#=<l{194{k70OaOmg)828Agi-Ta6B%n*Y|B83van{^Z*LjCl zYH4<vZQ8u?Gophgx5H9;#<-L$32AzQkXDI|Oj|~wGFfvvxj<LAIZ&h5Md}*6yU=PD ztF$n8FFXn3GkTN2wS#djGjxoNww`MB&fx8tWlSU0vGK>?t(nsTgy60%(>P}_H|24I zcausnEEU@prbvczL8v0;7DEYU25PJGPYu*6jo6^>-hwnKei>ldVV@)gI=6=mH+3Y1 zYO$qw9NbdE59Hcr<5<fsY1DjwW#`def6LJ$D^Nnm333_O4U4G1bPesg-T8RBd2~0f zl}H!L=WLT$4&fZM+)g0?U^wdWM~F>^Uh?Y`dO^N8mNCNbw8?$JgsqS`;lt*=Gdn=( zI2nZ8$KhhT;)Bwy={}Byn$LYc%yFD;jf!69r+^F1Lxo=OW@Q{7)7wtXYz0XWl++ll zOe(>M5T|Tl3l9LCNAocArFP3wXc^z;ch)Qmm<EcC8zSj7Me2)RlF$RDIC2l*dUiC~ z6r8O{<Rjs=^)B74d@zeLCcowt?KhyKUL$YJn!9+shm%L5_S*GAs@KE0f@h;u774&G z*FB4F=UNanxUdSVyp?=dg$55d%o8MNBq4#RRdXi?=!HGpcXncmP(jI~vrO+HqqscF z2NOouQCvw^^Ica_Tc)u$%jvaqM$%B0tOCD{C&}*=(6!_7;t-#ckHkJ#E_(XV?V?xv zO|;C=#au6vRP1&W%adr?TaHHa1EKw6YHAB?9#4oq(KhBs6Pw76>9D}ep<j!Wr$Kw~ z)nO9gi=dq+mzVoXE7$x#o>$prRSvdGn#Qzii9*80LYt}S&3hrNkT2X&6H~a;l7-5f z$C0)Gr$DN9AA@Gh@0+0|Qe-R#`HL(tWUI`yA?#=dmM<f)yoxs0oi}DGyUMd3-uRr1 z&=$m_aVbj2EysqVv%$8_Z-e9z0kS#4ohF?N4r_vuq@qNVdygHnM3c_q$0Bi`%0R~$ zPfIys(Hj(`ixOF$vamRe4L&mN9TO9mFE4d3hc0&sju((UPIPq`FuXooj5+6akY;lh z9qb{u9%iQeg1~ynoa`=mVl1BUJ9>x(5^dXQ+|m#^1hd*7a8X5`WjwfM&7_-t3ghF) zE9H$AZ-gdPxm7j?hbpZx(yIQhGPqy~u1?{?g{jR#)iYt_D2uTG(3U<sO_>0r5&woR z$Hoi}@$ua8v<Vm6Gd-N&ItoK)<ZI&1{NA2UIZx=zHV-W!1t#9!lB}aEESVD%u=CDE zypwU72q_yUkwZ_@HyimG`!xdv>%9@T!T%yUkup~KG<s3Gr8vcI%Af+;*Lf!C>mj6S z4FrOMs-`sA_I<RCHckLm9f-Jr?#qaW6@Nxg;EWeN$-;hwp@&aL?=N$5Wb)7ZzTxEb z5g6lTU_YN(3!npxdc#{dnrvHt1%WY+9O)l&dFW%RERs{KO`lBUrmpXrU@nOVLn<%W zh3b5w2_$?Z=p1Bmhe1T`nY{`I<nyC^ry>&z$JJN>r5vT{q?#BlJ3ynGsbf>#37jIr zY3`XJzYIdBEG{4FFaMCkx?NE~ST{y>M>zLFKE@k~f;cB)OlE;zGlz0J{6&X5v4y8z z?Qr$`f<K$1qd68->o)vX0_{)oef2C#N$IS8|0&`^cyCnm9F0Z@em+Jgn64(|zpd9Q zwPvf)s=zg@8nGID83=(4BF_+zT<)XI%_SYmXfsIOHt<`y5F%LK1-%g_ZW=)ZE7m(= zAO<O{DB~cW<rdC3oV@1#j6)7psiK@hAkEbQ1aRnU@jE)bl%>-tf!j4ZIk#=zOe|ev zblBD)rlN;hg>0`8;<2r1dgkLefUT(uD;r$Fowo#hEGKF^%&%hy{W>-mTqr553R?0* z(?`;E-X5Qs9ZUMy<2Y)4Gh*xWbi}c+cN!f|*RK#SIsO&>41Xs~O)4^}2)bqlx#~e8 zJM9dF*Qxjyzsl9hk#v4nYkMA<W6f#jOkS(IqBX?sBDW%vV0VcBIz{K|y}NkEgKXar z$FY_faNWdO8M*+OAuaKJl&`=>3u{>OHq!x)>ea0Cex>Xf(DJdlc={!BGd`L38g{jF zn*C0Jo9S83emJwHWP;bI1(`tw;-QtJhnNIh#=Rk{NiONgq$M5cFzJY&*w9zX$3=1S z@l(bCDpZDNjLHeMz~K~4y^Nh32hLa5DUACt35O((!ftPdojuOc|2)o9dTr~Dz4P0B zR!Eonk^WSE1abo1NSK@cW+oTZsⓈB7n<=|5>A)bFN~ml+pGjC|VeN58DL!I}38M z6PC}WCz;#3i&_(i>UAh9NEb`1&tp$EMxq56ctWT$SUeCP$ZLs3jG&CtbAMlLFlYBq z_@f>oLnt=sW<${fQj<Woq2mU(kW~q{a51`u;7+)fCEbE%Vyky$awh_3t7jUW2mpLU zEaIRT+Rs2%uvrsCAeix3FQ%=5{KKewOHnbiYd5$ivl|JM4GQ;DyXruSO;ZIt!+xCA z{!h#>*;%A!1c;@fZb)aicP_(IIk}jhm{{Hx20Fv`+i7JlkZ0Z*N330_;3w?q=ZuN* z>js;NS<yI}#_uVO#9kaPc@09t@r0rQKz3K_mVD9*IyJf=d8;ECBN|^6I&*3sKCy0v zVHljCBi^ihCn)G**lG|6C@_fA`>_z__ilku6LbgT%J+}-#w~EZx9|_w5X-IGUxWy} z-8~F}dOY;Syaxlr^JX$A!FXqttHOAD?=9^e8#i8gWqYrY(QB~Gewc;@TZ~8<93)#f zyh9^kpu6ILB<g19Pa$xGOGvxGZ2;2=ZX#)lL>p^t9WJ!n-g!%VV^Sn2iJY^)qzy=F zW;(f()X6<I%t1^FmmD~-i>69J&ac#qnT!rBVeI?^Auv^FVPMmxY(mh@b1oY%UlEk! z-rW|d%s2{gMkdq>acWa-7^nm%48Z9RaUxFB&~Pe+V*tbS>6+?5E;QuZV!%Tu7s@<u znrQ>#Xg3R$2CkM5>EZl9Ycz+-`hjwA{cC2<OXGw&l>4_GTRggZxgD5U&-JWg>nW?! z_U!BAIC^lgj+fWdI^}9!T*nDuV^Q^dClV}$V@#<OGs_HLz>#0`)f=2dcrmgBICw#q zQtrQ|njG?fqkeq#A<8+go3r$`erNOi#MHc^_Htf`)l2&n58yPY{8~m`tANBLv8Y$r z0;giHV=FN>z@eiD;F`a5yt|U@oMnpNBK>oi27~9NjSXIF`@WeiNKm*B<OhU`me;yk zPUo)p^w}x1bYWZ{ZCIKr=CA7>&}`-W9uC<#DdaTxrZa{}^R=5jL|TMNgvGNPH<?)B z!5ic7d#RR;w00PYc;{&Hw6b|VZ%hTX!H~OCHXIJAAdvQ!Z$m}W;I%?<^8RCw!#V1Q z6rmiZrR|d&k&6t3m*$B^pq$D{Xma2Juft3s4GmtcaNKM~I`%EUFt7(?!)B6lH_a~y zUmXVKTLmr-WJ!ippoC{9a$I8rqBWh%GfQa+j4L6KNaMw%vc!z&Bprn<NazEaXNyJl zLCEUtF>0~&&AS&=B4tY3+ENF44k>%lhWWAr^p;$y1&Pk0L3cmrIBox<^rqj9Aig=a z#Nv*+oOEFi3EE$n%<>|X%zldVu(@{k?0owwO!bLksWw0_(#p#Vr4ekFEFNihOJdaY zQr6gi)Z6#KS{6$8g4=jv_B17HT=S%$+-gNkw>{Has9QsZS=z~B1Emw-p*5WVD`j`t z^^K_}(An0eF_+s+?W-N6W&zF>a+oX!EFfHHIQVwY?1bdpowuz-)~L+9974~GI|0?E z!ih}<+@P)T6qWI$8Nv2TpXB&{#?~U~$aoPJ7Qydf*bDJW=umCdG;G?+%=HCa$ApuU zvyQYTDIb__uaQs3U-grsOnI87I~Cgq$vAsWJ|ZKkgni?5Cr_aZo(d9vJ~S7vS1Zf# zp;#lwZ`7k3zq#o>d*{HTVHG*0`5LE4*#41g$xpn*yK(NI1F5I-ydS4Ia{A4~$mhv9 znol+}#u+@B^AbJAdByJ)pcbIrL9F)kPiEr5qLUKF;v>&+=%CHSDjDU{xohhb6kzjd zs5IoCJlt8nfl}*Tn>SyZvdG&J!;rx<0}*WdebHz8HD1!OpOyj}1lOL`(RslE`*7(t zyiQRu$63|h4fYpF3neHomyMo9cc2^my3OopFo2@%6G<zJsyL1P5y1hOGyo@$I>PU& zh}{xStD)YqWNXB5hg@OdTg4M}b+<Fl?eQE6Y)B&q1A8Te#3T$cKz>GpoJHtmGt}|J zW?LI=ezqVDRQjZ_DZ@`v9>%y+v)f8VB%Gh9R%m5gZ6c6%1?t!){9kJc2#v)f2R0vH zJcL-dG?&5}phyqnfWGBYiX&Z>U`*~G2PCtxT-pOp5fj?S;8$AobaTW@Ite9T)DA&; zMdVLG;}0xeMbx(zxS#LoH-?Z-U>^FA_$YK-G3*$?$c;0m^rmA=M^}!*D&fHvVj8AQ zEOUp#<O$Yo^%?}Sdaw{qaNp!r&Ord%J_J2n;r<fCX9jCg&@n9#Y(~*>A4bDa38uzw zuyqU14L+W8KetY%;+)J*mKeQ#D%`@TA^a<?ASJmgS%7tppIa-~Nw#5@bNZOsJ<Q?{ zA#~Ityc5V1yFqn&Z)QAo6{CD07;R@VYJ|oxlTiqXEEefh$i;+Q_5Kx|QFca@Vdj*6 z&oiH6rh@Pc5o6e*V=16T+$|?!L{ez9=(cz)2uhNSxeD>=HoL*fs0AXyXPQD;WLj2~ z<A1tXk?FSa66PQfa~`pYnmY&jM~)vZ$XM-gYONOgs%)M`q>@;98oM{N3$2M(_A?C) z0E`=*=)r>0H6}?L<BAi&J6btoI`8*;?O&rzpWKuQcB2S=kTve{#3FwMoW|r9V<L)W zMU!F2WULK$XXNp=<GF<yB39tHxMLuCnpwS2VL7uIu~OPIJCXQung<u&53h&mlj`md zcUBJ4xD)z1SOP*{ZQC`@=3TR>8e7iL=-?V`@A%J5cLE{c1#R$!i0mA}%3H<_1n_Av zeVLm$=()Tu$<cOr-_`f<i<XfC|HJBL%u9_Bmbxb%Q<esvuuwZLg%v@OR-o2F)3d)E z2?q84G^FW>w6et+IR>`EhnHOyG^5<yobX_aNQ)z#BZKh`8_1MkpNcZC7V5>sD`?#g z<~h^?GLA7K`C)jh!yFOb^v8}a!YVrDK`dMr=w`%K#6<~WA^`;@3r-NfYLmC+-aWRw z*dGkZh&aB%Zr^bLj{zO2fni-U##LpNY(pJLD=zcEM|=XvqFqP;xMy1Ufo!?-=xn)+ zGQP3_X(<U?9KyV4#}0%ybbuSfF5K*XQMcL3&8WThf4ABVh{^FK?|bF^$<aO~t<@&N zV8LD*RWju=z8SvZ9KF*T&Wk%&<~Mv3U|9-m01tI@@zx=K@yXQ(qbshyTey|Ys|RjQ zyUhK`-%J0pyST&-;-jqoma74WNe1z0yOS$FKhrgegVYFaC)@zB707Qy0+N+Dmjgvj zLDB?Dh}T3(Qx0ecmvMy@(9jUNP-3zMzr#inBY*b0UtC2FxD9;Q^z1I}4fBkwLJJni zS%Ue6OGSkmlqkAXE!cRS*IUW$y0(PFLTy&;k+IZ#?6pEQmA~UyqkTpsx-^^AlpvVd z@2z|oYc0;|3H~mv#xnu2&~29*uh3J$(G$9k{nTwP^YD<Pq&TKdyj0lwY?TkFU0oec zIUKXDt37c5X2g!p?bj9Ti|KX8vF)%_=~uV6Ux(cl1Ovr?*!FjU&-RRInL;|9`pRwR zOjy9$IUy`fN8?3j@mnjEVxK(4{N!%P3lJm^o3v5YWd!S-KqB@!XuK+1bKzcDsTScy zlyabQMRF!@&g3UAyuiXXuOwQS@v+S<ZVhoV?pkbLlSqX7(c!-X>37XZYgG2#?o!4h zD@wNeP)<7;&PlA!B>>UH%n_KjWqo)Mn8;ju+zgZ+XANINmxs|W85^n0p+IRfKW?l^ zQm76(!mTEj!vfaU4pAaqeHn>0=K<iOp<qsm0)m#28L}Wn%`>189g|gYoWizOGswq1 zopOAddk-(ib8>f+LAlq!g(8d;Ili9Q77xpIL~R@E+F3g6wh1grC#Or*2YM$HYhzWS zvD`~R+Lul~C;r%s2~A_4xw*+z`2)<77rb>HvX9g<YKXP^_iY!2t;jtlMn$|G`hh!2 z`uOD{=<PtSNpRznuH=`DWuuiE+~jyu1z33$EA&G+g77RpOG*L4;4TdI4oR=SmL{yd zMPvpiU&h8e^`4=)Rd(G_QKi9Ekr@oXC^08eI%0b6fajla#q_8xSmx(sN4rZaOhgfb z)Xf+!cZ3ZV55eAz9x|Fz=%_vW=MY|)XM=qpF{TcQX6&{(tSO1qaUo}8CvL4yAkS94 zR<G8YursRGYt{Z`6~>2KTt0ECIA-JR{kI^N8P|}v1fpx5c{^f=VA@7^$BLQ3oWjoq z`LC0~5|cD>2#y}TVX@B$?@0NLfDGBo1zv}u2*f5>@{NdU27+LGfc(<!_(F6W516;& zF?Ai}s)%5wkI68xf}9M~c6YqVest$D`oDkVD8lv8gNV_hctNva|C9^UA5J58>KM}# z)Yjo<G<7Xs$0?1Qp;2cb;nkTNlqvuWFXKvbdaY94;%WU=xIeYqmny8)h7FIx^+#{q z_^31*_oH!e?c=5c*9{WuK1E!h;h6$DbL_~Fk|e*Mmd>a%cj{6_Zd)KFW?|v(*@Apb z6pQ90^cYH$-+2oXnqt>rid{<vH)W^6u-TEF7n&=hX9thN<t3+5U!8lMx#*Xd?#L>e zE-Ge&1vB?Ny}q~4!IjsRf$5+vU*=A3yOIn;m<GwPi|2q)>6tWAM~|;?F1a|~Lk>Ny zd&n_n;oudPJ#F<ISC)}06>2p`Gl1B}=wL`~LeNwl3^cNV2zL!bJD3<i_ie$o+9yrm zgG3i?B(g^om}vYwqwM93+J>T|GLtMUBUeFPY?I88N~8A3T!F{`2s+P;T)DPr@#*!o zF(nD^9RCI8SWW;=0}t~pMwfJ^wIM2s)H6=qR*eIR!1T>U_O%&pD;fgSHGb91Rrsqe z?!WySEDa7rO1QL4!RdIXw{)s-)TbMbngn<d+}n2VWIR~7w!9+IoTJ6%H=Ms22y)Zv z24<lVuhNXQS9Q&`3PGNaw{H^qoVC{~1*|P_kh1g%a=SqVR>e*bx_Xy`;>($X)Fz;O z!};ZM<D@d5tcnAQO1PgvUpHgte31$}(52HSy8UAef8k8?AyHW4>P{#n#<R_V$=evh zf++i1SV^9`gGhbHRTOiEvzVK)3y|!N*x-F^`zHj(POcj$sa1v(FtCnnC%k$4YTrL^ zM1lIN?I^Ne+emlr;3kb8pPHrlAPx?fOBUyJlc_wY^FUPQNs=ezWP-PuMBBO55-mNh z7VZMrJLD=-$Y@gn|LS~0;9Z5Wq6o;5z^lSH_{+eoMT*Uuxl)y`Db)lg^MRFvK4q9C zUt_{Bu)N`{VRqfqQygJlQoCo5<&-bBE*xbZ(R1O%lj`0Am%yLaW}EZI+I92@eSano z-PAd`j2U;c%{g}u$MRM<yS3YpVK^mu8)2R}C*6JLYJfmeoQ_KPG>fEAbMP&HXkn?p zavY&D5M&B+jxM8NK*Z5wvY+{#3Na0VrOVHHXt4{=iuCk=b-+$&ctkaVixqK!hk=f} zJW<Djk;J1EwuB~i$j&)~=SC)~v~LTWt{s2;DQ!fy9nil|XGMPdz|Iklde`ILLM~^O z&Mb^27$CD!eiz=p+r`*f<-Q&-d)bTH3g`be7Ifk>SP2e(Gt1-+SZ-!_00?wI-loz^ zx1cH0Bst_xl6_m?q;XogG@>AL?!>3ri`*<jZ&wgm*cf>FggG0RX0=*xR3R~dTX~C_ z=}I+=ejq0itX9~ln;6(+nda+`MjVF&0u6Mrmcv}B!exVr>N}GI26utzfHuP}9?&Kp ziR|p1#?{*o7+DW93rlmNH52q+nYaZZp*)SFKt^;yteY(X|7PMCdk<$w5T8=Ry(;H- zlMxmL&MDzM<ehz`KcJ&mGF=YNa`%`)_38vgne-a5Re9z%zB)g>cWM^vai??IFNEAD zxh!7p&>B40&MfQbm>myW=1?s$jy!0Iv7Fb;Q`Fc_Lfm`MgT>m56>X{>lJ9QDM8Y1_ zrK_4wqKQ(YR&7-)wPF)&PqR@2v)80QGrwyBBl_bzFMk&~-ROI;cV@*wXUf^F)E;h~ zo&#?OUj$le7?ZwVzuhXAE0spMSgAK_)kdS%EH<dU^t*8Zq&()g-c9nOW@5tpMXbcN zQhs__|6(NTSC_8R{pvdV0guHvM^FheVtBa<kq2JHCj6dha;)$;#yix&>>fLKav3yQ zK?wCWEqE3zinkH#Vx8cCWD(s}92`2@S=qSJWgT;07+`Zp9ZP-WuJr5*Cabn#of!>I z;dy#&Y8g9!RrGC6R24@v<x{z!jkYWKRDpp@v#f61`k|q3_xgiHMzKeKdw$NF!B!Gz znC6)d$ixO1)0Cv7TOUNi>^?fguCbBk38;8~&F-H@L4~~rW8;@-SOrw-bA!kE;SzsA zVwpZV=5<j1jdxa7mO$uWhTxCIh2u!=+b-y8x}j+TtUg0v#~H@JX{a4rO7A14>DqFQ zwl-$WX=7-+H;~V_&1!s{K+gYA=fE<K3G^ET+Z_3#jkQHRTpgNU-{M`KBib%uA!U>* zsUNXPp+9*1S`7TyPQ#v%N`1#p!syITCR2sOxJl<Qw~l1bj#*fW<F)*nb1OlPq{vO1 zKZ(tE8D?>2kf-dEHl<wNxl+xgodc$`c&D6b5eQ>{!9R_4D45hKT*Yu^#L(JRR(s3E z_13he2zD^hj?P000Tj4(SrBtPuG4@Z4t=o<W5IaerGwb!X{<YtKJHY5-O4tcQF9C> z#nY4I1I_DUwh{|QofQ|Qi{Rzwyi_#nWrKdBKY&}rJ2#sp7Ej7iX|>{byLwdLh1m@a z>(7z9JhnYeJJ&>^85onuG{Yb2k;*BEp8Tt0dMRE9Q<J5VyHzraQpNn#gNCV8^r00g zJjOJgncWMIHTl(t3G95-Fg%n^aE5yoZyGGKR^Zoh-5X?M6thWBneLq**sj*Df)a(6 zCKV`A8kI8K-*BYV>dj`O0Rtu5H((ZEK}U`qKeXI$uN;JZ4nmr@4=x@!Sa1PJmk?SO z-qN(O30s~SibUEpKLpyK&76)N7kN4e;uN<IYgNQwv*Qo6T0FmPlJn#Qh0{(Q>%*$` zN+rl^LpC&O1e~t1#q~<fB0^ZgZXxhsme*T3v5YYEh9J|e`cy<8<J&ol_Goap+uAO{ zw<0-jVd+dlhXWD02x&Ur!td^!Z(C5^b{hpt6dFQhwGZ-4u`Msk_<E`c1(ETn5_oo9 z&cbjb%I;Z!gp%A5ZA;tpyLOwXn@k2u+d;89I>%*Z@VWwtA9Vn*54rI3iVvCVpcbt+ z;^pBihunlH*bsWl2W_O7fwX;@!e--p)O>QxD^s1Ch8!X<8f-SW9$=vb^Fxy8*T%LN zi$?}9a^QPz57sQ&grNDsWW(&<f$W2pSOYXeVZ2O5EGLHKAdofrxogQj!z)8RXwIO{ zG~fP2$01Ci`;$=$-9q#Vr-Bhl;`Jb6qmdN_h3Si!?FolL6eu(q({TO;?`v^9Qu7W` zJ5W`~%guA0*gaAafsvQ4dvR`1t1jhd@x&Ug*XfI4`*S8TlaNa4r{dGc^QFwZ4mXLi ziCpnVfqz_HXgj@ZdpbSPg7V3}nwZxWDMZ*C8F{@IqZ7zgE*@vsJTn7wcpgp@7~Y7? zb?Lahcz>wRqv>*kv_0prTCd{HT;>>Oz=^%5bi9SOE{-SX!q(=(VB&$B6@Kao+#h;- z7(J9$oq=XhsKuG<Cig&*V<beDZb);F$RgS@So)oj*6N`xr>4W9yL)zTwh{9Nu&A+o zVk!NcwP-fXHN{b+Cwx$#GGyFdD&gz}i|HigTI2b{2e6E4@JJ5R#L<36@0pRA+jx1H zVIa-V&@XPxglXE<;xqItYxuLw=d;pl&rv>wb?J{}#;%KmNho@bpD#8%6A;ogJJP~2 z_<MHB%8P14XdQMz>4$^3&^x>^j!nUn?S&kX3>M@tLW_}J=JD5Vn}4a-v0~NP>9qr0 zL&HNxCG~ylQ}N_8@sunY0fOHZCmPLKrG@mgl}Zaz3WyO~b<r(ObM1mIyYM7s#?a*! zIx9UJhLqNPZa*)Vstq(yuf|S2@bjCYbJI1`P&P2mfXR9?dLvCm$d+wEks@5nGt-eW z*u4WOGk#g6$k;VA(?}ACPO}h#hue$&exGuC7!fWGPL6}=SUKv7_#5Np4`CcJ&P##@ zg)mx-4Er3-QbK5LbP&QS6zh#9WUSDyHfm+aa{TJ3nxK_4JMD&;eb)vJqX3wQgkuLY zGnn*Z`iPs3HeVOLWM+8}vXv|!UR;?zd~D@p)>(Qya&*qzS<72Gjv_}b)Yh%YYD`aO zzxm>#GP)asyvAkdcj0NpOu2{@uLZSQ+Y_z55cfhG3B2eiuJa4R2by)t9R`cWu)y{h zTjWj<z_Sb;ih1Z4U_=w=_z1;ThI<JkRpMJ{%BBkEkUz0;85@OmG#G-Skmctw{P-!J z?bxbjX17ul3%$ma^P^T>`T1tZ0xy>G?L{_e{8q4O@%O_q7kL%pphv{0#iOujSnRFD zMDOLH*YQ>g4vBZ!P@QN@SiljlcO<<8niI4i4>xXCG!i$iK;$l>nx=2<`9JtJuEGD| zYTEM|V+qM?5n?ZvIU2FgfOt3|=4bXtOA%`Q#S>{;kq7|~EWtdY^h2g6s@c``oi#EL zijC%64I6b0<_?T&^F#6iw176w3D6}SG#)O@D6t2U{0F-sO=iWr&ImZj4!c0~5Z9QC zt?aNit<oCN9BWg-T~=R3of<8_AeXTvB&)pWe!4tCLr%k;NHYi&MObv%p?6~Dp+j$+ ze8xB>WF;GBrNYga;!Up9IEH@yWSgEsTD+~`^x;R#b&My*VkOg<^=YQvF+Nto%rm3+ zWgn;6<I+g&YgJ()uO*nG(`E$hO;k+#Mm?I_j1;fPIUUki$-EBzCdLf`8t9Boh24Wc z;gEoL8QDH^J8+t$f-v#Aq>23YRW#Wrl3~HR2G0(OBmO3XLOOcj3F(0->2W6m%}~@4 z2evAMA0^c=#ScdnLbhJBV^<0JH`jJMvZ=KCn236f^U%E$*E0=9Dlix!Kf;p%qD{nE zhr5hLE7Ozh-ZG7;kasl$YvV>I3U8m`53NB6@9czN<DTiyC_1@)2F78BNw#~Vt=N0s zik;s?u&?bFlOu}9T?%oH){v&u3!)Kxe0nFa0JROq%TledU$V|wW{;MN=Yq9Zco7Ri zlQD6%yd#~3ZVxOIp404HF!f-`yL%FgD;T;^IO!(<7}pF@&Y8Ek+&OgYU<Y*Qu=JQd z=0rGdDJBY>&#<JUV0ygnmP+cOt07vhTn)C|+X!)h-3wA23~kuFW*D`OEP+c$>h(%d z13B(Mhy1FY+00#hr%>hsjyjWa0uMov8l`1EE>}A7!t>+<8(@a}2+Fa>CX69@>x2Cc z5)B?mUn;vJyGP}Y9K97r$pz_fPh=A6tXPtZSf1u$iA&h@_4=d)Cy@i-nxJT=+$Qr> zi_6E5W@%)K)ZLPcuBGseo|VJLPx$r7AJ#=oDkapl?}FZ&Oa|Cq_$6U$nA>N3eiR_b z`KxW-opTgs4Uv6_n&I*ew88WT{~#y$2~~E@<}z7}#RYR>iBTfKfq4pR;UM^wlg4Ic zav(I}fnx&^)Rwua5vwf2t-wn&Ew*u2yI}%>n2`QuFiIBkhSVf_0&lstQy0ZmGbSeY zj$Ih(@UmG~f9G|-7Kh(0$+Uvs+{#DUQ-(1+-V9sG?kzKJfn!Gwg7`|^1#pRFV%Rb$ zbVL%6R6`U79xud%8dJd%CrCNnmg;2rag4eO^RswL0n)WN6E`2tky62=Jx5B(vOSPe zE`O<%+0YbOd1I1lQ85aNu0UqnqAEBeJy{l^FS^IKEq2>dr_KDJB8b8Yd~!1^JS08) zp2CO9YYpmSaNz9%`0`jE=<KOR*i|4BR$+XkWrgR}Gklgsa^5iufqx5%>Qc2;Zj~Fw z8YKQ$>PR)u6#>?)46fL-EvbzPuRzI_Id~`rv~$@`S8TNO*I`tp-J}5-U!hcS^NrtL zQxTroz}OZSDx^r$*yzkEQ(?-myBPC0eKqM>BR09OgQ3DB$Glw{XChfS8U<o%BeUH~ z{|J*9pvT8=F0@S$e{{f-otg}Td8PaNp#?B5j7Y~KM4JycyJ!-fCm`m%q+@~T5RMM% z$8j9kb;KUQ258QRE`lo_FWy6<-8FSc&qoq4a>8^YPFQT6zIB`C7?o;UAXA8=wEFWe zTXR*+)>7TYv&HuBmu6NxMaqwsRyu7WY2F@COw^|vN08wo;C)kshc)74B7_S3+8d?* zWz`y}U<{)P8=*19SE28+t<9NGD*1{@-08LNwyt>!v@M*#uIWki0>tq}Iy*6(07)Bo z_nwlpaYpkLgCVG;se;3X3VW%!Rgtc}r4&V^BCRMdb7wMyXBMw*zR-fzucfd*fj$WH z82a>BHDyG>(VJj0c2dmlI7s?S$Hz}@L<aATmjm&x`Qe6=k1e8i7hw&L#KnEQ<Vo1W z=O-(g$J~R6=Ssu{=_2dzG6iTB^2S|1|4R6Up)D6tp>Q!(>8S25gQ&E~IBxUI8%i%8 ziD-gIoRc#)3RzN8VTDn_L3zM5e(Z3t3e5r(sqJ0U`xv}LVo6Ydnp>nLVBBeh0yZ9s zl)(^rt0gJ1VpFE90t>n;QBY3Tl&7KGF*=8XaH*UmaFD<voj-bfsoP&VS=a(`?Pdte z4i<Kxw=ER?M6q^RrM0nOqMKy0o+L@9-&t5p)@{O{w`*KBncV(PcbGhL-5uB8Y3%HE zcR%Bv>&{(w@3H%=yYIUDt-Jr&18=`!-G%E=^KAV4E<Wp$^|##l>~oU)pzJ>@sId9Y zXFhHHGuLfC`>Zp<Jzg)OQhe{8`qFD~?~8WtjHj*Je9l?P#PZ3*E1d-(l0O?B^nWe& z4^1Fz=t?rt>#TH=iG}6mWP%ra{e|NPpk^E##Vz~0v#@|{J-&p4Kdy*mGDi;dGv7Vj z=`P{RX=CsK@B6Rg_mc^lO7=k%Pav|xL@*-BG%`TG8hq)%5_V+YC#QqIi%NHkDpv9L znfUiA{CfocouPmEdRO4OuQxfO-c(d?^N4yoqIz3K)Y}u)W81@?@A|0T^oV-BsNU8Q z^$tb#wvDK_64l#2qTVf0y_pg9Zj0(YazwqSNA<26QSW(CJ@)yq{(EUuZ|8`5uZimI z8d2{}QN7s_^?o&~w|hjrcSZHC9#QYTQN6hl^*$8Un;%i{V^O_5BkFxJs<(GUz0XDU zt{GA9D^b0DBkFx4s<(ecy>CbLt{qYD4D6A9onJSi-q}&TM~$d=z@BkG+O)qC`a zdOR5X^ZnR}dYhtp?Gg2=QN72EsCPwFuQQ_FR8((aM7<qRz3zy5d!l;15%sQ*>h(v| z>qYejBkCQB>KzzSkLRr)kAoxX-4fMX98vGKsNRo{sQ2`!-VGz_Juj+vXhgl2M)eMl zsP~$v-jS%@gYY+QCAY^ve%^$_)7QJd`TsNY=ly|q)Zc{nK4YEHE3d-eq+3{z{dp1o zvAr?;<EQBxa7DYvKQF~U)<0FfD(bL3|6zMi;1~7r_xKF)^L+!)cLH_!d~Cx%-y`t1 z{|^34e*J7be{{kB$uq+L&3a!vCrNJOANu%vT=V{K-a2&WBq{I@ef&M{UGeiBdd|A! zuDHhMYvP}OzGL{?e+PdiPe*&d5sinx$2k$VcMID4Y1CtT55d1x?Wv7v5K-U011jh< zti3ayzb<*jom_iYpzg5tChzNh?^Nx*=H=^>?Wn}(d)SEfZbo|(zA@mi=lcrU<CwF( zN8sPE=X(R%dmirl&#?B+d&RosJ*dR?Hsjy0_O85NV&jG?_8HdRC()iC-zn4_*4|FE z_f)k-7}nlb(B2DipU>y%KQ4nXU)H05&!3;>^WFB!^!Ye0!=CR8XzwA`visk#=X)O7 z^W*F3zqOvPfQ^LojsFa5?~`cnAS&^Fci`W!=UYO17~=35*51^s))}wG_PDl(wf8i% zci1<Adj8M+db=L&VMy%xc8_T9-_AR|`SR^or{m%2zqR`B%m*aNzu@=$XV~+djSc@k zdcHlVJnVhHgZ4J~#(=}xyYRK^l5yN;|9Sdvt>=5t1C!+0r_tUHwD${Y&(nWvwfD<t z?_Q_T-Z#+RebnA{z+vzE`)Kd6{v}b*|Ct}(vtPF^`E~W5r~lS^zDD8n#`nFiPsjJi zMm*m(v{%D@{~7jtA47XQH#i=T!M|bedrRT;`tR&tNc(SLM0?Lcdl%ro{|tM+3(?*< zD)ISx_&4nN-d;Gp{@a1}{C+wZ(cb&e9+q7A412!o(H^SW^Bn{Zd%n-0(wlJKe}=Vp z3)=e|RO0)3`fsiI@{IG7<l5W$)`ri&>)(L=^!Bbj&dp)Z_l1j-<Z{&WpJC7Unzx`m zocnyfBltJ0y>l;f^wO!?`^vAaOCEtrY>#Kqu=ZxqUJ3X8XV~*?dPh2+mr!|FdyhkV z-}OWz>J4kJhxUFMjqv$aMznVl5BJj3=)ZfuYhCgO>c1ODw0ABR<xk_j{|tM+PySxI z|D8bPVek7gwD(KCG2pQFZhLP!{~kA@y{lTMcmDR?m!7}3jA-v=Xm96fJl}`V-hR~M zc>KhO_WmC2tvikJz3}%z@1h>td%}qJzI;WJ+`)Gm>iIwO`~90ffc*+L+1^i%Xz!n{ zJiYz&V}F?Lr?-u0@63lK$<4U$Kf|8yD`@Y9sKn>{Df}BYU!H{a-m>1eHvD~W`yifA z{m1z_tiAGNk`&VBhW6h}|0vy0e`Z8`b7*hFX|(q)v^S1=eBY;!Xm17W{nfg(LH}od zd_TwML%*=SXO3uZ*OnxCR@&Uq_dVkypbt=w?Xmu_{`+gRM>(DU412zJp}ohT65D$Y z{taudGzFd&_x)#Bd*}V>y5#Gq#P-Pl3~TR8Xpj4u{|syI?2o4N@8?i?SbJ><v3K~! zfWz8*4cdDQ?(_LLuYG$@#NYlq_%nGU+gszjycPFi{`ZWJtqby;7vr99?-}@;?G^El zpKpRWdFDORU*KQ-$7hJ^J^9Dhtva`O|CRVR=8io4l_bB0dJX%_{f~9{c{~33zghk| z>OF>k=)>pZ=dJh`zsK2l4?ZjV<>mP2-{Wrh8^0SqyW8uM4}?<sTl~%S(e-zo#P8lI zNnVX>ufRXHcUS!5Z^rGN2LaaWq6dke9aY08zJ5mXkKYY9@W)u_Wp{NfDaW^QzmnWJ zbERlH9m)XRr)c*noAYJ=7jeuaIq8+Lq@EV+emoMa-^|^QIa%K4Oi4du$xH2d*gx*W z5lBB{2@aF!GiH*E^uk#3h_rye#!QlsUK&fL(t_RJnk#S5l`&bP&sb(<vHe}qU6yy} z%H$-|&saiEF#U`fCl{CZrv>~qmRy%BU!N<JlSw~gnHkRSFQhl|*O+kv>7}t`kQVIz z!Cd*rb7k)8>1WI+*|>ZxE#R-Qgp_3Z88b>SF2_3`>z_z(;;*sfak(-nq4YCmluTTH zLR!FIV@64&m&P&@MBe8~o_@wMlq2u|OnMW4joC?<UK+ELEG|DQEm(b?B<W`?BMD=B z+{x3=nC*gb`Q^zy(<1&_mpn96UY}5goqooWm!$>#bw={xO!;=ncQWPMCzpq{&Kq|~ z9+N4bnY=JlzGDKiFZ$dm`L|5@tYkdi{Gf^7pDCY{JT+6kbMot%@?DZIX3BR>?j3KE z*d4ZI%6CsrWXktQelb(NXYyB>^0^6A{?X@N$wM>cdnbo7<@+Qr%9QV${As3qzvRs5 zY)q2-Cs$<3=OvHLlpm11I#YgN@`+6OLCLwdj~*{6BvYC4`N{E2c|-ELO!<Q36Pfab z$(<uvGqnTLnexTSt(o#A$=fpJ@#G7c^2X%cGvnuba59xCUz(iEls6@B%9Jll{x(yd zNbVM$dElhu#<4!Kvw1A}`P}`?<U{?;<Uu(z_$Xxt59LhfqnznHlrt}na^~St&OAKI zIOwC#SaMcW;(9+jS3W0K&YsR=$z5{y)02@m#xfQeEZ;p>{~oz=b~hPI&duGwSFU{T zT=_n^axD4f@82(XAHv+|GnSDIvHk<1yDUF2SEhC>{fuEf#GkR`{J4nkZ^)G|$dxb5 zl`qPbFV2-O$(6@*<&C-WgL7qS+0xHgvMDX#ud(E^TzMi_zC78gDMp&??x64XMpKTn zVF6|87QcwUdH<H&{b!)e?-q6crMde_8ognnn_SpQF6<>Y9j;E4CI*#yuhCp+w8{(B zL5Wehx{Y4HiV(VuYHOj~wQ7jnb7*m4;^0JcqF?G&Tg`s00cTY>$PT*r`a-{k&}N-F zyk|RBzw6S}9-JsOVdYgWc8c{1+V5821yt=fd(A;<(C^n;wS|Rh$-aRo_sfg;fpTS{ zRqOTp)nW}nF<OIurL$14)H<bBX<?yJ>2>RMt537!qo`lO8^G1JRO<Emh^EmgclzCO zqf#p^)S8`gvp862`TB?>gfEnujfqyjjtcdK=0d67hgoj7RH-3D5F!XyTa8NJy#sy$ z(L(tX)rm@{jQ`Lz#csJ(S*Y~N{Z6^xY?YfOm|^zaBQa1>=lCInDLZ+rzl<-|CrZ5q zRIN2jgC1U|Sub|cZH+;>)Psj`ADK5f2DAl7?eauxp$pqiq$#SF`n7(!(}I8L0(!Yp z?bMsq^s(HFRH`k!{h->dEp!Hh%AixOH(Q8_v4Gej<z}zb>cah)?JxCVEXFslPYf0Y zExvKFYCa=<n63{x&2A4_*%nF|RjcnGA45^>wW_Upv%av<MVx|C9X8DMa<4k*lm^Xa zb&%`YYH^~A_RIZ+g?_hMEiF_!-Fl-|<ai8<NWRot$o{}Yzt!z`o84Bivw$j%Mz1xf zwp#sSz0-$(1MC#}{Qh~G#fd?AVbH_O>9+=mJP%LpMzP#2HU^zuYoXSMaWw1usZpM& zb~?>Qx!Nc<%l&Sr-fd#C4_du`rP6Em2AZqBdL1*bTPqH_m^g!SYp_u4b_e}lugjIu zDs^kErf=S@g;Eo71`)%qg2C-BG+Ui+uh#4q2Y8th-UZ$4`X4`_saG#eV5JNO%}%RV z>y=;`*exMsb*YD$+UeFBrG<h0MCTCZL<d9GoahZO=NiQd2D9I-^y_d<uQ$uJg%bLz zU$47Wj9+k%RBKLD5Ec!N+T9L1u+plOup}{TC9LFT2Lo8sJJ2WGexN^SRqLHz5p%DD z_h>bW-3msk+ba#a)rF#83%-7R0+rCIgF&s_FE>hMOxYUNTC-E^4=NZIw_(6x7_GM^ zx|J#>N~yU}t5z!IPOnoPG)k3)R*92!p<J=2IdKeTkca!QvR-Z<vxQTgXf}JWlJE5J zL)cl$rShOxuT>fY405+M&`gcK$obuvD3{P`rGc0_n9cQizuqlXJD9|nyf7*5x!yVf z(|<pwFd`L<_d=(LC#&Es>S(-IELRW#pw{me%kW6%oZ@$21l(WZLaMbU@B`&at6uD5 z^T5b8d)0oiTk4i;-D(S6srOo5>8u>*3)QfcicQR>dcQKL_XquE7jv^*UFad{ZLQO9 z^xe3eSn3}@B+Mn4mUdeB9v%<F-(RSg7n-#OrcJriT<G+h#qxk#_Ch6e#B%?5?<gMe zaQi^F%WoDZ7Rs2t#eS`a&8<@{RS-|ATE%KBH_H8f8A-nQVis*1^~)23KE}Mduu#Vi zjfsNMEFp+N7c-)P_e91{tu1Ye*mpa%R;g26DD?)dKHA5ktSvN)t;V2*M{K2?Z5ws7 zGSR8xg)x5zwdO*(S1)!tI3B8%ZljM$y5L9WIDGz(Ew>Negr~w@-S43XTAe|ovM|8v zD%P+SVFzAlU_48mnp=}6+?VhTgeI84u8bv#7zMpPI=PH-ZB%>sB`l*lLKwKgfh8@L zfbziMi>(Pf26i1x{yzGuTCO$fSOR5iu;pT@USDvVJSRfm$Kl1-8r6wD#=cSO4w^Na zp|u{SZNJnl^#|DUntqNicaI-{Q;fY<sfdlBSgPPaC@$c;HS99gL4RR@Xiz2WiKY6$ z?UX0nx9~gVQf&g~4bHlHtH|!aQfLl}n1GlT2*}WBG+l?YC)f{l>}D<ObBxr`s+7Cf z$Lft%bI_@FO5OgTi?kgaP$ru~b(|%&UZ+v2*KoYGDvbs1f8~WfCabMGoRDrE96*v} zKRWd?9*Mig0FO}{)G@V7n60fIwyJ6q(I1dv%NCFO5}yiZ3O1(Zpo+n775l{={9^hG zmF}R|!3oqYV}$K1ARty4^c!0OU%okk{j}2THj5pccAZwE-YD05$mxeeves-hD{dMb zUs*iF>J`kI0m%_e{DpeAifsTZxm9XmFQ`|#9mLz^b44@}J9whguhro{Q^&qjtdy#l z&8^Y^dwH!>FD{@<@?o%+;FQQ{QElwk37#1F%2(Qm{(m?d4;-<j=3IR6-JR|Y2tR(q zBC`6Res7V%oD*w?*Fd|S$A7PMvgGq#l_Y<`GVnamcEl@)uZAp~_*!RAwjQ(|Iga&U zD=5DtlHw<la$mnbF$$b`KFeT7ND;5cmq@9yUPbs2;iPc8@EYNxg*_qV68t_TK*Yxj zZxfP}<MlTQe^dAe!ao;&PWVqk3U&FtI}0g~U>V|j!%qpnEW88WjrZ>*yg*nKK1{en zc%AS@;cdd_3tudJr|<*9j|;yb{CD9Uz=HDk&lO%EED0Yj+$nsNa8Y=Z@X5mG3ST9B zv+y^B?-zbsc&9Vm@83sQ6+T>eRCufKX~Gu^Un_j8@ZG`>3qK+JlJNdusrkMa3oF7& z;jHim;Ys0BgwGdJPQrG6Mff|yKM{Uf_z%MG2+sx!&+pw|_+Vj6NS!|K?-LG$l&kRi zZNldYUnP92@IAsm7XG#HtHN&!&w}WH?cGnfQ8**KMtHsO01<QM2H{a6#0e*L|0%*( z3xA1-`oALlH6rT2NB93k_zB(rwD7Y;)cca|e^Yq7GjScydk^9H!pntM3a=vKcV~qM zgf|HB`pJ6yP2QCCFb!>A!KGw9E>Z%)-y!EuyjVCv#3t2Lc~W?l@M<E&8?<R(53z>r zH)yQSGB&kCs<%Rf7~>~Yewy%k!j}>u)_5He;*2-zI`u{Cu_?Zb2r<U{h!9_Vn262S z_9Hy>Cs~G=;`2m^C%#N9IGZrO&v#h{o~ixkZp8Dk-x4>#c1PDY5idxRGV#JBc_{Is zB-uhly%{1p=NjTAiOFTz?hP!DI~%I?8<XS~mT~>bM2H`LmUwBByoiWRoU#Glf3uJ_ zRqG*k_#NUzl6*+lq4rAFL;Pm@CxiuGU>WUyl~_uWe<qfb<ll)n6gal)t4VSW5$)ew zNF6WB8;LbY^oVuXR1u*bdMFWtJWWJBzwch7a$9(i2wQ|Dl^;jMA@l?ygy27;>n{+# zjCcjcm5Aql6Y)x{58}h%J*IIvOX$x-O1StOem-JI-17@5k>q{6iXr9iEKdrz33m$T zh1Uw(!oKhZ;bVn232zlXN%&OZ&kCO}e2MUt!q*G^Jbs(Xzaf0L@O{D$3O^$JxbRcL z&kDaJ{F?Azgx?ab<2*n=(6)nkj*zNdmTkTRAEfd{!b^oEVMBPO(B?nBXY(I8tLuA( zj}mr-2ZXd4<?k*FPYNF|wDp1ePgD8X!WRf%CVaIJ=3mwx%(e{QE_|oZ)(_fyzsesL zepL9E!cPl7FZ6WDKdSsq;dg{%oUds2j>5YL&lTQZc)suw;bp>#uqAxB(66_vRK8lc zPxxqISGXuVDm*T{S@=ZZQ-seDK3Di6;md`u6~0mUR^dB@za{)Vp{J|<Smi$xenR*e z;ok|rD*R`mr@y|d^6kc4zn&$$n~?e?_V)vXo<7^C^5w#s@S(y<A@x!GzNg>jRlZi( z7WRcV2p=o-^xds0KS}sh;m-=6FMNscmBQBxJstQql|4Q9Zk69B{Gjk7!jB6-CH$=L zOTw=S|3&yM;X2WKcMzT<yod0<!UqX25?(4S2^+#Ig<FI(!dc;7;iH5d;Q`@c;j-|g z@bSVY3q5`NY?WUie3|go!Z!%tB7D2>ox<M{zF+9+;g72Pm%>jAKQH{U@E?WW6n;lI zhJ(u1zwj=?bA_J1K40ZagqI0Dz1>pz;lgR*Rl=)<`-G1cc7=<=qr&6Dn}tsldb<4? zDnD2FBH_!0uNA&g_*UUNguf;HJ>dt0e=Phn;U|Qj5&oU<tHOU4{=4wI!rOr`Wxt*! zyqoae!UqU15N;IGwwK?l2_Gt)6mApl6wV8;6}E+a;SIva3U3nLDtwagsluNXK416} z;VXr&7rt5eHsNmw-z|Kf@PopS2tO|Tl<>2{FA2XU{1@T3gzLmN+(CGb@E*eZ3LhlA zNO-BRBy0$;6mAiEK516vy~0NcJ3`}|Fg}M>UKV=3>G3K*S@<;JvxP4ZzD(%(t2e0p z7UA24?-c%y@cqIM3qLCSOQG>yc)ri8{AJ-k3IqQoy6V45pJI4yzMdlli)7{d3pWTs zBHMK=55xcJ@BXOh;{5Y}ukTO2DAzYw6GN~HhSS0wLQmIUr*cPlP<T{$qtMgyx2c?e z&V2d%<wt%{?VM`-hV|>P-v?`L{RkG>@M0lYPb-6UH1xl_S>+kwZs9)Rj|uxi&+jj* z{5atgg+DFy{L{~={4(Kdgl`o7iqP{-?@{^v!aoxJnb70_m^YtQ`R|4QDEv2}mj~Ql z^u6bk?y2(qg&Tw$h4hKFc`1CDa9X%SI4`_T==q|9D(A;1U(U}vh&JqZFA_q8VC9Ms zEVz{?h1-R*!fS+&7WRZU2$zH>g-;MZMfgmi=XYPK@~efvD158%*M*+X{e6``Ec}@8 z6T-h0dj9t7Dxa!f9`HTZyFm3JlCl0O2_gEh^23E&g*%0NgpU#~2p5INgkEm&6DmJh z_;lg0_ZfEm-uj+@PyhV>oVZ-~YeK(n{XE#F>;66be)+x1L5980bJhNfg|8I;g77WE zUlab8@V&wh3jb92m%_gh{+;k2gkIk9ZI#Egp6(<xxgOU4eN^^xj*C^kOjs3~d=K?E ztL)_)yH(yNgqga{kG}AbFh6d?_T&5OdGqJIKj-r8`1L>Rx}O(*U&z<XmwkKwd#Aep zqn>ZKs=uBje5%l&8-5>piLSp=_<G_0^!IzS-t%oje?I#C_I<kU*Vji>{<!c{!p{o* zzWX(m{W|-W%Ih`X?<l;h@ZQ1)3NI3x93AVbqVhw8lfvynFGn<aI_f`K*Ly;ftK<5T z%3gl>1eKp6e5MfL8El=tROsb~zo_zCg(h!DyYE)n>npvy(B$s8{|VjyTj7_4Ul)2g z;eV=pyY=q(&lcW8ct4?+57Hi+bcD&_fpwLy6ix}fTyRe1YlV*y9uOW8dU@b2DnCi+ z<?_!~`GrC+2Q>LSp5x8B{;R@w3V&DV<$r&o^2ddLE&ROjD?%^#`wx}Zjk)(eQ+OBQ zy@X!gccIFc3d_Ql@DV~U=i8<7Ug7n^uJFf&UcN{BboT$_g+C>HhVXepFW2*W-8bm^ zFALux{B5C^=Y2@!j|yq;&foit@QXq($NN{6zau>33|Idw;oXH^epgWW65)ifCcHxE z<#vx$`D)>QVOuy5dU@T7$~OytQutKivxHtw_wy=yz4V(@ew*+&g<d}Q2P*%u@Xv*x z5`IqT<#PX|^1lnIIAVX^L3n4Om&cu_@&&>N3roVL(97Yrs=QOUM+mUrIZK#7NB_H@ zlRxZpWS#cOAC!LT`{lom>N#!{-YSH<pN+TIM?FX77YSb>e7*3OgkBHzE|q^z2=`=b z?<2y$5PJQS>2ooUzpCrs5PnN&`dr-idZ)W;AHBEmfx?S~n}ikNLxhvU?ZR21*YA2g zQ%~1#5PCiDNtI2{i|6tBrDy8;^Mx-JzFPQ;La$e%UlG^syM@0m{IKw2La$HyTa~{g z{JQX)!v7R{J<{3QKkp&DpYVL)xbSjeU3jH%N_drUPU!VUk5T!6@QCoZ@D`!h7yXRN z&lbK=_;TUvgkDedt17=!_`AXn2>(Rr^+SKH^5=zL5&pCAKZIT{bf)&ty9n<ke1Pym z;ibZ|uqAwiaGP+K(CdM&SGg<vap7Zyj6G)OuJEUX&k#OO_!8l(gkJB%*cJT#JA}V2 ze4p?`La*=nE0sSZ{G#w{!haQdJ<l21_s<gEU3gz%LFn~66Drq)^fTl0Z4o|F==D1L zRc;Fh!o$K9q1Wg9q{>efK1=ul;m-@b9_LLezfJg?LT{(_2P%90&7Z6MDdFdYUl#t8 z(CcmJipBT4gYeG6bA{&#y}riVd7&Bm-uHWsp6dIa557ph<K<(g`riN4^ZPyOhxZHr zNcd;M|1NUU|2?POy7}L8+V#W#^mF?E*Zu1MmfY$G&2L;Ox_pc9dzBY^JGjT``%e`9 zwD4zzKPP;d(A$f?QRQC|{)X^9LT~qmus(L){+aNT!p{o-Ug+)J{!QiY3U4pE`W)ds zh4&Y35N;HDyZwgB-hO{t<sHI#;dR1}(CkV<S9rU&8+H9wp||&cn##`+dV984sQh~2 zFA3i+e3#JMvHhXS9})hA@YBLC2)+H<H&p(XaJ}g2I|}bAytnXy!i$8PgcadKgp<PU z!dc-p!bb~xLT{(Gr1DAO6NFC@K2zxJ(_X6btA&imKsxTN!e1A9yR_d|`NP7G2|pqH zTcNi{`?|{C6#l31cA~G(7T!a6KjHbpapC2{y6{Tjl<+FyobX!VV}#!B?1;+8g|`Tw zB>Wknw>NvC$}bnbPWWcwuL`}L+3%|S0pXtrKQ8=hp|>ylipu{i{14$eZ1@}p#;YKD zyRv(!`~cyF!b^o^VN3W3;Wpte;a=hOLT^X*<0?N^ctZGi;ZF&@{n+zVeu?l^!Z!$i zS?KM?ep}`D2|pzKsPM0Z-d^mBDt}G*ufp#L&k$eX?Zob`@_mH`;U&Tep|=maLgg*O zM+&bN?iYHyFz<hISl3sCHw%AK=<UItrSc1ecx)Tb@0Z`H>HFWSKKC*D-T~ne;c?+D z!Y2uTRL|Mg@Ari_2p=oFN%+0$0bix>y+QcHdcRZs&M^M;RQ4OEYWKez|C%44U)DIi zL-^am_X$5F{HXA+gr5<9QRwxS|EltLglCAJIZJqV;eCY#;U&TeVNH02(9?U5RQYP* zeqmcU5FQq;2yYhtr0}W2X9-^*{CVMPg>MqRP57I_-x2<S@Q;OmF8q}6bHXnR|4I1o z!bJ4U9fWrlo+~_0c!BW2!jiBle7JC{aHnvO@KM4A;iB-E@Fw9;2%ju`y70Ne7Yko0 z`~~4#guf>Aehcqa`Gdkg75=60Z-jp*{0HH`2)`}Fwr>0RIl@!fZ+g3qhUz~|I4#^E zoEKgv><AAEj|y)T`u*@Wm7gYjj_^goR|vg5#4oA*cHz5(zbE`dp|=zG3za`D{DSbS z!fy!k_5s88t6|sgt#*FU``GFB=MVb1HtT(6gu8|Ngg++i3l9mGg^v?HQTWqBZ};+Z zD!)wl8sQs-|5NQH|5py^_Mab?9Pm{8-RZ8I)2(-b=I@WnF7vti{TB;gDg6J%j`2q& zm-=4k$3~6I<-+fmPx@Z@kNkOiy3c)~p7T;+S=bUjLby%1OL)5N`*ri9>KD&PK2^`{ z&#C9DJj^~bZ+G(l>ihoRey;oD2WaDA^yI@~x6FP++2}`<t1274h_cZWxc`3uhp!u< diff --git a/quad/sw/comm_dev/Debug/src/util.d b/quad/sw/comm_dev/Debug/src/util.d deleted file mode 100644 index ce8cdf3fe..000000000 --- a/quad/sw/comm_dev/Debug/src/util.d +++ /dev/null @@ -1,76 +0,0 @@ -src/util.d: ../src/util.c ../src/util.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops.h \ - ../../system_bsp/ps7_cortexa9_0/include/xstatus.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_types.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_assert.h \ - ../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_io.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h \ - ../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h \ - ../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_printf.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h ../src/PID.h \ - ../src/type_def.h ../src/log_data.h ../src/uart.h \ - ../../system_bsp/ps7_cortexa9_0/include/xparameters.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps.h \ - ../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h \ - ../src/stringBuilder.h ../../system_bsp/ps7_cortexa9_0/include/xscugic.h \ - ../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h \ - ../../system_bsp/ps7_cortexa9_0/include/xil_exception.h \ - ../../system_bsp/ps7_cortexa9_0/include/sleep.h ../src/controllers.h \ - ../src/quadposition.h - -../src/util.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops.h: - -../../system_bsp/ps7_cortexa9_0/include/xstatus.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_types.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_assert.h: - -../../system_bsp/ps7_cortexa9_0/include/xgpiops_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_io.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm.h: - -../../system_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h: - -../../system_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_printf.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters_ps.h: - -../src/PID.h: - -../src/type_def.h: - -../src/log_data.h: - -../src/uart.h: - -../../system_bsp/ps7_cortexa9_0/include/xparameters.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps.h: - -../../system_bsp/ps7_cortexa9_0/include/xuartps_hw.h: - -../src/stringBuilder.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic.h: - -../../system_bsp/ps7_cortexa9_0/include/xscugic_hw.h: - -../../system_bsp/ps7_cortexa9_0/include/xil_exception.h: - -../../system_bsp/ps7_cortexa9_0/include/sleep.h: - -../src/controllers.h: - -../src/quadposition.h: diff --git a/quad/sw/comm_dev/Debug/src/util.o b/quad/sw/comm_dev/Debug/src/util.o deleted file mode 100644 index 9067c967663d5872910cf8cee92ee15f9521a904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127720 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≷B097Qd{BZfzB#Qa*l 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 diff --git a/quad/sw/comm_dev/bootimage/golden_boot.bin b/quad/sw/comm_dev/bootimage/golden_boot.bin deleted file mode 100644 index bf165f708a501bd7b3960143f1728c05653568e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302804 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]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 zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy 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%0DTM1ka!ej6ZR$|ZBpDG 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 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSN z1cA`Eg0#0MOoaB~ha&xR0mR74D0BY(*1@IA*<tAC{Asxs3K8aQ5{;-53Z#>elYGt= zLRZKSGJM2dGrkVC^h}IB<F(6YFzG)(hw`&BMp^%UWpL>V_B{o^D_5aRB4y0P{>IpA z`4G&6I~#$<FGS7QPJ`f&GASYc<MlmO0BL%n-S)9}5JZPS+b8=JIjJ9r9j(F9dIz0B z>ri|cJwbyn#OZJcAs?bpG^I89A(-Ue39F|~gd<>_u)TRmHEE#SM%>&L?Ejy=w}Gzg zsLn*|935Ss7NYyKEH}dVr&<w?(qV|OZ16J<E(y6&JWS?d)NO`<TNu;R@$&E-Fm6AG zxT`P12*-gokc4D-6X9X9Ob-LRyh&arkg-C3mc#Un9g;~hnIUmlta&e)d88BLIOFH> zec!jM>ipe%rK@hW-Q7!Dx>dD*YFE|XRdxQV&RM|UoYW<YT*We#sR)ooDteFF>FSAe z5)G<}NbM#e5kETC3m(e6*=MP?Ke=PC=pxr=-Yz*eM4}hMF$5{`4P%0VrG+o4gd_wK zBQp3o)X9K52igk_{rJOIc_URjyb<A3mvuF()lXAjg*L8YHSSB%N{fJmv76H%98ahT zNQ`4_#K=sMIEHLA4w)AiB9vFD|2pNHb@-nB`AfRU^_jOz&JB{-%lW4yoRgR;j4=q0 zk!qCPi}}o84qE`tnZUpoqxkV}5=WE~rAO5m*k>Q~GnUG=wn`lc=aXgnT504t1#mU% zQa@T%@rTo?7;zSG^nC-)3Vt?Tj8}li>QG|ggGro3>qslB9*I+gdK)y%+0R1synur* zeZiYydX-ppSxm9y7z6wwB`zW@Q%M>j%+!P-t|<VQo-<(Asp;XDts`*8*ujcAFJZ|% zqMFB6XnbSHw)n|7Mk155fmo$k26x2E%4lQfKr|2<v*BC;$T<%a-Hs<ONULm*QX<vz zoYbG>np|>*sTgA>fxlu$PE#Ya>L_!(b2HqI2EL%ciO2(|A40HZrYw_(NJE+t=PX!U zDR{$Vab}LGbeJT#CDD-@z#m02$OJXQJ(q*Tx9|mQgLP#wD)~g`zA+pCSw32Tc>iQ^ z6LzQR$JCrv<2tf%S_;`nX;9A<FzZzG=8M)5*lc!boOG(T;-*#4K%Ck^rMAIIv*JEn z+$ZWPu;WZ8SrhjFGBt;@E@WE*=RARAqxZYcV7m=`pxN;W^ns~#f7smOPX-F@pOj{+ zCer84+;wyWt$R@*98KK(#VU-N1=Tc7jifOMaE#{-Eu;+(8mpuuSG+R?8XKh+lYs;y z#te<dQ5+sPK<XTaffxSzq-L?Wh6@T}>>jqnu@i_DV+j-Re6END4w~}`zT<DTzG!W7 zw(cz68{I_%;M4YkA;BAv4lsTMV(Sy<K{Wqj`^4Fhx8r@P90iM)4PBALU3=km6D(&s zr_z_cXxEJHU|lm7JX11nfdr40xR6V6%4MhlX-Ev6CvYd4^I|mxM+G@9grh?}4*qI{ zd8`)K>7%2V)Brw8ay-x(50>~MUBZK0pa;AhzX17v9j86M$Ww2FZ+u|`Xk^_<sKh0k zfF5jqim~^QJIFvsz)w-#*^})^aVq*^RtokMlZNvtoLPb5kN=6Av4lc8Jln{}RLh@t zN%j}B37c2;i~BsD?Qq7dnY4s58N5?zcMRW@jxR6X9K6|c|Hp8Bve`QO)rY=L;MIm0 zy%NI}j*RP+ct8X=I0%h~j1$C-XaM5`ba7igcfQESgVQ}0`~vPlo~{l#Zom$?O*)Pv z;kW{!aEwIk4k$FJGrx;vEI8ZKT^L7+8W6_?F-%?J9%zW+lNfs9xOM&<Pb#y)7P4i5 zEemW}V9Nqq7TB`DmIbyfuw{WQ3v5|n%K}>#*s{P`ZGraRKh4M4`V2QO=r=_<^HFS6 zvO6ctE4BCcl+N*UJ@Kzj_bJ92rohsyzF=)RUx1IWu|ZAUp^}%kiiZqSN-bGge5B3` z(B1ZFm0M=YNG)CPid0QxEi`loqnMpPr7ZrmwUTCFfD0r(2F0j1bD0tT%S*a+>;%vK z@WvN@ZEA<nXk}VIKrt(ospK|A!~iHBcGqDqoh}~Ti^$m#l)Fr*5qeS`>ZBu=u)nPZ zu~N3i4|s?v5z--6m}BtUOmIsbEfxC(dtu!kb_OML>$GDtYjPU8qRzZgt>(YYbt{2Z z_G_SZs@Qx=f*SbpWB_PWDkG$ESXaL#(^aC5K^j@)2@I0h<5+p%SjzpPCQ-FhfnO{R zl|9-8$C{evI!<<=g&3r=YM>o}5x5RWC((t_q_S9kH<eBL-s4zS*(p<!D&)_RRCz3* z$~(6ssL`Y)fo26erC`0Rp$J)j%`FRbEH=W!S4rKWSuU*9_n|gpD&<s$!-!+NXv>~Y z$uetax_rml{584xjMH5zA18CLaUbBujfEt7KK=k<%V`=kXb|UAW)T@>R;)q70k+hg zgJ8SV`F&m2rgoF;l6g}|g}W+7Ef7qed3{Q|v6j@QG27ZG8&p;+yjH@wbW`f|;woAD zdhLa++o~_lxubAOxfThhDr4qlzT>Q0n$ya1=W_a=pV^6cLl(n;kP)$p_<LY)?v$fv zQl%CDty;lv8KZ+kVkNSOMnM@#lLQ;I9{};ZfX~qorwZ%zQXTXz_t%?c@^P8yOa27I z<}IaxiBGn{C%D0))yncQdMwQn5CB?BbdCk4OMSm~X&0jECfQAHT^jA$6YAYz23F_a zG31DfLw4zimtboad^0m@Fo7{U-cO_=%w*LCkv&U1HyAI!@WrktjO?NF2oiWENXR8G z7T{T)F3*A5#1H#Sv#IR-nY(VsHP~4K+Db)Yj8dx}1}4W7O(JG4iJ9iLi5ixft+n!i zg?nOn1<tAuJ12Y&hOgx{<Jkrorz;#?ItPxcsmyChUhC0Wbu?Qwy`*!wb0x9+Z1f3? z#}|0;hP>^19<j)glOL;0I?pqL#dF2x>(%q0uP5;0@a5J!UOp75ZJkq6atxKqmhy3d z1O(3?c;#92&Vpc7v9F8*9Y`H9UXN2Svz>Mqk1^*7{7v55&Y}hthYD1xvw|8g9JZL& z&Y~J`YE}NWboRfgicdpXe!~&xyFH=qDqSb^%z4%`zHs?jSVf$7aib4h;x{YS>No}a zPZh6!Y-+hR$=5}m7w`jTVfPxs{wr?HO7RLJy#G8uzse1M;~_Pfn%pTm)_Pp-j^z^P zbm9-r!rBjwUKGa{z$eL7vE4q>;gj^<d(<P>ybZVN9o#v7>+aVdYQ7`j=X(5`XJG?^ zPliV6lg@FX;giX0-f>N+`dzp0d2-Kk^Me6D*W<rE3y&xJ4m{qbU8k>aKj%_aE4PJP zr`@oxN;!A2_nd`3X}6sx+U?#xsUHTr`RUyC%Gp<Q_(Dbk<8HR@mv;8GtiKxV?@#On zmD+d2S$!IDcl%GVK9$=k?IZino4M;nd*$<Kcsb3~%q$;1dJr5h=MMO}9{<hhtR;Gp z8V}=V@i=ehI}ltYFXEfXLQOU&UOWqr@v6&tRk^h%P8>YAzch0_lkD5q-tqL=v;?PI z-3_PDS)V*#H1(O}>Z{x9IkFHx>r>~fPio`jq}m!MXSB2RGk2ZG<K(v+r)Ay7(U4t- zMAz8pHEz2jN8`iQbKAWNi-dA8Lk+*Y$%xo|1Ny+<=@0X=1}~RB=Mz7RSC6g(%{BN| z2WFlKgi4$Y=VwV3dO)lxxqwgNrCM{Itr7EwyZ3x|y*lXQM}(&E;h-}IYxgBSPuMuD z^F;Kox~{qN#h8xb0%esPtg~X&1+)>O3!R)#3q1s&t-7>pnZ@&4{=oq&pqtcKVY479 z%ql|yi;WG^#{0^rLEdy=SuZgB>N-BFRmaqDTE#<=3KYcs_9C|2jT8y70n4f5H=2;V zGck#w;i2z)AZoZsWsY$G)4PKNk+Uma!!n;+Z{P14Evc%-S7h=VgSwW>Nv2$N8gto? zhdkjQx-<VMd4_>nPAo3YA%yHhqC%d-3olj{-#$Z96SYuVC?n;p2lhQ_Q)f-zd4bS+ zaC3Rr;IfoY>s$opDf3AmMyVwlOei=_DUkCt(b9<3%77FzgPu^kk({7}Vo1kLGSsSc zm6&kl@R@)!qqSPo+#rs;y}#@D^=j6=lXlD1ji#1`3MF#fz?)FvEyLN&AOsk!Jw?*M zMKRDc(lgG7kdvbEA-Xd(P`bBFY9+yX{6aFMP-hRNUKmJ>CmrH67t)SuU6hB#f)Zx| zJT@<n18xoRU?nCF%`~I341l?k1o1Sat(Qdaw`5tP{Y+?Atcl%*li0{H2d<$){F<rk za-=`AF?FmoYCt(hfTNymDZ}lRmauuniYk#W3-?Z2WjdI+UAq=&VHydo_Y^CK>CN(@ zX`6vgvzz=G{9M(PorQqaP5hELQgR)Gt?^M}A#<)l%@?8i56SUlZR-WuuCcSGJL~aw zgPcnhxU%$p3CCElqEA9C$s(9@U!a?_a6sORkeeTJ03NjvJpx{=@OojDVd2UIs73y> zJXM}6SXDH#3=j8r-sQ9~tm`W)>nmNWK%R$ZQs6=VZ%G+=*S0UrrZ!#4;#s9;Ex*1D zkmHVumf#j{4K|>hcEzZ7!=N{uW33EUnE(4)BB#UireCS)sCcA=SdlA@S9n0hq(<tl z<SNSzCRt)tY?Nu>4H6M{{5GvYAJZ?zyS<~%lRou=fIgj4!pM$;5-W-SMZVqYZPEKP zVXhN)>x#~<PFYZ0ighVnO;$K=WXQ!y$~Slb_#knaBPY7bjZU;+6*H8M;0Fr<_$<K) z8BMcMm0j~<IYlaRib1ev<(RJ2|5@sqL9-5t{$r;#_??}bc0_2s4&!;n1&cAoJQ^x7 zF4m7MDr=AtA^>aC%&tI$QlI#mnvd<^6pry}E5eqD;eiHD2jLxf?>vETy=0RbQuxCu z>}I063?&T%%YY&Goj{6{7Jks7K{p8!Q8J6<QT&v}NC6%#Ff-(nXvXIw_pFD?^?>eD z-B-%o)rA347x{`lIRuCCXFGLN^24m%zzPxPSt`!iX?g<=8aT$cc>4q{YCQ}W;T$00 zwPXtpG58+i6Af)wKBi)=^m00(9!}S2Nv`^wNPMJmTGh0D=k7~#P&YFi!86S{Y(iz( zJYT7h!e3e?28TP1-SF`wFtal`wy2sAY@+jwvu7ZEe!!<rb1$~-%NCI8129tDbq<a+ z@d`6=TwDQ9tg3hqnCTcsi(1-iMh=e58}KKUk-^%8LoD#~10D^B*R!BGS*qa!Oi>p_ za;*P+B7NWfZo20}jl+h#9ZJ1a>yboV5?wS%?&!+cDB~ov%zIwIpPya(eyvJ*v)<rm zm73>u2a;Nyz^QSBUGN%b$T1$CXq<#CPaMP9*Qk0Vu{;IP>U@FMoRw?t#+D~BRpIB{ z<03zzBN;>9{+R_ZjX+|i&vm%_w9i&xqfG*T(^B3@5aC)7BSIz6tr4fn=qyWkEQhz| z5T8Ypu2gFCf|s3LdrYx^5u1Rr5zIwO-I^r}JmVVD^uVaPLTyhQ*}zBCtrzR@n-(ok z%%==J$;r$@>imHJyT4~zy&7w+igYh#LAQO)Ea~XZNi~8q;6v$ydmb6ZrFo1;z6~`o za`S|~A|6r~t6dx&Luzi<yuM6novC>}#fOeKO*Tbw=Xh$z>5Y?3^~uoa&OO<#S2r)Y z_tzf${x2*H-+S3*x9n<Op}zRqo4+vi>Rq?L_Ok77*p==0$ezEv<+b<y_<jFnQjcYS zck-)WRd>EGJ+4+)&T&`d)&K749S%0tCzGQW-EMYm&&KY#7(N-j;^3zmw=~ohv+up~ zkN)w!SM0y|)fZoO*{;!npS|V%_uY5<`|fMqbLTya_Z+(Co-|ub$0whVQ-Zu<=WyZ! zr+uhAabokDA5H?_Jg4TMRn~eTKGHsN1V0?yr6{*g=zwasS3PbeK3{?_oOVMt(<kMH z!m*kgo^z`RK*okG_{0Hy5=B@^k2pcH-L}dG=6MjmGIY&TZp$Y6Bx;wAZrJq`!1<)j z+rxx*`(*a-y-yr2<ntytdim)#WfOg(b`(dqH<#+gZH<6HX@5oG!rqM&(j3P-EC`*$ zF&+k;7W9)HkId&b_R8Gl8PUrt#NF=dkT~}(D(zw{UvbxuD!jS?jPnGpJdL?)#HvGc zeb|8)-R|hTmhhb=rui}4^%_u(DWPRny=zn@W7I<et`w;+bcdii#3eoFX3`Y1#aYpS z!-x64f<F^y965kH!2llJ+dEFG!RVWhU;n79CY{r6uh2_+Up}ij-nkw=FFo(<X~ki@ zL&B<GxQjJ9K%X2><#^$a8Q=V7II7TTA$`92<ZOFa)L}W62cImb$16U;{@#2{te&?% zdGKtTyN=N6ZtiNg;S)a|aQ=HzseL=h#VHw{j+z(HCpP^T4H^o!Jq2v41$WrS!$MED zyuWcneyk*WFN4IqWbdDkdS_`;)ZPzE#29oF@BJ(uHwm4w8QS|VT--S7<U%O=0#b^D z9wYk_X<+I_IltkA0`4%-kAg1;ad2?P;8qb7XAZJ%I0&DC_@Vg$c%-BlH$BTxx~?jd zPc6N8aV4Le%V@2Z-i$g3xZ}-|5tFH<ANr6`m+o-<r5_?a$ZKU6ot(>CoErr^#7hsl zHYFeRvByI>_5F`a-v>Dn)ljkG)r5FXB_H*qGZMKvp1SIAhUiBbMuF3~Y73n~1{Cd1 zFWFO#YUMH(C!7G_hB6vy#;dE6U;z15wa8Rzd3x%8UNYol?i`rrPeOdYPm-13w^S^+ zRjYPY8EaVqfTK#XBQTDlI~XrC!Sr9C!Bj*m;Aup+Ouut!p{q!VWRB(uAv16kC`7`g z8BaMM1urWz0Z|8C&hBQ_qIS&K3t@|*k>tRfL?M$w-6O-hk|@#by9P^(3<FRHO;M4Y zzKMy@!+WVj6+Emb>BJ~sG&|(=@v|3n_myJ@tJE^(sHq6Z*Ai`R9Hcyu0ZCNX)dL(n z%k|7-F6I;8(w-wK&b3cu$Y_;4h7FNuP5yFDuYr*%rO!aJuz5G-Yja%=cQ>`1TXVf& zH~14a-h<XUB#W5kMGn={C6P|F)WR89$H16$s1ubH)ev&MCRIz~5MOr}y^@h6y?W-< zj)LksJ(?sftG*^MP$-UtsZIeUyjaqsbrjiLuyu9P!fZe(<2Xg#s*-GE;2D{_%9M)i zlh9TM;}GNug-B_x?LlWb1Jjy60}tS?7NP)VRB;cF^C@ePdsot`DgA+}Q?*ChHs=_o zA+d27wwQn^bC(d@#XSceA(BrGFg4F$^8poS6$vvgLYV{?GPO-3SmTxXY#V<bBGz;U z`Jo|KA}ijVz}+wPf;O@&+fqD&<P2+ocv-2%c((|BHuW~%7GYDgfhhhBq)^_@C?X-! z3V>{^1O6>hgv;tE!ZbQc6m-zi`H(b%TZVYDjvvgO8lRU@wuHrXDVBQ~%J3>dOM<Fe zNM$K*bDl{EPO)Mml#~;EsR7?eC5#Bqc4m2OkTl0INJ*ha#Y`JzEMr28EMUffZpo7$ zQKU&x@hp-S1Q4MC6eN)gmeUM@xX>aJ_Ka|aN;g7K$XG;_&7=FncLubbsGd;<AN#{T zVEXHAtcWsmbDvTVsQ73W8ysRX%D!MA-6|AlrC1kAvPV#sKzngm#E?%YEJ2>@+Vb^D za!lx$IU-0Ef?O2}6a+CH5G`yhw}xKk!5T#mS`4Wy1cc+rkOL(E3a~DpQ1ZO76&!o! zxDzg!A%;=2v>S0r+2XRRjU`|4G4UeYRuT~UsRpQO2ZRfX8pBrbH7XE8kUxTNq(i!f z@2|YE&*nL6!ZB(JrJ@%>Vu|P4TcjufBjGqgrtphh3W!h`*Fkj07$ZwzJc`68l-;H* zM`(g069x%k2;M>xSqya}#>sI!{4-dCgpxKNEL3XLA_tV%1L{{BHA%~T$^ek#mR0J0 zMWYr%M3w~q(c&DfEP*@#D>>p=?(?(~OPYXXh_}i!{!onbAfzZei}DhMt;DQfOOZ`T z3_hRel6eRT<A_pK3nOoj?}q`T;>(eli;~-zl{lRsn@^0wtpe7I4wz64wMwSZSl}&! zpq>fv?zTO2JGK|<CPP+>H3iTRmI?QmPm;knf~eP5_BsTf%cN{5hV&)ThD09Yw7^me zxOPcIIpIsuFd-|!o=;c|(-WkuP}s$d<Po$8w0K1i+cytm**2swC3v|O?-=0Vw8ynA zT^wh&SjXd&53BK{n>Gq;0-%Kg*7}5$WvpwA5uzzwU3sZ$Bpc17F_OEHTem8P9UO82 z7Mf#RArP|iODtkC@k1xJF}whtO~`ME6_8M$f?;@Br($tZ10-OHQU=0A;2XiH3M8CY z7<x@579NzT2uCuLEUEF9bS9hw8ubZ-+cwsyaWguI0y)yfjV7_k#t~v0E#&7le0Cca z-GjIZz+$SP1Ip^Nag3_~imqp@;~|HQ@hA7OpsP>?@kETGzE~n!Wg#Q)0f<yF^B~!R zQS<!BVHJ#|pc&AjhA6h)?=T(Ah@YXDfJqn`NtXf}(o0Cd>Nr5%A4q(E3btDV&009| zpU3L$VQ~s5i9zY25{OZADp|#MnAbSMLhO`*7GXme5{!gWyd$}aY`8xl19B!w0>5|& zMX0aJ9#ac4NQs+b22llMfHdiVM7@+5Y?#dA7~PsG84SWJ7N<u_*~H+b4v1SWBbcIA z>;(mucp0oikR^_Bj8Ela3J0&1hPWe{BOmkEXOZ;^v?2y?+^S=9YKiI|Ox3VOr&DSU zJ~T^C+ZhT`N`fB%wUD^L9ok1Y0hwf;f=#A0?WhvsW%%)O|H7$HL&lH6Q|^*ff)xwg zd4P@R#%Prci3?PAY($xn24}62Y&J%XH5Op|d~xc_3U7lb>4O$!9F9!xUr;2OALkw8 zh&2Camra5_a&J>3vfb2xJ|)*NjchhSg|jr%pSH`J`TzrE)PRixxUj_QuxE+anbc4) zYjAywW1vCf(35bWFMB}pyuLW^A}&`e8oq-i5jltr<5_xC&XJT+6B<*y9z-pT1^EHk zjjng<VW<h177YLuVI7R&rfP)XMV@IHCld(JeA9>%&GqwYwn-hhhE#8t?ggs0C~UFG zvMk;$fgx=mVbvltpGgQ+?NNs9K`+RZKx=poy6nwzan<}z_Ge4)TS?F@X#vUU*gm8h zP1cf18?rD6bA=i}hfdSP&Lqo{XA19gpk3jQ3Eu!0X$?MXSOQy0BPq;eDj6r)WwJXJ z^BLA=Q4NeJ%OQknSn##7954LO?4reJSpw}0fxE$mQu9U_Uy{&#di^L$cViCF>KN+J z2BWdC>8m=Fe4}KlNo;h66mlVxro00lW=x)w8GvYUQe;?9bk@OSg$$N8sV8w%1|OU? z0k_>mg24cO(V&iyZ8DASp9F?C-+-vq;?dz2d_M-7vKoQ-YInBGq_wQF*2m;kUZiY3 zVB~HdXq=GpE``zys>PUHxC&n_eKXTS9Nc(lkCOd_K@#m=rU%A{mT7+D+@L;(;|k8C zwF2O=p_YV{LJ9zf{<T2o%)HGOV><5&N?9k7HIqH?(PWU93jtILV8khOJ`Q<jJ(yAr zao;rM!MAcB#qpoS2S9VkU<KZ}GN7ajMJqE)%j<axf=$PAzK20@L{agbbjVJ{`|=Tf z0NOP-v`{(&T_?p?A!CBKr%=BK7+d3&1ZqwPiYp#;UzE@d!sXv6L^eMqV<qP4XsKbY ziR(4AR2fViS{b9%ZFv5$aFNO`m2J)?2_}EEe8O@~Jc`?j5QFt~IvGUcMOaJ6xJt-o z&BCzKH_GYNu94-DXf@tGn&_nobzydcMuE7cuHsSNZpV4ol0SPCMQn}(!)oCKj$F)H z2<4QD=W~sbtid~1IQxSuEaaPb%rf+jYm;mCIR#m2XOnDJWs^LZXrq)_#SERP$)XRr zVm2*oG^CE=5U11z-9@7UWv%!&=-J*JPlkrFeMZNVt)Ufp2vN&pV37cy!pRoiB$w<N zQp?wtI;+LpmE!w{@er;E)Nb4m#EUods>Uj-?Qyaae`9v&ExQ)YB)arYyrOYb!>`E* zPhJ5Ml$4QXq?aR<0acvm>(4AFNrtQgajaF$JCCL{p-iIZe&kI<)U=3`bi5ZTnKFhK zLlDizN2in-d(Wm_$D@=Q&?kf>j1w3{AmBCmUTA#Vc$~hvdHcf9&|Nn-C-?v0FJ1iW zL!+1A^s)*!myRc&xi<dH_HCoXZ@6*(!E3L1M?Ov-IQg%aAK9~i&yAOT=Emm2-!oU; zICRx(_3E$O`wN%t_?`V<-1UdIf9wPIz5m`LdQ$JaWGo#WAKf+iGb8D)nBznSJ$+Ji zDFZla%p%*!al#lgQGD5+&-}u!U6<_|85(F@q2nuV|CGA1`Hjy#aqkZwx$nS{1N&73 zpJbCy+?!nTzUDW+H1|H6T-iMK@WS6M|M91ve#aO7W3^?QhjsWwSy7JGu~E|Nq@%4< zq`B>?IDPN_TW<?KdEgble#s@H9Y>V!b$2I4+o!I*__FOUO}4*b&-|yaol4&jifDcN zs^xU@ru6oUKXc>E!Vj3M{(hQWHMRQMm;KXET>iDj7x(||t=~Dk>&Kh_WNLEqHJ6Ny zjb1rAddcX>koO4=O>!Yw^~sD`giloPiTV)QHt~jk`>|c4yLRo``ww?Dv>CtkQ`xxr z#;ckOZ+PxLY@U0y#yDwalgI8I9lh5yU)8)a8GfH>?pZk5eBzo9OdYy9)OWMvuT1x& zk?S<q2CU)4ZnMW9FQl%&{78Z1sqs9e)bZm_y`L9qCr<2}-dFm@%al6N<UN$~z8s}a zBI`o_U9ooiQS8*g>QPYI?H#g%;s>rTDep*Pk!c6`^}th}5%Y@Pjj)~3P7EanXxlfL z+J`|Fpsk+irZBKiD}Md!`^nyiPvC&64dEit>hKAkEqQ=Xo?;T;MmkYiEDb%=^vSc+ z)9puttWrD1BlVovVJFTLxQ>_bbjc^vYxb|}gXLXDgzYxJ!Gy!Qa4;prZa?E(dE$fI zUw&tY_$1HBym<}E)Xhn6mQPrlx=(`L$~ArBq5>=XWdC!|=lya@(I>Ba?8+<48g}I4 zWV+;&lTz-11Jt@vpZv??3(wOh4p0`{;-Q%MK-e?B<DG#K;&%J+;gH_!c(dj%)~o81 z>#z4+xl-jfmEKE4pNxmOYoL(E-1YuMy-q#*Y}qF#e;~|V91j1p{S}$Jq}=Q4J{c&@ zGNJfFf1nJgg@vMo-adhReVkzL@0s(-SmtWD?2o;;`-Y*5qdLw)PX)LKa2DsLF7DLu z+ok(mWB#V@Sk}}(T=Y>jHs<Ppy5YNsqGJYO0-d-*aQB{Py=q=d1{m>e33xS@ItfYi zAO-OmwOdHkp9AZKh4Z-uoZ7G&k}>%48tbcaO{bO^vo7Df&yI?8X<72}^|iZf%n$Rj zL0Mcnc7*)*^Ge*qSSvfktMM_r{H|T2NoX{1^?qEE42;=~-$f)qx$G}|7t%7X;1o*a z%NK5;Es~=nNG?I01VWry^<zT7ZBECTk_dX<wX5{~#mqXoYB;G8n;p6=N+un)`Qh~S z-F2S)o9^^=shn7vO1*C!m&`KasyU)d3Vix|T)N#hcd7#gJ<KQkF5*FV?0AOU>DLXa zfq^Nc->mk@Y#t=t`B$N#TWWfG%A2;xwYu7VOsR`@ekaes`PayfMn{?^!B2Z3<}96O zI0K3NxLCWf{_F;Q;=X?C=5_jnFx<r_?=4-QOh2V8<?zmospExNND>gAd?%p=o<1PQ z;tK|DzIp1qWH#?)*lznizoVb8?@ndRQ?uv^`lPTiJzxxXnJ#<T+$ULCN|<LT=s8YK zo??O1u+Cerof;oU+{Gt9|FS}F=nv=)Q@l<I5ZX?k@PdRsA#eJ1PoKm%c^w}N?mMg< zhYY~J54gB@IDKUpCx7L8`Cp%0UB$}?0MF&w+VY;2b~~INPQUJP87C1WLcNfBCr&|X zy*O8K+KFJ7eYFzSzaps?osW~1Ri5xq3Ac++{<J)I$<+zl+IyUEk8S&TxeS5aGf!ch zT*X`E`wp+H@MSep4jk9lIB~VgZF};h6`$0{2};B`aU+o5mX|%)D2OqhX)=ZLF#m2A zsld4%e5w8(Ze457dU#EIGtv2)veM8MPMu#9KWEV|)P2HkSBCZQvh2B-PAZi)6->F~ zYmF9$tUu!vZatsNQq|p|rWfHe_0A`P2BDRd4@y@nWiryPT;uPHCT2tRNRZD%HJ=sg zgy#*bRiDZulc$)dVindYA@z<3B|LzY!QloZ{(3__UvJ5rb3=X=0#a^ylk<Hd=hPW> z+|&sUANOP~>FcHov`~3}$v+UpI^%IsR=YJI&jh*`zHzGVFAE=uy2D%{PrU5Xu6@2D zQRMZh4}~UoaLS53Q+Egjf(?lc#eQ8wmy#SwJ8ia5>P0hIX=hd7gt!p&sp{zKV6RIs zxkTCa)LP($OfGzSiFWCJS4mS*Vu`qJvVRLeQiMz8l#)_V7&j4axDW~)DcN^slo5^u zQQ#M(jizju3_ZK7lP%V5hw9gDP{+HJQ78R!>G~vZc42_3c$W@MfpzLl5nTNPxMxqS zDHwxbNQqk@SW;_H(jQZxUX2pJmb28G>zsfWRwc#a*S8f*^{@sRbFe-Y{FF10aG8Qc znUkmQa@NZ6Jkf8>!ZH)wtbzrq-$%)n)!WJ2Z#a-yv4IOh{au~i-O$uXEpQFOm^D30 zm0VsE8b{ni$wYzFZ(Q-J3AxG&L-hjB$5pb_wk9EH(9~0)lIhCOQ%Oy^x=z6O*hg8W znF`#HlHH)Cj>SENkV&Ij*;vm)ulNnS)Fi;wl^zn`qg@Hu>y1?}Y%g$K661Onth{uY z#xlrhk6<}@t}H0+jBO{WLb0%hmA^nXSg<22rUC)6_37Lk_-avLSDoajCNTSqFYVD1 zy<Yyj78IP}7|H9JXU%0SSB=48?l0%(iAkT*oCggM|I{F~+B;vQG}-uLj9-Kt$YK$m zE`-w7(1TX?A+?5repvskbZ@1Lythq_Q&h{{!NiA4@~W2ZX;yOS3I@b=hTLtA4b7xi zdz%&GI{_cM%mrPGiz*_gfK-cJTS2ISm(puXZ;1P0e>}-;vyplgC9$*eU|)C(s3y%r zTESH0&2GuoYFp{ZuSu!_UxrZ9pdH&43U`>)cv3B2UufQ9<HVP%xhhSnuyh&oKB~FO zOH?Gwxw@v0l<#%swNtjMu&z<H-zS;PkNfqyR*e@jg}8xcUF!XLK{l6mBpA3%v4UA4 z@}NW*Q(8;H2N7a}zkXnCsZ92%Ql^j-tn}QkJa^^Z!trDUxk?Qr)&=r*ci|PJA7GPm zKpvkhFVFLIE+dH=3MHTzQkgNXmCenf0<@iB3gd)5D#&4-5G3%A+^(nbC8=IO!w*AX z#K4D;ogAKwAlCR}C=ir6>@-4C%8NSTzY2z^tELO9><-LyP}U~w_xB(>3U=9gA5Tgd zN=bU8fEvSeX@L`Q3<H<Uz_n1|^|%N!L9f?H)c-(<yrYYPH=3fmJ3*I7-r;q>*YQ%0 z9?7!O9wIk4DvTmWr8Hg8E8>cDos0UW<#<U}R)kj=u8&hhSI&|(M!@7GLJvs!LkUtc zNSqqYF91$*p*pBo78~X^pj)tIfh`McSzyZoTNc=|z?KEJEU;yPEemW}V9Nqq7TB`D zmIbyfuw{WQ3*heO1L;ru+rYmk_OR(+H_8iQY<eMgjprbEnUHg;30t|-SLJnL|K`p9 zu5*=T<QBDQ?3M46n4!jptNa4fMN(1@FXZd|nz%=e|He!Bj>=wNo{1-<$qnD|M&$H4 zIqr7y_|A&0yw;6IT0P{y`SFlJfmW%99xE;FgJB=~dR1o~uX0ZjySu!xs?d>a<2_!j zLTp*buApmFhufU$@Eq-)NR#E3aNKuSw93DO!dJNg?5xX(Sa2t|LZZX}!tqZxG;{=@ z`|3qu$*pOODTgq$%jq)iP1_R9J$!JXyO~{xGi9nMFefYY{BdnrDk<$$L6fb^!397; z3M4=%QxFCwq%0Er3Gfw#7ELi8XH;aB)U72J-b}#EM(Nd%#RhiFj#4TIY1FFMir0{< z@0f!vJgQkIlL7yYUM7}Gt(^fi?+YL|vCR~sdA>knoW-0Xx<XFZHMZ>c%(>9PhDNYm z9gGm-IdM!pLs!KL80aNoms4c$>N|r+twxzXZC5XGZ9J@L>LG<{tpyk@73fw)bRmG1 zu$&6A;QTB1&X8QBBN3Ypk`RIp#}zDpC|T(AQie(ri=YNUi?g@4x|6YVj00?b4k;y6 z3YtLUySq3PHwT=aSd<kyx0RGTo+D_9@O~V`TIx{bA<NaPoI^6KUEALe&;RK^j9drW zMb4*8OR7|yaRMRCZ5DE9aQMqXtB#5t8_cVwgB*mU5+Fp}f?NjhEO0;EbeVM;X=sHi z)SFdD3r%H&roU8PLn2$K^Rh4*Yk5j*X1HUtWF2p>T$1$;wyi$bt#mEQ$1`|c^QAs# z$m3CoFh#(Wk=d4OEOU!;3aZm0p)G0DPC_VnhooS>u|!_NHH=yf7$?S=%qJZo|27Dh zV;Zvf^AM&R9SHTfY%HevE9wS}%Qs2csj$E{(v*l5A;r7gTxF|ygek#;MG`4WIe8Z@ z8@xKJA`y^I>awsb!_}~PQ!rBS?W$BsSv#X9OW`3GIx==!i=P9FsL)JISt}8mr->3Q z1Gk9SjU|JXt278{L!v+ozJg4JomPU;jD@H$$mGwUi$v<ElLbP)D<vPRLh^wrBc16y z&wMU#Wt<r3G)ifuZWIov4rE29btS4KP%)%=f@n*WoP|WNlk;?$(>49x@}8iI1nO(> zZ!D=uNevnGfV_P<KekLtzyy^UY4Hs7#i;6D#8w>@p6g}CL^B>OM-Uc0ErXbdvhaqL zdI80|;P4YVd3h?PltAG5*g9(74-Dv_C7(vW0*iF+aFJLk?KEoO%Fx0tA9aTjEakYF zj55dpa3K<jXeWtaC9DOegny*8HZ|x9n~%~Pat|YiEhEA6q6tNYSn6iAC$KVgaISOx z(rK}1+95ASikV+dTZnDKX~`(-#DD>i<_Rm(j>-^kJY2aL@3QIwZioiqLO?RxKo<<J z%mnTWBSol17EMa&Ttcfjcpr+^0%6y*ttI~tI=i=sqlHi<CT7X7%vxHEXWAeJf(6Z@ z+DQ7qG8N#c2$XwwqST6T;|E}Lt&UnRYnd?kF_uah#uh*1A?yZLYjh2Da(U?US!&58 zS5v$=Z*UcLx(P>O-OyH{{)%7Tks~t@;*NqSY#-3hQ>d~7;84rH;=sU+Oy>o8davlx z3(2v<{<Jha;IjRO2SA0{1*JI9&<`;9<unoqyIq8`Epo-`w|o<hK^6q7fwNI)3nQOD zNi1d}t0v@~=v1*1+D?REmL!sq!km`Bc-DPb0x1I#)fJX&hH$kni-IEiS)dp7SXLIA zSVnkpg(THaBI5K>&hN%6D4H@DLwcDBhg*pmI?(+(1mgcu-eqegV>q<X4GAerupZWU zTUSR%6G;g~q(HT+n-J&|rB<bJ25l8oX&c)XlGvV*z|Xd#FrEq>$!IX7V`BOeb*0d9 zocIbM4at}h)=%P1h5=wF@dZx@s?cc}*ikDZQc%E>;y8*?JA+G8C02H|cZv+80hR&e zoj&XC#e}a*7`KN>TCFLV8Yw}9BVQQlB``kC3hxQ$!bn4xa8MRt9Ie+V-O>tk$}Xy2 zAeY@>4pK4)YGD&CDNN+huxge_N)fB>M>Jz`j|rI*8)Gb`Ffpq`U}*7UVBt*JT`Ean z9!&JMQP&Lur5=~+MV68J*l>(bS@k(Jg*T9Y%blY8<G7C0OB81&k&mH8Gc`zgv{k6o zhjbYVx=?MI*GKww<!_vMGbm-HkcVTNioUW^SNhyqs?i?|`L(JQSscTM31qF4_8DwT z#Yzj2d5kxS!rX;U!*O9avBol&LBQR!tD1!wJ+OPa{_F@$`+JNlfwv4T=*<f%dn4MO zHZe?ftgULiWeMs9G-J@wtQH9xTKTO^fUBUF6G|m8^dO<9gky*BcS;w_))7%p-fmQu z))Gj>KCuSEUvID?I4i?#71py-3!n!3s;uKSNVBjgXKY#@Z}aBIJQN5kmaMrsDIr<{ zh0rn(Gnl26wLtl<Rd5;x<K}+gYBZiedncLPD8wvZ0OM0y*O*lkY8SCt&nZO~Eh(Wc z+3KKl5}>Ys_&&5Q2cI*;JB~fgD8qvr|K*p9u9d*MYkgb2nvt<<(2KbX)vit?^X68b zScD=J$R5NlNKasOwpyg&2{GzGVXIsMWT1wmd2O;ocm?+g((FbX19potK*P-LMP;zj z&)_}ZgDkN;`V552c*vg3u|}-V=D^QX<}O|)NheHD0t?XyOp;(4mA+poQ&+GWqJ15y zgmnhM8H@AEAb}H|_%^EU1x@3aL8PIaKD_@NR~$yq#qo-npc}N*adhNZdCOxjwY}&( zdKfrlS+gH-SjXz4A{;6ZauT-z2{Aus3@E!RuudtC%HI&k6{q7!;u=bBgDhrI{Y5#f zxLu<>i<!UZw>ONUy3r4gD6I$BXyzVG+@UHciH)Qf;v*X{HTMza7O@I_H=?zg6oYz5 zMPEirTV<z~74n^`Ntn;o)v8sTzG?Mg9M`cQPlG`)5|$HzfJ*c=K5`9t#x)b)c1Nio z;|&=>i)=acJ3r=txo?#?K^x?|$DW-!GfB8Rv2vsvRV!)^{xsZUT^QZzG0r&A1W)~k zj?v7_3_Vh>Npz7^t*Qys3dbk$F4;;iAu{-#HlRC*+Mv5bA?jVw+_X~Qo0M88m7XVM zBYUK5O9~0IeBUL;HOWQbxo#zmf{l&$e@z(ZG8Jf?5qkr92~D%7I>UDnvPo<Q0tT>_ zVYE9kr6Nc=1^BY4@UL;Lx8fA^g)AGa+23`(Z$&D@1B!uLe80el%zBzIlw6AIl}MDC zQeKrV$%Uj135lEdNXO)Cg;YV}OeYH%Wo1a>i*y<9E6r-6ozi2_^M=&Khwwp)$%$P! zPqZAz0@lY$5+-0S#yA!YRcZ}es^ROP{|Fy~ErA#_8Rii^N)~NA7vsY~Sv<h{@qBf| zfC|UQO{Ol~bJs3B0$w(1ba7c}ySz9XoNPrYL+j3j7KT@w@dPdfaKX<8OQkfEhj7Yk z@nYh=*;QYgpPW+ji<tKpG4kwdM9Id2k}+|bt<>tm6H4hh(~Md#jT^%^)U_E3DQyBB z{T434KcJ*5u*>l}?6Rm*|C>`OM7AB7;Rd<&9oqpF8>64NB1w|o59O=+h{bAjNQ-%0 zRm`h~Q<Dwx%ynjRaZ%0PdK0eDMsF?Wlxm1&RQ!P1HLPZLYt_mn@LFShDpm7K@@6Qz zGJVy&y2@QXWhS}OWKpv7($KH-OzS03MK~RGMDtWDR$u?_cR%#`SMNV`_sd%UaOD11 z<E@qg*2g%KSp|ETfa4n>gE-DYfwNbjcf?C5X9Mt*9C=*^l!40OGe6shU)G2R8c%*G z{+-#T{>Ez?A0Lggp~^VX%IIFj3^n1CarASvm-_zly_ZeC_1gRHd+g5U@BTlx-F4{1 z``%}d-?9I8-^VQVL=0Q;62kaTKluDDdk%i@9(>+e@+WblF|Ol>vs-T;y?^qF?PJ&8 z@`ew7<G%OanPQwg@z`xw-ZT24U%v30Q^>m^D7uaJ$-;O4U3%O8LqGAdpZNzPfB34K z;R2p`+MpCZiK2>6$d6j1b7pO$Z_p>NEO{_NkHKkJJUYDnSgZyb-~Ld1(D~$o*Y3*V zl21&iX4g1Y3o=fm8$#c+AG~Dj=4<bJ+5FU<|L)MCyB1H}`u^ny4&4o(2v|0|;*%f# z!*|374=*P8<Tk697!$)M<D>de_QlE7SKo5qd#}6iTOWMYotV4sY#zGn%G>_#p{sXZ zUaFr{yk7XaE1g7m$LpZF{`$GO@%TI6dG^`$@@|AbSnBuv<ooU6-crYpdtUx^fQoF% zn-#kH%2!GgB3M(;xi<l`?MX8H4yE3N8-53x)m#PkKijLTIQv=-6lXK{je>Uj#0k8+ zwz==-z*S++TB9YoY$cJuH`vcogNOMok;Ae2j@pn<+}B>*YkVsOcx0nKxxVvqP=$#! z_+)zHKB+k6xsp%R;B)V2x8F3^Uc)CJ*!R@$spO{$pGb4dKEb6U2DAtG1aDv7ffuxI z5OSZCzVC68I-XRIZA8^(`{bXLzNZ!Halj{XpL{uRDsj(oqMQ%ID8sv%+wCa;`uiW_ z!4-T0xVrP3G(o#o;**~WxPRZaXl?)13C!K?s!#5O<SF>1K6fe1UG&M5Pd>IGpM-k$ ziZ?n={=cD4O`+QapLiSB1$+9W_!5fCGVQ-m<mMpGU4W}YDNd#wK5`sBDa~DN8Myg4 z!C_Cmf8WiF1TuHSMQwQQ3JOAu6V5qkbz>a&%WYnSlh6_+KNRG*Wg)e8480qI$2+eX zd1^O9CE;5vqEh#-wzCSP$a>YF1+m~>>C&7{aWddD;`=LeWcUkeFH;am$0Lh*#~9-Q zWhU8Oh@EQcVyo_vf|WW*9Yz%0DItR^mnE5d3RMOad_lVePOb~12kF08X8v3V&4f={ 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Ⓢ*an>qs%1Iih$<Q#s&_{WZR^a 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�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%0D=U4lv30fknvNfzBU@_XB^d~(hj7=ip3yk2+n&;y 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 z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} 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 Ueq^K*f8s5V314{B-ca*@0!2t;zW@LL diff --git a/quad/sw/comm_dev/bootimage/golden_boot2_fixed_pid_and_mixer.bin b/quad/sw/comm_dev/bootimage/golden_boot2_fixed_pid_and_mixer.bin deleted file mode 100644 index de6a36b0e337292ebd378769fcdff8154849520e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302804 zcmeEv4R}=5we~(UlVk{ioIsEmQgZ^arWW*|QB#UCKvYzeLBOAiH7HQ2C=pO;t7Ve# zcM)3rt+jd`t8J~H_Y<x4dTnh7v8}aQQL(kQx6aIQ00YI?TPwEKeDAx@-jkifOhkKs zzNeQw&&fG!|E#^%+H0@9_S*ZLdB3-}`~3l~g>$}s|9NLkKTpU%%Mv4nsEAoUi2r;h z)bx`>-peQcCp@I0LL@4L=*1t=9lRfu!$CbbI1UclfrED7pdI+%Wd}Isi~R`^vLa9j zCoDuPM9uJJQ>=V2J&ro8%Rl-tOD_Jx7cXA6@S?>Fj#><GA=86(Ot=m8U8DZ;WnWl! z@llsA5MueF52{N%EE7}pN&Z#ymt20)(s_&L&%5f%`HR{wS_nc|hJR+e2cHj0;2%K( z;kXd`^0i!uREZEa0KLl4<67tId#<dvch?`w#7<ni>%VPtFs1?M`W)kh{>q-;*~=__ z2{8<iEmG5>vVC2RW4zGc&mMWXw<IBizI>{M*rw|1I>qX5Zr&lszb^M-@Baw>e~^cR z5;!P<gAzC>frAn_D1n0#`0tj$i9&QAj;jgRak!4gC3+kWzF2o9ulTq(?7`#y;0(U} z4|eTadn5L^oL#$5-Y;noyCe3UuiLe|0P~*N>kR(e9((W;dn)5k?27b!Hak%L=?7S! zxQ2t4p*@>3#ODaxdsuw7s<$FFJR%M&>5ZhqrvjI5b4Jg~w^{DA0%>O$X`Acqy_L3= z6=J3bU%5O4zW;{30J{?D=ZI`&o5&u1>6*-FagOIcSpR!Fx&9^h!OGu<N{=HvG?rW+ z20XMqbXU%<tk}DF>0LP?zLv8@0`gm%YXjVNG1A)B=G@Avy)mRS&#kof3X$|iRz~-Z zs4Uz2GOo`FvAYF$gq`$+oyfWJc~fre=(}<uyCcK2Mx-?kW0^$G!Ly^D>+rm<0qIU6 zSB+<3Zvq`Nz4v;1YoiK|$a?~GR_(P!%CjX6m6>`w?Fq+94|6)bP|qha=@(F6^ra71 z>CXnzN2>J40_jyM{oX+OD3!h`kY2CSuSNQ`)?K*^ARoIj1o@<K5AR)!G}6jGU4p9( za9foxgSmK~tDeup^LgsINBA<ZoTR5^2YF}W^;LT-59#pY_10eMuvOLJQFkem&|tP} z?PWhjKto9NQ^OdH2N1(OBDd1rTh?r6@A-5xQwx0&$)tC`vp($(OJ>TTM<K|(N{Gkp z2V;9lt6h)sj+Ko#o!M0EuH4;|tJBpNEy+CAj_0dKrX!n@nM1$7J~Q&+>oe#4xNNVr z>HO?pdVBA;+Rx3tgL^2sK3gtkWpcf}&#*1x)p9tj_vnnjUh3IbA$s=7NJ>M`z6dTM zj$azZy$VWQfqMh)*B;Tc&&5?Yx@Vt*OQcZaX<X0Z+J<X8t~Oj)HI`uUiS4I-LtYc2 zu3YR3g+c-`rhQ+!8Zj8eYI;{9KQ``-Jwq$KMwj{$^TKXhx>U^aqKPMN6Rz-t8^aio zaP(Nviu7G?zTa1G&q<ZYM;Vl3-Kpb~nR_O6rMKFfSvD#h;BbiJY~qX_qj1=0Hx?`L ztQhNVN87VJJMl!#tG&Iu&33V5Ehl}l4UB8cO``l$Ih5T++Rd`yO_pu7OJsS=25!{Z zrR%#KPqRFhGwVVA<&wA96T2YFZZU1#8<EW$v-Y+#v$hzVtF{N{=DMJjvT$#bIKrr7 zi&43sjuyM4C<8jX30K>raz8^_WZM~8vF?do8dns!O3OiebcXkDs!r4$m9yM1?A9!g z_;ef8cj0v9boo$S()$hM5)q}c{yf|AD!?1MdUu6Nvydi+$Gqo}X6Mr)9%b+h(yCRO zV-NKrNc#!WYE;^DH4*O{)l)sF((XEyc5e;%9X8GT0n!|m_SCSb7acLhdlYF+DlK9U z@)E%J5Yon~G}^v@0qiRH>_dfY^FE|CtF+N56GFXvkQP&Ez12zYF2Jn{UU*2U_viYU zcRSMJD(#$M!n+mlTm_FA7V>TcJYT`@ALirTh_riET4+?#bL`39I;1_O(iWh72kmzu z?OMy1YaD4S0VfRjOMq7y@HK$f8SpZ|7gzZGO1_r>*8MgK{Vd#M#&Wwnoffu}nT05$ z^&_%*TuwmO>I_}0aR%pX=tk6q?%`g6`yl971)hcT64H6!D(}FZWjW^YnPqF351m5W zVT_mI%iK42)Huj@reukmdAl*Eh;7$rMf8bXv_T(4M=9DTEz6uYcNA*>K-%0}q|HX~ zUV|}IXAjOfppUr7QyuQ)2Yh%o@38$&0p1+N8|#uc_!#AqM)##$*hyxj-0&Q7FG&** zWvk>f9P$ZMK2eFIGaCht3iVu}@MS<Z>x9vMA(>Txe%gQv+qVP$xc2)+)4}#i3eXi6 zXJ`J%`JFV8-as4Lewen1v^cOslo9D>zYq`k<}=%Z=`UwF3;M!)BXlDK+|<8n@&}oI zdZe$PERU(BoN2H_-7L>C4r~x*Pnv@IYVu6^hTN%A_sB;DXbU-neY${qJ@HV7m>&Y4 zl<|$>P?~TZ%7@*~bTQs*4E>-^SfCd+{C4U|g>#eC6Y|e?$ippYN9rT{9A&41w=nK) z<PrA`LevtElppT*V2o0Zq=9LyTMfLV?Ve`H4Cyrj`H&rL5qQZ^X3KzwWxC);(3hyO zDKp5+?MR2*u5^TavX4+kkJEv0(-vvmpFIHFVbDf7f<EZDKVI~F!g-VOA9GAH!?{WJ z#e`&L46ZYke8?l^Febp`JcEvtl&reIv*y!*F43M)E)hKIF-0Dw4g=pZr*{YSNW!3R zncKUA7dC-p-{`jQIkvxirx<NFsJ6rKDL$y}ux@*7GQ)Nuf1j2X;CDJ@nn|Bd)AUsy zv(-c79X=v-UEL`+!tf9LyPNJe7J_3Fx|ex){28*XhZ`=)JnC$f&rv;AK^OIpcEFd- zO;UfUA6kDy(BFAzk7?8~_;1qoNWVkc2k9&1(`pRdEMKk4Q=cm^esw#Kxi4i%lWJ!I z+c_2O==>V!!o%Y)$WUL{Pmm96<*1wu9LE^tICjG*^SFCP=1?P@V>fD#%2lENXbYvz zi)FMcwH%XU6;F!)+jYAfzd`=d@7<*Jarc4@Z8l}9VbTwKd?f1!dDJw#{65B!!@elY zk8E4<TM7TG3;a;0r9L~<XO92<ZC|jz=@+u>qmV6i>ru$$QP9kOkp3a^Z1fLd${_+d z%mQyL!*(fW=EYQ>v8<)qr`(B~wv=U{oB2LxUq0&ieK}r;3B=3wKk@eUpFa+$H|#SD z_Brf^(!|xMaX|*U4Lvv94cS$2E<@YwE6}~3x^g)1`)PfB>L88v*#`Sj+8AYrNmGr= zr;Rdok^NL*kIG%9`iVF+zvN4g8v&eJRv)&H^qfJvE$pN>T-lWp_l#VLdx4ZGcq`}g zv7l4V7if=n_JfwkVWbh`+N?JQ@{@L)e8cXNZ`zR|z&%9ahV793&3ag4O4$uoHYuun zevWP8;TWy}ot$3=WBz#TZ+-JXIcU^8e6|1&Sn`zz?G$;UjP;zY^;XM-eM7oFIRM{j zMT5yV_2$Fy{W0LDJaW(@@LJC2qwrjUXUZ%nkD&&yV+!!9<)z0I);hJtY_;xV$fle$ z!yb6lv0}1u;A1$@`$mju`k3sK8uTq???8XpFUR>Zk+P#dQ;mH3Tb%!*fT;_OYzuYk z@LUJIr*6}(P(Ml`bHcP0tWyekIFJWy!tH!M8qe59F6Z-HJY$}g&y*SM34Jm>#^B#g z;Bypt)HT*&IqGyNXjuZ;lP1zQSkWeV$6U%j<-GPQtaVv$nfsu$Ly+(NvJBQMEW^A6 z{J1+#tiW0#=E08aBo9pAFa&9g7eHqx8v3f+pMmySE(V(5_euUf<MXkeZD4+uZ46fB z+K`9#Ww|fn89E}%K~{NM9M~|nPv1lOypU_DgRzXY5Mj!d{3gLyUiO&BWS^k#Ne|^s zo5nF9=XKnPQ~S-xgDjI?J?N5pgMOp_QpSW!pa*Qvl)WieUw+{%ZKv)R8$7TL=2c+q zM~u9v$|G)$2h9)l%N)acea5wt)>HB|2z97;)LA_)z5pE{Tn#<cI$8lfMt}z5rH?xT z{869e+^h6c+b_xp@h>@EOYlsY)WY{+KKUM^WX@;GobAi`9?#mRE<?Q?y}h?f8AI17 zU+^k@GU7iB_*wrbL!N!Od>WzS1JYQba2yCdh`({o+mD{XSQ}A>QKdiiioP&>NYZ<l zhLsP=w2$dD`pobvnO3LM0Bc=i`k^{q`NK@B(P`QzhM&wjkHA-C{z#o~)Hy__1?q5~ zqzq}>sFUW}RNH)W-AMejL$ou}o+y~MhPujpJ%;4G4!lu}8(ps+<uFFqGtR|1^(14C z(B<hjaqL&SXCQXw&uQN(Fo#Y;d(0nZ<Pit$?qFprIbH<XMC?P((;PRLtEH`rs5un= zPi+Zwn)Zro3yyJ}2cJ{=OdJP#p4M}Yt?H9+UB3bKDbEpF-l`9nR;|-?AJ9i`@?#65 zbRNswy*pUGR;Rfg`L&N;b5N#;p$)j!kancN9L_kRjy1?Jr{Y28`d-E_Ad{)X`>*fA zNc$9cWW6!Rz>in_5gtug^XB|`$D9e}UhkwC&=a|?E~gK8q^f%%`iEnL_2%+fjSs>X z5C&fIO87H`fw#ADt9Q!yh&LPah{9P*TSPm=a$hiTt_a|~CV=zm55P&AV*$5mKlON+ z2KmJ>&$rr$)xfVi8F~{#`<$~KWk)$iToun?Uk-xaVV+t~o67OQ{0T_IyjIIJt~FVg zco>Uf>=rh&oBV0LqaGuzoOAJ7OLVuXcryDcH2$WYji}#>`i-i-v?G3<+6vV9BI?LA zv`t)~r<|}wSwK&&9On1+;o#?Ri~$`7pzS6dpV##bd&^j!!~xr3;#yZ6S2=a)T;L*3 z`Y??c!?rytcTT`x<NW8KZQ?!bB*dN|qp>JI7BFK5lp*=RYdGah)8mqQMYvp*(YnPn z&ULJ(^^0kGPN9yO^c)kQhw&fEf_iZT=-0M|eKG`Tqm_JIg`e>Y(tb2yJuciI?+8`+ z{m42aRGm);>P+ZYr+0^*gUK&^Tq%<?SO&bZjnnz8#t`At6h4k2!qXH!;vvj=o4zcc zn~^sTea`1`n3u!o%W>>~v<2U|oX?DbX+C#BFIkQ@{l;)Ot#OVI;0Y-_q#3?gIqOKg z#yV2td<i(&{_%=#ExY3s-7@y0<oOupESBXO)?5Q?Tq%XCC4lP$6Blf+^v!|Cl<BD~ zqhxvtpADIwtng`>wkmwYLwb%?`I`1)R6c3neC!#S&ByxddeB+RzP}Z8ZXR=ioU?&b z`k3S?zy5|#)ePM9Rhxld*}NlJcP;Ab^pJCjtjjgJUUQCW^2c%u>bEE!b-OE2mpaV( zt_8T?o+PwAy`46?FTFCK&M_;~fh&ag0{NBeaZQ_|zYaP@o;VL{o;aWTbI~jh>sYC~ z<dbsOeTMam?EhJmnUeq6d^Y4ildzf>*nXU_((f9j%Zzm}*2lFI*N$3GR9jN+Eh?Sy zL+Y@mlQ>8xbsfHqq?7m<x8&Z5&og5oh$Z5JJxbr>_~Vb|XfH9&(`=h%ZQy5Ybmb(* zg}So$kamAAlzn)J!daqx;rYs*Z-#6*M^KOQY0&w;=a;1Z(|2P#^xYU|*Uu69ap<o? zbC;g`(f>03#(9&nflpR0pCMDi9QTA7mwH^qiP%?zfEV!uIp6Ae0~-Z0zG2K4(#CTR z4bq|4Ak~;dk(XioORpKUK5%}cZ0M8gIgaz2UKg+&d@i3}H5W<$Ql-mhm2TqTzG|qd zYp15Ekgpp9T`ic~CxR~a^NAcIO2(X%PgL_F(<eG-WSiil>M_TDc-!!2o9Vwo7xX;A zxqc#WHKCrabGT8SbaSrP<%ghr1>5%dl50wiLB#R;#e%dS%Kp)D8I1!my;{<LB4k+# zy&%5-O5c=iab96N=30nwa4p2N;97`j=30pOXlHaE(C^jH9Is8VKR%3Slzr5BDMOfR zA<Cf87;w?YP3YsX=wsIz4BP7a6zr>J)b-awK0d||iT4qV1KnqzRDMAf`l1SLXuak0 zPV^1Smtq`oPf*82&^Pzfw&EB?KHnHGwPnbAMddLLN*s*&Gj`4S#RZ==NTdCDM(ta< zNdK9t!?JpRgY<Nu-!%@}9r|g6%~&q!V?6gz@NuZ(1O9owp4L0oV_blGCvhnHxF*sv zX?)j@H){Wvz5~~JEKgZ<O-yI*!KLY-E>a%f08Z%>i)Ab?+b&j~bJkZC4fK&YuN0#v zx3711Bl=j{M4y%cag!F#i<ATXXWDW4(=O<z{7fJG2#m8sF`lTaoI4~9vac{7p??^w z>X(K&f_T}N#G~`LuSy*32g;E?Fx%cy>DyDvpLUt$2a?I@pqqHQKqqY^*RZTZTyl)y z+0>8F#7q1b3-ZaInv-tlGwVzGR3CFKt^0T}WJ;TTpma4VI`kMaX~^%DV4l-!eD1~k z;vJkl!97a4&<7loq$dh`WSWvU?SMa4`_g^5OO6$mrMx*t$QNmD=Gg)Cb0M3cV;nZi zf@jKs&m8wr0b1;2W}J#M48nLBq{a)^{<4moZ@Of<iQmRKpeW8}Fy^Lh4*AhCG409- zg`Y9D5eh$TI-eg>vMgp-zN_+SJH`S(`xLYt$+qa5aNWdb_5uA9%7K16(_{<}@?<^A zX|2*ZZ7Zl(9M|+^n9sNy%gX&A=&fVJ$2r{B*>H@$SO2^fI#0~bR3hdq^PQ<!?^4#6 zWW!EKjv@A`rg1EEfc>ZGrmdkalqf!FkF;)3UuX+tKY+e-L7%I259Qb&99w^-Zoww7 zoOOWqhJLAEUan#C<C=12I^}#Ic5bq!ThS`{1P;nT+Ys_kzL}<Z*D%|`87yf}ITmCe z8)Jd6Y5(CrNxQ*5)chyGe>M20pP|O^2inBppqsd91F0t*lUi@g@l1SWs!i?#vkj$# zk`C6TEut=yo+!??*~Zy6y|2XcJDlh03?GT}@m+u2e-G_6j6IgEMp@#fUg<Ly&;Mor z^6>lfdrzeI2+%9*Lq<AwpnWOoxXuguOFF$+JWuBbV|qHhSX__!)B%in#1{PZmiFVY z{*bh@Kk4JJEPWikueS$%OWREUkaZa61fG0cvY0OvlsoN`#BKOHZ@$+bH)TgZLE8h2 z$y!avGX@<E;6w7P`iEuqs5!)>6Kf5hH}o@oN7^Qx&$eJQB>p;kRPH(W8M>`cen?!V zUDoRmo<U-JdTqfn=DOg&svOS{>v&>Z(V*=zZLOw>ciK7LIWJTntIm+h`DSZQ1mIgM z{d0ulYXr_=Vjt`H{%1}ZJ7T|89uv-1hWz-W4{!C@zOGMMe;hc<uxF#^L+q7wKVaaC zKo`ei{-(@Epe*;4XuG;Tg|ke!x=!%@5ze3ITcV#o#`W7!QSMcjh~3|gh}}Ut(dXr6 z8vV&~q}gJKJiq!b&Yf{Sr5&|C9nMluh_ebfdx7r;T=W;|Z@GxERiIpW4CX2&FWNEA zEn`93cF@NA$k6^Y4go$Kn%#XJF4{rzOrL_!luO^*;U=s@{B-(E6V)^4-k5rJ@Z74N z^}ZVM(2h<+`b0cCYEOYN%{oP^rTThMps%$q=={7cz~834xZbQA>hG~$f&PiB=gaW? z7W$IyX?w?5u*R?P>Gu8gP@k^pe6C68bJ5N-UT{c&Uc^wkb(+S(Hp?dX{Uu`z1?oft ze6mjHQ+;(t6sV)qbUT_C#(F6Wo@t7K-rh--UZvVUfR3$?0XKDr_BD?~)iHU}c<w>D zO6bHw=)=CS*lo5$Jg|l3#Ccd~8TIjYmc0OF|4^VT=S%J9(FXFFaUYKJ7U1Bx&-Vdn zB7W9+9)6;^wxQmKBIVv>wDS_$;dmQskIMb1z?d5hdQL#OpQD_~FL9HGyzEtbGl4ru z1KYEX_x(rCRpggGL9i}tP5CtBg&UHYR^Abps|IZ$_|jn~nORj}yxE|y67=02ppSis zc56Al%aH$d<mYuu(Mp>U><`)uw&_A1&FKH>1=<V)=O2M@6|Nw!RjiM?)SZ6qxf`KZ zhyj8Z;&s8_Jwx}m9}(dGE%07m05|(`VS&C3qc4An@@=?ix2O}eV>NnQz+Q0AhvV+) z_j@P!e(3&Zb@FQ(0lPIE^8n7OFT%S;-200HFZ&$*C(rD1%~)aVw~i}Pu94-?wrmqN zlys3s&H>H`w84EkCk#4p=Htu2kFlD`^MrXn{|x?y__W<l8xA>jn|ag)&@IpD7K$<I zc~$ez7-NMYJFXY*usgH#Np&AaU}NR`8wF(ZQQNrfzoCuTe{ma>5!dI`^P%HDoQzE0 zi8^QcRlz<o{T=#Z^fjoXVVvz{e{sH+x&~TcSNwQ0^ni05%W;foAC9{7rg2U~;(>nZ zvuv6!#-R0ja3XY$YeGF9cy2_~gt<Yk0U4iQ9NHW=XkW#```RCh_HiEnRn`yslR>^Y zjwIdS3*#dnUjZF*pAj+OZrbxB`sc|p%eGmceu!nsF(JoGA$<+<{84$U9DuiCZLlr& z9oET`UfK^C&&QqpD*IdYp|&TK;eVhHW#74J8P_7O6R|$=`_n&DK>J|wTS&*6(9in3 z6KP@mhJGsBWqgpn80RMTucn9T^xZfI%NQb_ImhvtJ|JVV_vU?Je{Sa7f2r|~mx-_6 z+yUOSo{^T|JWM=nhkl`Mlh153IKM$p%Y*d`&EwFOynm+m%}IlnN01l94{C#Rp`;n} zK4oIsQ`(3S=6LEU<1DnJTzk}k2Xm}^UiCla9&C@kLa;rIyZv|@#qplE<-XiWYY-n~ zu%9mgo3dZI2BZaLTF1KZ#Yj8Or|(A>{Mx+S=m$|A>}%@hARG1Ujro`<Wy3Y_MHT*f zEGU!14VeV_$NuGh{MQuVA2FI*%3kX%W0g{8F;=9$rf%BLcfom(%r!-5GRKp)nc8mg zjH`a1k?(<V{Bf;L8%_R80{rW9mi1^$p9wd0VxYEK(3T55YPPY5jkfCGpR|Ba@`tlu z1@RpZd1~7Re{nzCO#AgN?8;c+a)GPa20r*9Q;OgleSr9MoA_!{_eiXnsSgo>eLg3V zrcL2HcSkTC?J?c5ncgAK^wN*h_Mp&wLYm*;d<I!_J_+_oF+azgyY0Wjzv0}?_tI?i zfu2iw_MUxCnl31l^Hx#XScZ0;ca9a_X#-A&zl>*T+liNYfj%oA2A_E-)-K;e%r7eZ zc*c<WA>NSsGd-(X>^=-<(hkMdi8A-XpV$7ZUL%yD{`=_9dr*H6^v-NUmkFWF+bDB8 z%DfIdW?X|ZzUmOvgI?UHZ9M$bvrz79D!%d?w6FEK3~P2hZxKKGu=d;FP20$4k1q2B z-(Lm}?8nMj1kV_-+^E5Q<tmOU&6hh?mE+l2#=jP;wfi@)*RJ{1@)`tQo&+zmsl&=P zzS0=Y<8l-(zLRa@T2}<ugTOPn2rl{~^!M2|{PJ3yUqX1q@1rjrQs#Z>kW;<eAe#qA zi{0qU?sB}Zj6J^HTu+#D<D{_vj-{EFiO91}{pQdt(l`&~%fY7kdUO`_P401&mxBLJ z;Kv%jUmL6oTb;N0I&SeT)u$S+gAPbP5cc3?;Lti=Xq@T(KOa2meqjGopIMLn54p&* z35>yV9%8yaKlO9q{~Kb{wUC>RwVh(<QspsSo=&HoI~jTUJ^#Ee!WXbq3<b8oT=S!2 z6rATSgI;|VZD{{i+uZM>{eMUMui=t=0pJ;a*>2dM?r-A$E2M|iyU3P}cXrTzAvwr7 zATSS?fR;}Tp<Mcp*=pc;6nM3~wBA}+=d#bfjs5g4+@&uInQ>eMbt()Twa_W_XE)Yt zECb#UXF-~U{)evZz8QFm(Mp|RAB`1w$6cJ|y@B(Iq=)!)+UqKf{iWZp!M7L6gE;jW z8qT?|qs^<0cC`=uKk+U$<riFUXnOQohihRi3&cjcX~U(yV~%2+gY#C%>A-yTVlMc8 zIOh{xR{M~AAKSzMn+dzK)sGLrju!IAwSMa}qNM?ym+8jdkS>3%I#bH`EOi>kh)hR$ zz1PZ^ejH_~C-X-}@C_B(-lTUv(y*89tuWGNBMmb1HW+C$kVgGW8fm8^tpsV07-=UX ztrTfb8)-45iCAUEj`{nH33sa(#<x_0`(0MJ-1|KA#{9lR2x$ufX<?+{Qyl%uMUZwu zAgu&x^8BnJw^F3d43wkp>i#$5>l~BtUCPaQ(2VbY41DSFtJm7a%F@RfiSmWUjqbNW zloRIuF*x5R-<?<XvyguiY$u`i9QIWy97iQHd0x1GWXM48Z)u)+*FFg6Z0>LBIg{&X zxi+mrTuO}t2k{jf`&ZB<8SB$=B91k4eP_n$_{{U(y8`Q1vmN4}Rt&cuXNF%mke{sm zKNCO4WFzoL3(!uw&pRpNO>a3_&Y{}({Gc|p?DBIl<i&X$HnjGs<4g13HlcjYGMv}Z zMs4U=U-o7m=V+PN?B@mhTJJAihrZVSR&aj_YeE?#d7QcqouV#dJt@~j*BWW?BWjD` zr$767U!Oe2o`U@uY?Ctd?d{o_*Lr&=a2-@gcRAjy(xf-1wj9^#-b}PX_%z(*cmf{2 zCoyNj>HYcw^mm7hdQ(xJ@TWhZUZFm;qkZ3^VVikhKF0aN=aplS-^8(EtK_@Olp$o9 z|Mmy<iQoR<8i09ksqal_p6#gr4G<S?@w|&U-*BDCGiEm0tB&)XCajTxgT5%+7w*fL zll-==`06az%fa?JUd(TguzkK0%d%q-yJ2jE{T9}^+*Me60k1q~wkm6>=P=TRdX9kC z$N{#8u`JK|kYCzzSMl2eer@o}IY)ngMAF~p@1sZJ{yp06-z#D_A%1j3y2K5qBhDC{ z6$Y;uM_eP8;ym$+`Ir|zccxd`)|K9|82kBcYtm)z;m8Z8%T#&)-3Px8p3~=?I@tT! zw6nZOtSdeL^kk+qwhH(^p2j;&=@M1Pf5*YEQ-(UfZ7=hj<x{+}_OA5KYp|wlUyC*x z(N-AmL;7@8z|LygN>FF-XDhrXW={7?;$7(lbMT$3_-eG#pBKERn6E>A9$X^4YZuHI zkRSgXMIS#$o>JkhJ+*Z}e*Aaf`uG`sb;NU5oIW5w{<%`W4*9X>4DwF7aK?cAI01fM zxfI_jT6D^Q{O~<0EjRYhgQr${t!GRdke?=_4*Ta5Uz(bo(SB;SSl`et>Nd#BkIo(9 z%{_nGfV{Xy9rn%Wd6u{7vVnPNHtLX<n<kfex1Bj-KwesmI^^Xm%Oc(vt{%8=CK`3f zPs4e_d*uAqe*AD8P^Sxx1M+k6f{=IELZxe$`(uaWfI6+mfvGp-CpLAk7mH1o{JegK zKXy0{I6n0_Fl9}CW`426`|Q>J*!kQS{ISDvz%d#e)8ys;b1S?@&p*rO<s5(91bH#X z0C~Bv&GL?3sO&%yUQC@KFSA-LuXRdnKweBalb4RGhkAFfI8%<BV!W7Rn*2O{L8bT7 zxdZdlX!Ixf*>QP=mzg)kA2&t#G4+Q0{OVNUoiKIazA<eS`B{6N@Lpa%V?ch)F-?B{ zFx&DzGe_xKk^V8q0r@FeG}QAJojxExrp+Zk`=*wAZ%+5ePBC3GZ4~+W%~Ihlx#pAs z`7y^e`B^_V;vIRRvIQnT%B}}>ZOWps_m?I9xLJ6GF>X|OQ(okw<CIG8%2R!N_PUyH z<d{+AgX3lNm8IUD*C`%W7~@5iH~XFRSDY92a>_2}W*g&0l?M%Z+sD3W{rphxNAvx@ zC`7-hzoh@WGb+5_pW)9hh3F6VLED!i-Vd%;I#qyva~zWX_PK+-AAj}?Io=D=AJnCv zUQy<K<5GWY6rx|-dD8xuQ$ya}r~7k#A=-oEVRd`hdvm!O-vwwl?ICF|xzO^~&5jkN zy)hvBPqhv4wlDJSR3X|;-6Z|F(*}9JJ*7DPLHo4t+A{B(D<}K<Ux0pdjFJ8Y=ahI4 z%=Ud0E&B-e50RJA^M;nE)SZh%-Y4cO-B)%AXWlZ%%jh}7)CcnLwHcM(kyDj_qUMYe z)InZG&l#ppa~ywXS;)KjOKJ{Oe3YUN@-lkPFvlf%`Bc2zyJ@cPpXBoXR)1bh`I4Wl zi%Pr;7Wi}e!Xo^bIzoPKoL=Eo%uxPG5q?Y^CqLIMuk_wr>5qw>Mfd^k{5T~)FI-sS zt(xQ8rDFV;wub!7z}UEN$-w-WIzxWarwsMRo~3-0BK(+oPkyT5qgcxZ?jLj9lApV0 zT3+<C{=89)AJg`bpHA>I>vIF^n`uAE&v8>Ky$NTY;rm=g_%X);`T4=pA>OaQsQmjP z{nHrepBrWk@zz}6&+D2Wxt78Dq}1ucdq`NTAilyo`<81me$Q4oH{zQnoroFwd8CDT zQI%I_<WcvSSE2GyU)Hm+rs`2^Djl=b-v{Jc+d4MnoqWP6Sd(_jxXV9%y4-ti66}bA z-=8?dd%Wc|#CZMutD8%_W8BHucLFTwMtlME>1Vz#V8$k0yr)rtb)1f+Fix6Zx1zp{ zbsPEa!df!|S#a%7eDV(YAl9Ejtp7;DJWrs%!KL3z;Jc=*f6qxtoPFz*^_h1s@J)(^ zvqH@F#v}e#gY_xb+TnO-Iu@HR*TTeI0^D3TBL<0gCV7?~>t3A8J_>7IGad1%%*T*U z9HfPMuHWC8g>;_Fr%v%)0qF_5^X2<x+_#kF@ouktS4p)Kb8udw2);=QUkq(%d@;P+ z&9yjjPr@1>`<Ckq;U)e5fqj<>uB8L<I=Qz1`G*k8;aN!5=ldS_P*%oX3we{W!rEEy zzpZrAGX8AFZ`kLP@Scg@qbUPjI5)AL-^&u%<Dh<hpL;+BWL8SvQJ-yvArqEwflR)O z^5_$}zZ~Uv9uzL_C4ZB+P$#bFvoSt6HkdYBrB&;+0&TvbXyJKKeO{9Lx8Ff}Fs6Db z;tp+y>CA_`E=8PW5#%)&d)uUSEMi}C5&v5RJk)_UdsJ>d+M60kzZB`D`%a_>@iTt4 zSe<Fn`(>X%%-hBu3T5$i?60;2;G-36A^!&MzoKoOwpQ)OGQNX-_*#vt5@pvQuSwOl z0e1qv&h__g<h}#mK|$<U?j^H-`Ck24Ri66*D^Om;OH?~rFGA{E^`Ehy!@3v)Me!^| z-9Dbu-h9B#c^=bV8(=LbZL4&=i+vmhozyixe-C_y-@5B-Z$ej`ON4MQ#uu+}#c>gC z!@V8XCR|Ben{lOZF;Cz5tl@3Q<E7K|J&iPd>9mh>CyoQHXDhl`-h4jL`UlJTvQ7*j z^V9%&ru;rkznS$4J@*_yn*x2#F&V-*qOPByY$3j{B4M6iU_Rb~lJL<1_>&5rpz?9P zQI^NMQL_A)0L*Wx5ueVNF@M0iJ-jc`FQ5B5EU)n+)+}L7FWz_PR~~!z{mO>}`Ltog zC+7g;o7ehW6!)39_n`d-e$#++Anja8&g=A@xHpRLG$>m#4SV!@Pc5wM6ZV^HUBlL# zj56)UcOfDwkM?dN@~$xQxED#g%)H}}ca(yM!j>K_+w$}2KM>}(6o-L6o>8b!Wvfv3 z<H#fbI_(6cHK_9Be~WrgmEUjW_f>})?T$n_xd(xAnvbDK(|qdpI52mX>p7tm_{&(& z#WyyU-1WQhdtk3M9?mD0#E&z<s?B%GecVA=b55tM2ilh*O{V-f2b!|JDHKlg`y*qZ zlgwML&vpVY@oO0VVE*|$Ll(aRZF-*2dLs8<!6Wra^Yv531NBSG2YX`v8ABxxJ%9BW z^1zvF?+Mf;u3~)BpQT<>AN4%Wy?dV7(|Y)A;Lv+(RttSmsk60V^asoF%n#om3}G*u zFz3(E34S@~iT_<S$cTB+by+r|%IY@tH%^MZhiKACy`-K!r}plM*Kgl%ld>VqZwGJ3 z_cPYw><4+&<w(CS!*kr1>wZ)3iD;TFMWd#fz6Eg{D9s%6dc0$7XNEXu<c6ZYrl0<l zNtf1X(ni^i0c}IUhoV=0>lN>v_M=yyLjjHQ9my{E7WA)KkKc#M>o48~)w&xRoAfpV zrtipaVGn~&^1I@+KQChJ%CiHImu{E3Q)u5%>n!^QWir+9FAMQ`iQ+TJAI{}=6E|f_ zdU-Yqx>U~ZXn`LbKk>goMn9VCk_71En1#$_9i~UrGy8~ou5C+DkF+1gx(ySjdd2K? z+#e4fzop5tWxPW^!e-k^Z$0FLb%$)9-yh^zru(ae9RFR)?x{0gwLA}V|9IqKpB_4u z|5mT2@dN|!a?~Y0`nzn)wOb|5D-_Ns=!hy^U|(w)492^QlnrHtwbcET0by%=ew@m& zfHilXX88KD4ce@8fWP?|{MH9_hU1ps8zdc&kH>d9SmsPg8`hJsb-{9FM!Bgdr}fQp zd>zv|7gg|Vwf49dWzF^|3*Fv$+1?r1?;(w{APr-Y_I+I7yPsZeL%+|0T(BRLRr>0` z`v7?rqa_xgr9-vH`LU<I((A=}AhubF^xF!w`8~9GD%#XGm*bUsOkF9)(|fQ(l<WNl zPwya&-;yNVIJYg=9a{dTJpQ2Su0dVMNYb_oX?iU*agcA{euVk<N0@Kv!{}#ShI4)k z%9W}1PDgvXFD4uOza{yfCfj%(ZJbwt|7GBRENG!G@v%VLC9s*gZC!?KABu96(Pn&S zeKWq9&Tm8LXRe31R-=98y-@u@sIT#fK%2TBxOOA|T)P#*u`ep}GJ6xx)FoZctYgXy zjtS4E=J~}-4E^dA<M-cDj&?%x_+j~d4)ry^PX*dMP=0@idek}kLLvOV4|V!8=u<u4 z={c9Sg!WMTBHC8!b2!;X+CJFb0)A~1?4^EprU~}Hi8e%yMc6#~ZHF*)0`ko^!NxG3 z=P?)$()jsJ0lsg;GY+&bd?!Jl!IJA_$e-hiXRjDf<Zq^s-URsLnF_9>8Jl4q&z~@l z^Vye?PoGJjN25<h+emxdjWanxzV&<-e20PWz4Lnuq$T2hLylLDdComdgF(vsN2U#G z1l^>KdQE<$UB)wcH_sXIJJQ10D1F8V?xdgZ$uI`SIvt27X#dN^&+{z!v60;&oS}XO z{d@bUsUGG7sh`?To8<?Z!`YAed<uW#hTk^gcn$JQoo3p-MR?}#I0(GQKz`3g8T#Gi zpFW8x3zL6-hbYLu|2rpsjB;`j{<)@m25p%9{{k?_bs_$_rsMiZ%PKWM*@0vweRL%U z&BrPS@2#pc{PY*L;hZ!3Oy^U_slz-o8AAW^JQ>I1)39ZF?Q@`g#r6lOGuY*J(t8T; zSLEAatQi+|=rN=dcfUN)A;-k{E{}B3Ha~)L>%x|YkB0ZhlP|k9U-rAI?5|OlzJ`gL zZNA0z2IQ~58vvW!|4dyTXJ7j_17{&zzuzBMzw@VT?`5?%(Y8yEVag~-o3PW~yU?Xz z`b$WYeE>a-wN!Y^UCjS(C~fu!=YU|nM~!unDtrG3=*4K1WnXI_tP1|xesy)5C>K&^ z^<h)wJDrTR2g`?Qp|>0dC?CeRIoKXz5`FSe`o%omuRlWhppDbEy^t-ZAFpHUv^yN< ztk1C&q=&Is>NkD(VBSiV=iA<?GOkYB9h5En*mC|BAMFgz`OEl<lB1LZV=}BqyTNZj z$vbR!*3>ETZL2b_mDaqIhGM+ySnP_E@a+rqHTfiNzDvVcEWZmHxk`v?T#dMzakb)_ zjq6&Y4(-n!2F%#RBL+<Rw;3?)PmcjJresg*qXF|}ce4R=Oi+f@bF;s6ACiyCV|;s@ zaPbaN%Z$7qPkSTlLXXE_Pl@)}mtSFA#okBIa}ecEe8N`WZo=Ml81lwmm83D~ADA?1 zonrgcCH4ztj`OzNoRc#X@m<X0Fy{R8%vjr``A(122R(OF@5z&#ztz~pJKWOm9!NfB z+iX+vVBpd7L@^x8A>(%Fc{|$o$Adq&kq6G>mn%AXW`N%s<~%3c0L<_7>TmY29jVX2 zL!QF$fylf6?w_y2mw<1p3VxXR{vZ4<X-iN?(uz8qQz<L_*1+Rxe(i^kbn@IN-!Gy* zPX>+Kt`XvQxc-Ez8Xq#8i;Fx^FD4@YQk2)<X5>1T{mFMFb^3hd(<h*x=Fit%@;icN zeiQQBR5_Mu!ZY=Tb*MKIHuOfOqaD0Y+pits(emY(;X2yX5sZ^s`XQv9V}yQ?@~z}P zqmNg&=iBi=Kv!UIWV}JwqdwB!d<AkWG&an+qyct{a|Csh{SZ}k@orRY>ri}i2;Z!@ z5@k$34YpCP=|-SkmS<dm<y$I-%JO`d!z^E}%2W4$H^~1z(z$^$^gHEPKpD!2dRu7j zdmHOE)2~1*tk#_XoUnI`n?SGfRhm`WcBe0`MWxLh-Iq2|rNzherNva57}u9}oWZNv zX8hyeInd^9NA=ayZ8}b0Io)P;LtmP1^YtV9(y(^!*1R=0g2zBR8^-pP)$LRt)t9E* zi5}gTrrTN9)Q3;EA<qXv?v%0Ff4XnRf*vhbUADVO*#?x=H0iRh6)DTPR@17>ZZA@n z<3{tK%l^Db*$?t{pH}Z~Jo|CH!=YrW*KU)>sI?({-n#<ti$Wf99-jtUG!8v4X+N0n z0?`j%jktYKmh=lgW!8mFrM_3;_gBxxH&F99RXSrMzbKGy<6YY$2k`YBv|+xVVnyV4 z$k*#{23XP_Zp{VTEBzSabb<EBSCaM}bY6zIps=TTzk{!A)@2!<<zg8NG;gObJ-}Gr ztlmd$Q)d@6OgnAi{RI=|H}y@J-|9EpW}BN2@xS%+*vI`f3)itH`u>vKm)5q8`piCP zg?t{<@5CZT?!b;k(6=e27mk`Q=(n2XXz$E&z8tYP5-9g3%7qPlZz_BmR~T*9C|tUq zEESXB++mhGG*B+2%9*qgpXMQtPwBBq8_P8)+H|>)*7pJWi*}dq(CB`+Oz98h+Kc@Y z`A!?Yx2*Hohca&>@)!#<^4OouGt=0orcaRXU;4r*%UBEj;9x&Lg)tVKE4c1A<2Tep z&TqWazhVD#Z%B^?{SGnYDZdRmP^^bOfVLBy|2Z$q-z^1gTz57h|1sE%v(Sf(`Ot5P z;kgOVR=L~*xZRrI(*s?U>7<R{cJ6IXOMek-tJ}GsLS5rKU2J2_L_fYnpFn=Y8tqNM z_-A}W?*nSxc7d0?l1JjD{CNJ#r*(9?vbk@q#k9)CaF%y|f7NRCeKIX0N1(nvD#zb* z=DWY`_FXb&wGup%SK?+p`ZxKu5c8tnMPE?14VZGE4CtHu0BariIQ+I@LHY~X?kCOx zcQ~)6e_tH@$^AV&UO697|33+NX&o$8I-1udlre3Ev^9{^vHm`6K|ApU$Wr5*5U^GJ z&OY^gApG>{_`L(tOBqn_DFfYC^MK#vfqjlOSe}QGiU&=@fwuX+iZc{yv$a5*@Hg^p z9ujC%+vH+=YMV=5(*v~o@j$!mFSFef0`mPZ?LIj`yQcl)?>A6}YF#Ghf<pRc>KfNu z)Yr#se~wwdv;Q8a*`Hiz|1N}bBIYsPc|i|;mtFakzZ>n(O<afMZ3tv-J7>Ya>&oeJ z)a5&bkApUabIeTxv^fy{+^^N^MV{@{cu8CJ8^!sczs@xZzmKQua4(B%=Qj*mXlFR4 zf;L#!!3)8=A-fFUPv-BXx5x0VBxn+C7{5sWF8qXTvF9=;V^8s>Q@)jE+PzG3p35M1 zfpz2A7S7DU)M0(SZDY1Q@x-nuaEKH9cW+(H56$AH+%do%4dgW;Z)}k~{!U4Ckvs=^ zjYabKo##3uPdJsCl-ud?eRm;d%HNj~c1OBiq&&bG#6xZm!QS_@%<xXCEZf^thTnPX zS^2gj5{P%r%z(G`ghQxL`2_KC@0j>#kBQTs6x$ob+pcgP2mHnG?mHPWOOn?0KCQq< zT=ooi@AlGNJGXc2*lB?#E3qzX#o_<9LEh-^L^zo_8NOzj8_9AGE^Wv8)LA&kfpmOZ zF?-9*hBQw0d8IS(&We+)f<6o{1<jFEXXc#e%l0xZAkRsoFM0OS!aJ8%+nQ{tI4^^9 z9g_EQ@V;*~zGZ-ZwP#fAjfiT`PCQZb0_GgNuj<(|ti6DDQP)T_<#0TBrQD><T=3-} z_Nw{-x+`Ty`ypj^v@bLGW4E)OmeF5T`|La7`Fmva9%ADkMMj_fkTRm~Z--p$Nstrv zpzKN3Uh2Im8|v9dkqzq=lZ}agf`OlOSVs=eLVi^vjz)h^z`hV@qC80h>y4OHwpW&$ z;M2=I>a)~km9Od5>FhV^vrZR9`k1yc*vIBL2=?){Wg)K@`@xiBPjrTNKlYZG#^<~7 z+-~!?rDw`>x_1u2xK-(-gL0;hHejEE>9?S~6|=L{)rjTe*o3s9H7Sqq(&`Rb?)aJx zkLgudJ4IEw4S*W}S15QL;JT2HV<nyi#-5|#4#4=m;@!I4YXDnz!qe~<07p<>(|Z+Q z(#tWU`v-BNTC;zi#kaUA0~rH~J+bR)z~qhJ@kqI=q>cC<+SL7_`;mAf7%vicp!|1G z{&lR!bv}7$hitX1XDGTT#}?L&V_q=Y!}lZe?bXMB;vIL9-~YtdQlw4}b@IB2I>!g< zaJ~_3<Y`UbMpG8#qZD}Cfmg&~uVX2mA@rV5ecni!ia8nB?k?EwF4~UvQ@e6b4DZh) zoqENx;8FH*4a(!JO1H*ASyD%aA^kn2bA<VgFT#8-!E<|z`ZinYo7smE<Pp~N2*A2e zWxpvM{1bd=OV}P{8pSsm@;ZV^0y>h)>qrk^)~D=QAF)FT>wY!Ir!K?q{6u3<?8>}f zKsV6OTamB(+SeWU0ib!a;_oH2Ntil7exFw~P<Q-(LI20uH>>;2N%d~ZI|(*}^geMW z<U0+&rwKV@pEL6#;J}#{?w9a;H5tnP-;h?K`m#`eV?9;QKF;e2<RxNB3+HQV>%|Cu z`=Yi4zte%a`bhM*oU7T_Z2$Nfu!*YA^<1s>hB~VIoBVx^bbuzTZ#aJQx^x55^KH9N z<$23MUxIqK24%_D{Q(>a1IJ0AiL{Y+(uUvjF8?iX?W3-@Q=V)0)AcgQXI~LrUnJXv zu74i7e(8)Z`Yb)CuF27!X#Hk87pZbMuiH=e&qq4OVK>UkzSrY@7SgrO`TEgkTl(aY z@+PRh#&?zS`V@=9gI3qX&tbKM4+3rFItqSZqg|hCbn0^<_)o~WKO#C_$9U{+MtXCB z^ww?l(tjr}?_wN1#JCXf5U$$OyZfI3Z^FgjCy>8Ua73wRrv`a4E|`iTz6>ANzHw(* zbi&t}>4j6BWqjW&Vkb&ku!iCJWzK2ZCrxbWN+<A}YY}Hdu3vf;-l1{^!Pk#@iH5G7 z#2axt{4!#jyl)oUd_PcZ^3&~<pKho8bUWe0?zYUBM#LN<otbvgyF<3)ZpzJy?A$p9 z=iPYbXmmC66PZwBM`kI`O^Rrz#L<9wj8)y0*{pCj;0)Z%#+^H_#N0RLDb#7+fc#GX z{8CL9#+cuxgL)#;m2b~My?FJ`oorvy(%gxB|95*uv`e-{J8#94*sHriu6tp}u^fwg z@*cYZah)5m7Mo4`eqV)nImd6YoX?n!dy7oRn0p*~a=suQjN8m1@JFkWUjls-Vs#GR zForLkJl5lwaktBMa0a$KiZXI-hI3g_cXe(s(yUl3>^Ju=`sX1H$4>r~n}D`0h2w4X zYqjv(X@MR51@z<E6yp2PiJr;+{AIP_J52C>L+v<=hILJ)_~EW{aSrXva4QxGMbaBV z+iXw77Ywr!$>EVi(h{jVuy6K%cOB{?FZE08(c&8n;3W*+K;-TgXJeLW7UCvMZ+2%P zX4RUzMAEh@E8_7izXc=2d0tI?V|JXA94?%vMxcHb>qXii7wDGdp7Q!H;FngrU(1zA zS*^{>>Nd!#6!RG7we^-*o_i1LXWBrFBk=5(|0>F~V9nLj0edaRz3~Xwv9V2vqhU<2 zjrdJ?-j3MP>a-<Z#NM31z9PP<gZ_n0Ew>!digD(qre;Gi^7G>B!ooK|?bYdo*pRmD z7jhBX%3f)+&P?x5<SDi$*Dn0EVkO$_nKAAS{*Kgi$ZFc=JE1Qd(Wk$~73Xh>mOt`& z&=kj5Zi{(NBI)(6Eb~gxzk|`<&%l!<w&$$Pq$BRFNBP5X=Xe#VTXP}_839-MCai1Y z!0T>E*Wq5BcrItR<6HOmeyJ6^9^*Werx7tigsnc~J%)Q|^YwTS6#QWwM4CbkooTj9 zJQngg@l83)eyJai_`Wl~9S7W-TeJ9`_ipSZ%CqX0INNjFMCfqn>MYn4?s3AdcUNOl zN#9ibdJjU_g=?TP|G(yK8i4K<$eTMrK6#opK>pYQc|ErX5pnNCTykTU@7hHKY`CC4 z;amZ9-PD!k=%+^N{tWogxYNGMy7tB_-hII3*Lwwi5cWK~L+F2N6L4<!`+o`2Se|E@ z*q+%I?3B#w!}C(E4!SxE>GRxJwo3K?Wa#l`^#6TDt{)aje>#x90kEVG`mX6aRnzSH zX>}Y|(A&vKKU^feeK^B)G@dQ{w>cMMrdm8#VmZ)jd?PUeon4A}zJSg$KEZKd3Gl7P z0>=Qx)$1G]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 zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy 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%0DTM1ka!ej6ZR$|ZBpDG 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 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSN z1cA`Eg0#0MOoaB~ha&xR0mR74D0BY(*1@IA*<tAC{Asxs3K8aQ5{;-53Z#>elYGt= zLRZKSGJM2dGrkVC^h}IB<F(6YFzG)(hw`&BMp^%UWpL>V_B{o^D_5aRB4y0P{>IpA z`4G&6I~#$<FGS7QPJ`f&GASYc<MlmO0BL%n-S)9}5JZPS+b8=JIjJ9r9j(F9dIz0B z>ri|cJwbyn#OZJcAs?bpG^I89A(-Ue39F|~gd<>_u)TRmHEE#SM%>&L?Ejy=w}Gzg zsLn*|935Ss7NYyKEH}dVr&<w?(qV|OZ16J<E(y6&JWS?d)NO`<TNu;R@$&E-Fm6AG zxT`P12*-gokc4D-6X9X9Ob-LRyh&arkg-C3mc#Un9g;~hnIUmlta&e)d88BLIOFH> zec!jM>ipe%rK@hW-Q7!Dx>dD*YFE|XRdxQV&RM|UoYW<YT*We#sR)ooDteFF>FSAe z5)G<}NbM#e5kETC3m(e6*=MP?Ke=PC=pxr=-Yz*eM4}hMF$5{`4P%0VrG+o4gd_wK zBQp3o)X9K52igk_{rJOIc_URjyb<A3mvuF()lXAjg*L8YHSSB%N{fJmv76H%98ahT zNQ`4_#K=sMIEHLA4w)AiB9vFD|2pNHb@-nB`AfRU^_jOz&JB{-%lW4yoRgR;j4=q0 zk!qCPi}}o84qE`tnZUpoqxkV}5=WE~rAO5m*k>Q~GnUG=wn`lc=aXgnT504t1#mU% zQa@T%@rTo?7;zSG^nC-)3Vt?Tj8}li>QG|ggGro3>qslB9*I+gdK)y%+0R1synur* zeZiYydX-ppSxm9y7z6wwB`zW@Q%M>j%+!P-t|<VQo-<(Asp;XDts`*8*ujcAFJZ|% zqMFB6XnbSHw)n|7Mk155fmo$k26x2E%4lQfKr|2<v*BC;$T<%a-Hs<ONULm*QX<vz zoYbG>np|>*sTgA>fxlu$PE#Ya>L_!(b2HqI2EL%ciO2(|A40HZrYw_(NJE+t=PX!U zDR{$Vab}LGbeJT#CDD-@z#m02$OJXQJ(q*Tx9|mQgLP#wD)~g`zA+pCSw32Tc>iQ^ z6LzQR$JCrv<2tf%S_;`nX;9A<FzZzG=8M)5*lc!boOG(T;-*#4K%Ck^rMAIIv*JEn z+$ZWPu;WZ8SrhjFGBt;@E@WE*=RARAqxZYcV7m=`pxN;W^ns~#f7smOPX-F@pOj{+ zCer84+;wyWt$R@*98KK(#VU-N1=Tc7jifOMaE#{-Eu;+(8mpuuSG+R?8XKh+lYs;y z#te<dQ5+sPK<XTaffxSzq-L?Wh6@T}>>jqnu@i_DV+j-Re6END4w~}`zT<DTzG!W7 zw(cz68{I_%;M4YkA;BAv4lsTMV(Sy<K{Wqj`^4Fhx8r@P90iM)4PBALU3=km6D(&s zr_z_cXxEJHU|lm7JX11nfdr40xR6V6%4MhlX-Ev6CvYd4^I|mxM+G@9grh?}4*qI{ zd8`)K>7%2V)Brw8ay-x(50>~MUBZK0pa;AhzX17v9j86M$Ww2FZ+u|`Xk^_<sKh0k zfF5jqim~^QJIFvsz)w-#*^})^aVq*^RtokMlZNvtoLPb5kN=6Av4lc8Jln{}RLh@t zN%j}B37c2;i~BsD?Qq7dnY4s58N5?zcMRW@jxR6X9K6|c|Hp8Bve`QO)rY=L;MIm0 zy%NI}j*RP+ct8X=I0%h~j1$C-XaM5`ba7igcfQESgVQ}0`~vPlo~{l#Zom$?O*)Pv z;kW{!aEwIk4k$FJGrx;vEI8ZKT^L7+8W6_?F-%?J9%zW+lNfs9xOM&<Pb#y)7P4i5 zEemW}V9Nqq7TB`DmIbyfuw{WQ3v5|n%K}>#*s{P`ZGraRKh4M4`V2QO=r=_<^HFS6 zvO6ctE4BCcl+N*UJ@Kzj_bJ92rohsyzF=)RUx1IWu|ZAUp^}%kiiZqSN-bGge5B3` z(B1ZFm0M=YNG)CPid0QxEi`loqnMpPr7ZrmwUTCFfD0r(2F0j1bD0tT%S*a+>;%vK z@WvN@ZEA<nXk}VIKrt(ospK|A!~iHBcGqDqoh}~Ti^$m#l)Fr*5qeS`>ZBu=u)nPZ zu~N3i4|s?v5z--6m}BtUOmIsbEfxC(dtu!kb_OML>$GDtYjPU8qRzZgt>(YYbt{2Z z_G_SZs@Qx=f*SbpWB_PWDkG$ESXaL#(^aC5K^j@)2@I0h<5+p%SjzpPCQ-FhfnO{R zl|9-8$C{evI!<<=g&3r=YM>o}5x5RWC((t_q_S9kH<eBL-s4zS*(p<!D&)_RRCz3* z$~(6ssL`Y)fo26erC`0Rp$J)j%`FRbEH=W!S4rKWSuU*9_n|gpD&<s$!-!+NXv>~Y z$uetax_rml{584xjMH5zA18CLaUbBujfEt7KK=k<%V`=kXb|UAW)T@>R;)q70k+hg zgJ8SV`F&m2rgoF;l6g}|g}W+7Ef7qed3{Q|v6j@QG27ZG8&p;+yjH@wbW`f|;woAD zdhLa++o~_lxubAOxfThhDr4qlzT>Q0n$ya1=W_a=pV^6cLl(n;kP)$p_<LY)?v$fv zQl%CDty;lv8KZ+kVkNSOMnM@#lLQ;I9{};ZfX~qorwZ%zQXTXz_t%?c@^P8yOa27I z<}IaxiBGn{C%D0))yncQdMwQn5CB?BbdCk4OMSm~X&0jECfQAHT^jA$6YAYz23F_a zG31DfLw4zimtboad^0m@Fo7{U-cO_=%w*LCkv&U1HyAI!@WrktjO?NF2oiWENXR8G z7T{T)F3*A5#1H#Sv#IR-nY(VsHP~4K+Db)Yj8dx}1}4W7O(JG4iJ9iLi5ixft+n!i zg?nOn1<tAuJ12Y&hOgx{<Jkrorz;#?ItPxcsmyChUhC0Wbu?Qwy`*!wb0x9+Z1f3? z#}|0;hP>^19<j)glOL;0I?pqL#dF2x>(%q0uP5;0@a5J!UOp75ZJkq6atxKqmhy3d z1O(3?c;#92&Vpc7v9F8*9Y`H9UXN2Svz>Mqk1^*7{7v55&Y}hthYD1xvw|8g9JZL& z&Y~J`YE}NWboRfgicdpXe!~&xyFH=qDqSb^%z4%`zHs?jSVf$7aib4h;x{YS>No}a zPZh6!Y-+hR$=5}m7w`jTVfPxs{wr?HO7RLJy#G8uzse1M;~_Pfn%pTm)_Pp-j^z^P zbm9-r!rBjwUKGa{z$eL7vE4q>;gj^<d(<P>ybZVN9o#v7>+aVdYQ7`j=X(5`XJG?^ zPliV6lg@FX;giX0-f>N+`dzp0d2-Kk^Me6D*W<rE3y&xJ4m{qbU8k>aKj%_aE4PJP zr`@oxN;!A2_nd`3X}6sx+U?#xsUHTr`RUyC%Gp<Q_(Dbk<8HR@mv;8GtiKxV?@#On zmD+d2S$!IDcl%GVK9$=k?IZino4M;nd*$<Kcsb3~%q$;1dJr5h=MMO}9{<hhtR;Gp z8V}=V@i=ehI}ltYFXEfXLQOU&UOWqr@v6&tRk^h%P8>YAzch0_lkD5q-tqL=v;?PI z-3_PDS)V*#H1(O}>Z{x9IkFHx>r>~fPio`jq}m!MXSB2RGk2ZG<K(v+r)Ay7(U4t- zMAz8pHEz2jN8`iQbKAWNi-dA8Lk+*Y$%xo|1Ny+<=@0X=1}~RB=Mz7RSC6g(%{BN| z2WFlKgi4$Y=VwV3dO)lxxqwgNrCM{Itr7EwyZ3x|y*lXQM}(&E;h-}IYxgBSPuMuD z^F;Kox~{qN#h8xb0%esPtg~X&1+)>O3!R)#3q1s&t-7>pnZ@&4{=oq&pqtcKVY479 z%ql|yi;WG^#{0^rLEdy=SuZgB>N-BFRmaqDTE#<=3KYcs_9C|2jT8y70n4f5H=2;V zGck#w;i2z)AZoZsWsY$G)4PKNk+Uma!!n;+Z{P14Evc%-S7h=VgSwW>Nv2$N8gto? zhdkjQx-<VMd4_>nPAo3YA%yHhqC%d-3olj{-#$Z96SYuVC?n;p2lhQ_Q)f-zd4bS+ zaC3Rr;IfoY>s$opDf3AmMyVwlOei=_DUkCt(b9<3%77FzgPu^kk({7}Vo1kLGSsSc zm6&kl@R@)!qqSPo+#rs;y}#@D^=j6=lXlD1ji#1`3MF#fz?)FvEyLN&AOsk!Jw?*M zMKRDc(lgG7kdvbEA-Xd(P`bBFY9+yX{6aFMP-hRNUKmJ>CmrH67t)SuU6hB#f)Zx| zJT@<n18xoRU?nCF%`~I341l?k1o1Sat(Qdaw`5tP{Y+?Atcl%*li0{H2d<$){F<rk za-=`AF?FmoYCt(hfTNymDZ}lRmauuniYk#W3-?Z2WjdI+UAq=&VHydo_Y^CK>CN(@ zX`6vgvzz=G{9M(PorQqaP5hELQgR)Gt?^M}A#<)l%@?8i56SUlZR-WuuCcSGJL~aw zgPcnhxU%$p3CCElqEA9C$s(9@U!a?_a6sORkeeTJ03NjvJpx{=@OojDVd2UIs73y> zJXM}6SXDH#3=j8r-sQ9~tm`W)>nmNWK%R$ZQs6=VZ%G+=*S0UrrZ!#4;#s9;Ex*1D zkmHVumf#j{4K|>hcEzZ7!=N{uW33EUnE(4)BB#UireCS)sCcA=SdlA@S9n0hq(<tl z<SNSzCRt)tY?Nu>4H6M{{5GvYAJZ?zyS<~%lRou=fIgj4!pM$;5-W-SMZVqYZPEKP zVXhN)>x#~<PFYZ0ighVnO;$K=WXQ!y$~Slb_#knaBPY7bjZU;+6*H8M;0Fr<_$<K) z8BMcMm0j~<IYlaRib1ev<(RJ2|5@sqL9-5t{$r;#_??}bc0_2s4&!;n1&cAoJQ^x7 zF4m7MDr=AtA^>aC%&tI$QlI#mnvd<^6pry}E5eqD;eiHD2jLxf?>vETy=0RbQuxCu z>}I063?&T%%YY&Goj{6{7Jks7K{p8!Q8J6<QT&v}NC6%#Ff-(nXvXIw_pFD?^?>eD z-B-%o)rA347x{`lIRuCCXFGLN^24m%zzPxPSt`!iX?g<=8aT$cc>4q{YCQ}W;T$00 zwPXtpG58+i6Af)wKBi)=^m00(9!}S2Nv`^wNPMJmTGh0D=k7~#P&YFi!86S{Y(iz( zJYT7h!e3e?28TP1-SF`wFtal`wy2sAY@+jwvu7ZEe!!<rb1$~-%NCI8129tDbq<a+ z@d`6=TwDQ9tg3hqnCTcsi(1-iMh=e58}KKUk-^%8LoD#~10D^B*R!BGS*qa!Oi>p_ za;*P+B7NWfZo20}jl+h#9ZJ1a>yboV5?wS%?&!+cDB~ov%zIwIpPya(eyvJ*v)<rm zm73>u2a;Nyz^QSBUGN%b$T1$CXq<#CPaMP9*Qk0Vu{;IP>U@FMoRw?t#+D~BRpIB{ z<03zzBN;>9{+R_ZjX+|i&vm%_w9i&xqfG*T(^B3@5aC)7BSIz6tr4fn=qyWkEQhz| z5T8Ypu2gFCf|s3LdrYx^5u1Rr5zIwO-I^r}JmVVD^uVaPLTyhQ*}zBCtrzR@n-(ok z%%==J$;r$@>imHJyT4~zy&7w+igYh#LAQO)Ea~XZNi~8q;6v$ydmb6ZrFo1;z6~`o za`S|~A|6r~t6dx&Luzi<yuM6novC>}#fOeKO*Tbw=Xh$z>5Y?3^~uoa&OO<#S2r)Y z_tzf${x2*H-+S3*x9n<Op}zRqo4+vi>Rq?L_Ok77*p==0$ezEv<+b<y_<jFnQjcYS zck-)WRd>EGJ+4+)&T&`d)&K749S%0tCzGQW-EMYm&&KY#7(N-j;^3zmw=~ohv+up~ zkN)w!SM0y|)fZoO*{;!npS|V%_uY5<`|fMqbLTya_Z+(Co-|ub$0whVQ-Zu<=WyZ! zr+uhAabokDA5H?_Jg4TMRn~eTKGHsN1V0?yr6{*g=zwasS3PbeK3{?_oOVMt(<kMH z!m*kgo^z`RK*okG_{0Hy5=B@^k2pcH-L}dG=6MjmGIY&TZp$Y6Bx;wAZrJq`!1<)j z+rxx*`(*a-y-yr2<ntytdim)#WfOg(b`(dqH<#+gZH<6HX@5oG!rqM&(j3P-EC`*$ zF&+k;7W9)HkId&b_R8Gl8PUrt#NF=dkT~}(D(zw{UvbxuD!jS?jPnGpJdL?)#HvGc zeb|8)-R|hTmhhb=rui}4^%_u(DWPRny=zn@W7I<et`w;+bcdii#3eoFX3`Y1#aYpS z!-x64f<F^y965kH!2llJ+dEFG!RVWhU;n79CY{r6uh2_+Up}ij-nkw=FFo(<X~ki@ zL&B<GxQjJ9K%X2><#^$a8Q=V7II7TTA$`92<ZOFa)L}W62cImb$16U;{@#2{te&?% zdGKtTyN=N6ZtiNg;S)a|aQ=HzseL=h#VHw{j+z(HCpP^T4H^o!Jq2v41$WrS!$MED zyuWcneyk*WFN4IqWbdDkdS_`;)ZPzE#29oF@BJ(uHwm4w8QS|VT--S7<U%O=0#b^D z9wYk_X<+I_IltkA0`4%-kAg1;ad2?P;8qb7XAZJ%I0&DC_@Vg$c%-BlH$BTxx~?jd zPc6N8aV4Le%V@2Z-i$g3xZ}-|5tFH<ANr6`m+o-<r5_?a$ZKU6ot(>CoErr^#7hsl zHYFeRvByI>_5F`a-v>Dn)ljkG)r5FXB_H*qGZMKvp1SIAhUiBbMuF3~Y73n~1{Cd1 zFWFO#YUMH(C!7G_hB6vy#;dE6U;z15wa8Rzd3x%8UNYol?i`rrPeOdYPm-13w^S^+ zRjYPY8EaVqfTK#XBQTDlI~XrC!Sr9C!Bj*m;Aup+Ouut!p{q!VWRB(uAv16kC`7`g z8BaMM1urWz0Z|8C&hBQ_qIS&K3t@|*k>tRfL?M$w-6O-hk|@#by9P^(3<FRHO;M4Y zzKMy@!+WVj6+Emb>BJ~sG&|(=@v|3n_myJ@tJE^(sHq6Z*Ai`R9Hcyu0ZCNX)dL(n z%k|7-F6I;8(w-wK&b3cu$Y_;4h7FNuP5yFDuYr*%rO!aJuz5G-Yja%=cQ>`1TXVf& zH~14a-h<XUB#W5kMGn={C6P|F)WR89$H16$s1ubH)ev&MCRIz~5MOr}y^@h6y?W-< zj)LksJ(?sftG*^MP$-UtsZIeUyjaqsbrjiLuyu9P!fZe(<2Xg#s*-GE;2D{_%9M)i zlh9TM;}GNug-B_x?LlWb1Jjy60}tS?7NP)VRB;cF^C@ePdsot`DgA+}Q?*ChHs=_o zA+d27wwQn^bC(d@#XSceA(BrGFg4F$^8poS6$vvgLYV{?GPO-3SmTxXY#V<bBGz;U z`Jo|KA}ijVz}+wPf;O@&+fqD&<P2+ocv-2%c((|BHuW~%7GYDgfhhhBq)^_@C?X-! z3V>{^1O6>hgv;tE!ZbQc6m-zi`H(b%TZVYDjvvgO8lRU@wuHrXDVBQ~%J3>dOM<Fe zNM$K*bDl{EPO)Mml#~;EsR7?eC5#Bqc4m2OkTl0INJ*ha#Y`JzEMr28EMUffZpo7$ zQKU&x@hp-S1Q4MC6eN)gmeUM@xX>aJ_Ka|aN;g7K$XG;_&7=FncLubbsGd;<AN#{T zVEXHAtcWsmbDvTVsQ73W8ysRX%D!MA-6|AlrC1kAvPV#sKzngm#E?%YEJ2>@+Vb^D za!lx$IU-0Ef?O2}6a+CH5G`yhw}xKk!5T#mS`4Wy1cc+rkOL(E3a~DpQ1ZO76&!o! zxDzg!A%;=2v>S0r+2XRRjU`|4G4UeYRuT~UsRpQO2ZRfX8pBrbH7XE8kUxTNq(i!f z@2|YE&*nL6!ZB(JrJ@%>Vu|P4TcjufBjGqgrtphh3W!h`*Fkj07$ZwzJc`68l-;H* zM`(g069x%k2;M>xSqya}#>sI!{4-dCgpxKNEL3XLA_tV%1L{{BHA%~T$^ek#mR0J0 zMWYr%M3w~q(c&DfEP*@#D>>p=?(?(~OPYXXh_}i!{!onbAfzZei}DhMt;DQfOOZ`T z3_hRel6eRT<A_pK3nOoj?}q`T;>(eli;~-zl{lRsn@^0wtpe7I4wz64wMwSZSl}&! zpq>fv?zTO2JGK|<CPP+>H3iTRmI?QmPm;knf~eP5_BsTf%cN{5hV&)ThD09Yw7^me zxOPcIIpIsuFd-|!o=;c|(-WkuP}s$d<Po$8w0K1i+cytm**2swC3v|O?-=0Vw8ynA zT^wh&SjXd&53BK{n>Gq;0-%Kg*7}5$WvpwA5uzzwU3sZ$Bpc17F_OEHTem8P9UO82 z7Mf#RArP|iODtkC@k1xJF}whtO~`ME6_8M$f?;@Br($tZ10-OHQU=0A;2XiH3M8CY z7<x@579NzT2uCuLEUEF9bS9hw8ubZ-+cwsyaWguI0y)yfjV7_k#t~v0E#&7le0Cca z-GjIZz+$SP1Ip^Nag3_~imqp@;~|HQ@hA7OpsP>?@kETGzE~n!Wg#Q)0f<yF^B~!R zQS<!BVHJ#|pc&AjhA6h)?=T(Ah@YXDfJqn`NtXf}(o0Cd>Nr5%A4q(E3btDV&009| zpU3L$VQ~s5i9zY25{OZADp|#MnAbSMLhO`*7GXme5{!gWyd$}aY`8xl19B!w0>5|& zMX0aJ9#ac4NQs+b22llMfHdiVM7@+5Y?#dA7~PsG84SWJ7N<u_*~H+b4v1SWBbcIA z>;(mucp0oikR^_Bj8Ela3J0&1hPWe{BOmkEXOZ;^v?2y?+^S=9YKiI|Ox3VOr&DSU zJ~T^C+ZhT`N`fB%wUD^L9ok1Y0hwf;f=#A0?WhvsW%%)O|H7$HL&lH6Q|^*ff)xwg zd4P@R#%Prci3?PAY($xn24}62Y&J%XH5Op|d~xc_3U7lb>4O$!9F9!xUr;2OALkw8 zh&2Camra5_a&J>3vfb2xJ|)*NjchhSg|jr%pSH`J`TzrE)PRixxUj_QuxE+anbc4) zYjAywW1vCf(35bWFMB}pyuLW^A}&`e8oq-i5jltr<5_xC&XJT+6B<*y9z-pT1^EHk zjjng<VW<h177YLuVI7R&rfP)XMV@IHCld(JeA9>%&GqwYwn-hhhE#8t?ggs0C~UFG zvMk;$fgx=mVbvltpGgQ+?NNs9K`+RZKx=poy6nwzan<}z_Ge4)TS?F@X#vUU*gm8h zP1cf18?rD6bA=i}hfdSP&Lqo{XA19gpk3jQ3Eu!0X$?MXSOQy0BPq;eDj6r)WwJXJ z^BLA=Q4NeJ%OQknSn##7954LO?4reJSpw}0fxE$mQu9U_Uy{&#di^L$cViCF>KN+J z2BWdC>8m=Fe4}KlNo;h66mlVxro00lW=x)w8GvYUQe;?9bk@OSg$$N8sV8w%1|OU? z0k_>mg24cO(V&iyZ8DASp9F?C-+-vq;?dz2d_M-7vKoQ-YInBGq_wQF*2m;kUZiY3 zVB~HdXq=GpE``zys>PUHxC&n_eKXTS9Nc(lkCOd_K@#m=rU%A{mT7+D+@L;(;|k8C zwF2O=p_YV{LJ9zf{<T2o%)HGOV><5&N?9k7HIqH?(PWU93jtILV8khOJ`Q<jJ(yAr zao;rM!MAcB#qpoS2S9VkU<KZ}GN7ajMJqE)%j<axf=$PAzK20@L{agbbjVJ{`|=Tf z0NOP-v`{(&T_?p?A!CBKr%=BK7+d3&1ZqwPiYp#;UzE@d!sXv6L^eMqV<qP4XsKbY ziR(4AR2fViS{b9%ZFv5$aFNO`m2J)?2_}EEe8O@~Jc`?j5QFt~IvGUcMOaJ6xJt-o z&BCzKH_GYNu94-DXf@tGn&_nobzydcMuE7cuHsSNZpV4ol0SPCMQn}(!)oCKj$F)H z2<4QD=W~sbtid~1IQxSuEaaPb%rf+jYm;mCIR#m2XOnDJWs^LZXrq)_#SERP$)XRr zVm2*oG^CE=5U11z-9@7UWv%!&=-J*JPlkrFeMZNVt)Ufp2vN&pV37cy!pRoiB$w<N zQp?wtI;+LpmE!w{@er;E)Nb4m#EUods>Uj-?Qyaae`9v&ExQ)YB)arYyrOYb!>`E* zPhJ5Ml$4QXq?aR<0acvm>(4AFNrtQgajaF$JCCL{p-iIZe&kI<)U=3`bi5ZTnKFhK zLlDizN2in-d(Wm_$D@=Q&?kf>j1w3{AmBCmUTA#Vc$~hvdHcf9&|Nn-C-?v0FJ1iW zL!+1A^s)*!myRc&xi<dH_HCoXZ@6*(!E3L1M?Ov-IQg%aAK9~i&yAOT=Emm2-!oU; zICRx(_3E$O`wN%t_?`V<-1UdIf9wPIz5m`LdQ$JaWGo#WAKf+iGb8D)nBznSJ$+Ji zDFZla%p%*!al#lgQGD5+&-}u!U6<_|85(F@q2nuV|CGA1`Hjy#aqkZwx$nS{1N&73 zpJbCy+?!nTzUDW+H1|H6T-iMK@WS6M|M91ve#aO7W3^?QhjsWwSy7JGu~E|Nq@%4< zq`B>?IDPN_TW<?KdEgble#s@H9Y>V!b$2I4+o!I*__FOUO}4*b&-|yaol4&jifDcN zs^xU@ru6oUKXc>E!Vj3M{(hQWHMRQMm;KXET>iDj7x(||t=~Dk>&Kh_WNLEqHJ6Ny zjb1rAddcX>koO4=O>!Yw^~sD`giloPiTV)QHt~jk`>|c4yLRo``ww?Dv>CtkQ`xxr z#;ckOZ+PxLY@U0y#yDwalgI8I9lh5yU)8)a8GfH>?pZk5eBzo9OdYy9)OWMvuT1x& zk?S<q2CU)4ZnMW9FQl%&{78Z1sqs9e)bZm_y`L9qCr<2}-dFm@%al6N<UN$~z8s}a zBI`o_U9ooiQS8*g>QPYI?H#g%;s>rTDep*Pk!c6`^}th}5%Y@Pjj)~3P7EanXxlfL z+J`|Fpsk+irZBKiD}Md!`^nyiPvC&64dEit>hKAkEqQ=Xo?;T;MmkYiEDb%=^vSc+ z)9puttWrD1BlVovVJFTLxQ>_bbjc^vYxb|}gXLXDgzYxJ!Gy!Qa4;prZa?E(dE$fI zUw&tY_$1HBym<}E)Xhn6mQPrlx=(`L$~ArBq5>=XWdC!|=lya@(I>Ba?8+<48g}I4 zWV+;&lTz-11Jt@vpZv??3(wOh4p0`{;-Q%MK-e?B<DG#K;&%J+;gH_!c(dj%)~o81 z>#z4+xl-jfmEKE4pNxmOYoL(E-1YuMy-q#*Y}qF#e;~|V91j1p{S}$Jq}=Q4J{c&@ zGNJfFf1nJgg@vMo-adhReVkzL@0s(-SmtWD?2o;;`-Y*5qdLw)PX)LKa2DsLF7DLu z+ok(mWB#V@Sk}}(T=Y>jHs<Ppy5YNsqGJYO0-d-*aQB{Py=q=d1{m>e33xS@ItfYi zAO-OmwOdHkp9AZKh4Z-uoZ7G&k}>%48tbcaO{bO^vo7Df&yI?8X<72}^|iZf%n$Rj zL0Mcnc7*)*^Ge*qSSvfktMM_r{H|T2NoX{1^?qEE42;=~-$f)qx$G}|7t%7X;1o*a z%NK5;Es~=nNG?I01VWry^<zT7ZBECTk_dX<wX5{~#mqXoYB;G8n;p6=N+un)`Qh~S z-F2S)o9^^=shn7vO1*C!m&`KasyU)d3Vix|T)N#hcd7#gJ<KQkF5*FV?0AOU>DLXa zfq^Nc->mk@Y#t=t`B$N#TWWfG%A2;xwYu7VOsR`@ekaes`PayfMn{?^!B2Z3<}96O zI0K3NxLCWf{_F;Q;=X?C=5_jnFx<r_?=4-QOh2V8<?zmospExNND>gAd?%p=o<1PQ z;tK|DzIp1qWH#?)*lznizoVb8?@ndRQ?uv^`lPTiJzxxXnJ#<T+$ULCN|<LT=s8YK zo??O1u+Cerof;oU+{Gt9|FS}F=nv=)Q@l<I5ZX?k@PdRsA#eJ1PoKm%c^w}N?mMg< zhYY~J54gB@IDKUpCx7L8`Cp%0UB$}?0MF&w+VY;2b~~INPQUJP87C1WLcNfBCr&|X zy*O8K+KFJ7eYFzSzaps?osW~1Ri5xq3Ac++{<J)I$<+zl+IyUEk8S&TxeS5aGf!ch zT*X`E`wp+H@MSep4jk9lIB~VgZF};h6`$0{2};B`aU+o5mX|%)D2OqhX)=ZLF#m2A zsld4%e5w8(Ze457dU#EIGtv2)veM8MPMu#9KWEV|)P2HkSBCZQvh2B-PAZi)6->F~ zYmF9$tUu!vZatsNQq|p|rWfHe_0A`P2BDRd4@y@nWiryPT;uPHCT2tRNRZD%HJ=sg zgy#*bRiDZulc$)dVindYA@z<3B|LzY!QloZ{(3__UvJ5rb3=X=0#a^ylk<Hd=hPW> z+|&sUANOP~>FcHov`~3}$v+UpI^%IsR=YJI&jh*`zHzGVFAE=uy2D%{PrU5Xu6@2D zQRMZh4}~UoaLS53Q+Egjf(?lc#eQ8wmy#SwJ8ia5>P0hIX=hd7gt!p&sp{zKV6RIs zxkTCa)LP($OfGzSiFWCJS4mS*Vu`qJvVRLeQiMz8l#)_V7&j4axDW~)DcN^slo5^u zQQ#M(jizju3_ZK7lP%V5hw9gDP{+HJQ78R!>G~vZc42_3c$W@MfpzLl5nTNPxMxqS zDHwxbNQqk@SW;_H(jQZxUX2pJmb28G>zsfWRwc#a*S8f*^{@sRbFe-Y{FF10aG8Qc znUkmQa@NZ6Jkf8>!ZH)wtbzrq-$%)n)!WJ2Z#a-yv4IOh{au~i-O$uXEpQFOm^D30 zm0VsE8b{ni$wYzFZ(Q-J3AxG&L-hjB$5pb_wk9EH(9~0)lIhCOQ%Oy^x=z6O*hg8W znF`#HlHH)Cj>SENkV&Ij*;vm)ulNnS)Fi;wl^zn`qg@Hu>y1?}Y%g$K661Onth{uY z#xlrhk6<}@t}H0+jBO{WLb0%hmA^nXSg<22rUC)6_37Lk_-avLSDoajCNTSqFYVD1 zy<Yyj78IP}7|H9JXU%0SSB=48?l0%(iAkT*oCggM|I{F~+B;vQG}-uLj9-Kt$YK$m zE`-w7(1TX?A+?5repvskbZ@1Lythq_Q&h{{!NiA4@~W2ZX;yOS3I@b=hTLtA4b7xi zdz%&GI{_cM%mrPGiz*_gfK-cJTS2ISm(puXZ;1P0e>}-;vyplgC9$*eU|)C(s3y%r zTESH0&2GuoYFp{ZuSu!_UxrZ9pdH&43U`>)cv3B2UufQ9<HVP%xhhSnuyh&oKB~FO zOH?Gwxw@v0l<#%swNtjMu&z<H-zS;PkNfqyR*e@jg}8xcUF!XLK{l6mBpA3%v4UA4 z@}NW*Q(8;H2N7a}zkXnCsZ92%Ql^j-tn}QkJa^^Z!trDUxk?Qr)&=r*ci|PJA7GPm zKpvkhFVFLIE+dH=3MHTzQkgNXmCenf0<@iB3gd)5D#&4-5G3%A+^(nbC8=IO!w*AX z#K4D;ogAKwAlCR}C=ir6>@-4C%8NSTzY2z^tELO9><-LyP}U~w_xB(>3U=9gA5Tgd zN=bU8fEvSeX@L`Q3<H<Uz_n1|^|%N!L9f?H)c-(<yrYYPH=3fmJ3*I7-r;q>*YQ%0 z9?7!O9wIk4DvTmWr8Hg8E8>cDos0UW<#<U}R)kj=u8&hhSI&|(M!@7GLJvs!LkUtc zNSqqYF91$*p*pBo78~X^pj)tIfh`McSzyZoTNc=|z?KEJEU;yPEemW}V9Nqq7TB`D zmIbyfuw{WQ3*heO1L;ru+rYmk_OR(+H_8iQY<eMgjprbEnUHg;30t|-SLJnL|K`p9 zu5*=T<QBDQ?3M46n4!jptNa4fMN(1@FXZd|nz%=e|He!Bj>=wNo{1-<$qnD|M&$H4 zIqr7y_|A&0yw;6IT0P{y`SFlJfmW%99xE;FgJB=~dR1o~uX0ZjySu!xs?d>a<2_!j zLTp*buApmFhufU$@Eq-)NR#E3aNKuSw93DO!dJNg?5xX(Sa2t|LZZX}!tqZxG;{=@ z`|3qu$*pOODTgq$%jq)iP1_R9J$!JXyO~{xGi9nMFefYY{BdnrDk<$$L6fb^!397; z3M4=%QxFCwq%0Er3Gfw#7ELi8XH;aB)U72J-b}#EM(Nd%#RhiFj#4TIY1FFMir0{< z@0f!vJgQkIlL7yYUM7}Gt(^fi?+YL|vCR~sdA>knoW-0Xx<XFZHMZ>c%(>9PhDNYm z9gGm-IdM!pLs!KL80aNoms4c$>N|r+twxzXZC5XGZ9J@L>LG<{tpyk@73fw)bRmG1 zu$&6A;QTB1&X8QBBN3Ypk`RIp#}zDpC|T(AQie(ri=YNUi?g@4x|6YVj00?b4k;y6 z3YtLUySq3PHwT=aSd<kyx0RGTo+D_9@O~V`TIx{bA<NaPoI^6KUEALe&;RK^j9drW zMb4*8OR7|yaRMRCZ5DE9aQMqXtB#5t8_cVwgB*mU5+Fp}f?NjhEO0;EbeVM;X=sHi z)SFdD3r%H&roU8PLn2$K^Rh4*Yk5j*X1HUtWF2p>T$1$;wyi$bt#mEQ$1`|c^QAs# z$m3CoFh#(Wk=d4OEOU!;3aZm0p)G0DPC_VnhooS>u|!_NHH=yf7$?S=%qJZo|27Dh zV;Zvf^AM&R9SHTfY%HevE9wS}%Qs2csj$E{(v*l5A;r7gTxF|ygek#;MG`4WIe8Z@ z8@xKJA`y^I>awsb!_}~PQ!rBS?W$BsSv#X9OW`3GIx==!i=P9FsL)JISt}8mr->3Q z1Gk9SjU|JXt278{L!v+ozJg4JomPU;jD@H$$mGwUi$v<ElLbP)D<vPRLh^wrBc16y z&wMU#Wt<r3G)ifuZWIov4rE29btS4KP%)%=f@n*WoP|WNlk;?$(>49x@}8iI1nO(> zZ!D=uNevnGfV_P<KekLtzyy^UY4Hs7#i;6D#8w>@p6g}CL^B>OM-Uc0ErXbdvhaqL zdI80|;P4YVd3h?PltAG5*g9(74-Dv_C7(vW0*iF+aFJLk?KEoO%Fx0tA9aTjEakYF zj55dpa3K<jXeWtaC9DOegny*8HZ|x9n~%~Pat|YiEhEA6q6tNYSn6iAC$KVgaISOx z(rK}1+95ASikV+dTZnDKX~`(-#DD>i<_Rm(j>-^kJY2aL@3QIwZioiqLO?RxKo<<J z%mnTWBSol17EMa&Ttcfjcpr+^0%6y*ttI~tI=i=sqlHi<CT7X7%vxHEXWAeJf(6Z@ z+DQ7qG8N#c2$XwwqST6T;|E}Lt&UnRYnd?kF_uah#uh*1A?yZLYjh2Da(U?US!&58 zS5v$=Z*UcLx(P>O-OyH{{)%7Tks~t@;*NqSY#-3hQ>d~7;84rH;=sU+Oy>o8davlx z3(2v<{<Jha;IjRO2SA0{1*JI9&<`;9<unoqyIq8`Epo-`w|o<hK^6q7fwNI)3nQOD zNi1d}t0v@~=v1*1+D?REmL!sq!km`Bc-DPb0x1I#)fJX&hH$kni-IEiS)dp7SXLIA zSVnkpg(THaBI5K>&hN%6D4H@DLwcDBhg*pmI?(+(1mgcu-eqegV>q<X4GAerupZWU zTUSR%6G;g~q(HT+n-J&|rB<bJ25l8oX&c)XlGvV*z|Xd#FrEq>$!IX7V`BOeb*0d9 zocIbM4at}h)=%P1h5=wF@dZx@s?cc}*ikDZQc%E>;y8*?JA+G8C02H|cZv+80hR&e zoj&XC#e}a*7`KN>TCFLV8Yw}9BVQQlB``kC3hxQ$!bn4xa8MRt9Ie+V-O>tk$}Xy2 zAeY@>4pK4)YGD&CDNN+huxge_N)fB>M>Jz`j|rI*8)Gb`Ffpq`U}*7UVBt*JT`Ean z9!&JMQP&Lur5=~+MV68J*l>(bS@k(Jg*T9Y%blY8<G7C0OB81&k&mH8Gc`zgv{k6o zhjbYVx=?MI*GKww<!_vMGbm-HkcVTNioUW^SNhyqs?i?|`L(JQSscTM31qF4_8DwT z#Yzj2d5kxS!rX;U!*O9avBol&LBQR!tD1!wJ+OPa{_F@$`+JNlfwv4T=*<f%dn4MO zHZe?ftgULiWeMs9G-J@wtQH9xTKTO^fUBUF6G|m8^dO<9gky*BcS;w_))7%p-fmQu z))Gj>KCuSEUvID?I4i?#71py-3!n!3s;uKSNVBjgXKY#@Z}aBIJQN5kmaMrsDIr<{ zh0rn(Gnl26wLtl<Rd5;x<K}+gYBZiedncLPD8wvZ0OM0y*O*lkY8SCt&nZO~Eh(Wc z+3KKl5}>Ys_&&5Q2cI*;JB~fgD8qvr|K*p9u9d*MYkgb2nvt<<(2KbX)vit?^X68b zScD=J$R5NlNKasOwpyg&2{GzGVXIsMWT1wmd2O;ocm?+g((FbX19potK*P-LMP;zj z&)_}ZgDkN;`V552c*vg3u|}-V=D^QX<}O|)NheHD0t?XyOp;(4mA+poQ&+GWqJ15y zgmnhM8H@AEAb}H|_%^EU1x@3aL8PIaKD_@NR~$yq#qo-npc}N*adhNZdCOxjwY}&( zdKfrlS+gH-SjXz4A{;6ZauT-z2{Aus3@E!RuudtC%HI&k6{q7!;u=bBgDhrI{Y5#f zxLu<>i<!UZw>ONUy3r4gD6I$BXyzVG+@UHciH)Qf;v*X{HTMza7O@I_H=?zg6oYz5 zMPEirTV<z~74n^`Ntn;o)v8sTzG?Mg9M`cQPlG`)5|$HzfJ*c=K5`9t#x)b)c1Nio z;|&=>i)=acJ3r=txo?#?K^x?|$DW-!GfB8Rv2vsvRV!)^{xsZUT^QZzG0r&A1W)~k zj?v7_3_Vh>Npz7^t*Qys3dbk$F4;;iAu{-#HlRC*+Mv5bA?jVw+_X~Qo0M88m7XVM zBYUK5O9~0IeBUL;HOWQbxo#zmf{l&$e@z(ZG8Jf?5qkr92~D%7I>UDnvPo<Q0tT>_ zVYE9kr6Nc=1^BY4@UL;Lx8fA^g)AGa+23`(Z$&D@1B!uLe80el%zBzIlw6AIl}MDC zQeKrV$%Uj135lEdNXO)Cg;YV}OeYH%Wo1a>i*y<9E6r-6ozi2_^M=&Khwwp)$%$P! zPqZAz0@lY$5+-0S#yA!YRcZ}es^ROP{|Fy~ErA#_8Rii^N)~NA7vsY~Sv<h{@qBf| zfC|UQO{Ol~bJs3B0$w(1ba7c}ySz9XoNPrYL+j3j7KT@w@dPdfaKX<8OQkfEhj7Yk z@nYh=*;QYgpPW+ji<tKpG4kwdM9Id2k}+|bt<>tm6H4hh(~Md#jT^%^)U_E3DQyBB z{T434KcJ*5u*>l}?6Rm*|C>`OM7AB7;Rd<&9oqpF8>64NB1w|o59O=+h{bAjNQ-%0 zRm`h~Q<Dwx%ynjRaZ%0PdK0eDMsF?Wlxm1&RQ!P1HLPZLYt_mn@LFShDpm7K@@6Qz zGJVy&y2@QXWhS}OWKpv7($KH-OzS03MK~RGMDtWDR$u?_cR%#`SMNV`_sd%UaOD11 z<E@qg*2g%KSp|ETfa4n>gE-DYfwNbjcf?C5X9Mt*9C=*^l!40OGe6shU)G2R8c%*G z{+-#T{>Ez?A0Lggp~^VX%IIFj3^n1CarASvm-_zly_ZeC_1gRHd+g5U@BTlx-F4{1 z``%}d-?9I8-^VQVL=0Q;62kaTKluDDdk%i@9(>+e@+WblF|Ol>vs-T;y?^qF?PJ&8 z@`ew7<G%OanPQwg@z`xw-ZT24U%v30Q^>m^D7uaJ$-;O4U3%O8LqGAdpZNzPfB34K z;R2p`+MpCZiK2>6$d6j1b7pO$Z_p>NEO{_NkHKkJJUYDnSgZyb-~Ld1(D~$o*Y3*V zl21&iX4g1Y3o=fm8$#c+AG~Dj=4<bJ+5FU<|L)MCyB1H}`u^ny4&4o(2v|0|;*%f# z!*|374=*P8<Tk697!$)M<D>de_QlE7SKo5qd#}6iTOWMYotV4sY#zGn%G>_#p{sXZ zUaFr{yk7XaE1g7m$LpZF{`$GO@%TI6dG^`$@@|AbSnBuv<ooU6-crYpdtUx^fQoF% zn-#kH%2!GgB3M(;xi<l`?MX8H4yE3N8-53x)m#PkKijLTIQv=-6lXK{je>Uj#0k8+ zwz==-z*S++TB9YoY$cJuH`vcogNOMok;Ae2j@pn<+}B>*YkVsOcx0nKxxVvqP=$#! z_+)zHKB+k6xsp%R;B)V2x8F3^Uc)CJ*!R@$spO{$pGb4dKEb6U2DAtG1aDv7ffuxI z5OSZCzVC68I-XRIZA8^(`{bXLzNZ!Halj{XpL{uRDsj(oqMQ%ID8sv%+wCa;`uiW_ z!4-T0xVrP3G(o#o;**~WxPRZaXl?)13C!K?s!#5O<SF>1K6fe1UG&M5Pd>IGpM-k$ ziZ?n={=cD4O`+QapLiSB1$+9W_!5fCGVQ-m<mMpGU4W}YDNd#wK5`sBDa~DN8Myg4 z!C_Cmf8WiF1TuHSMQwQQ3JOAu6V5qkbz>a&%WYnSlh6_+KNRG*Wg)e8480qI$2+eX zd1^O9CE;5vqEh#-wzCSP$a>YF1+m~>>C&7{aWddD;`=LeWcUkeFH;am$0Lh*#~9-Q zWhU8Oh@EQcVyo_vf|WW*9Yz%0DItR^mnE5d3RMOad_lVePOb~12kF08X8v3V&4f={ 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Ⓢ*an>qs%1Iih$<Q#s&_{WZR^a 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 zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J 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 UPyNtHCqClM7lh9~Vt1(dpNQ8TZU6uP diff --git a/quad/sw/comm_dev/bootimage/modular_quad_pid.bif b/quad/sw/comm_dev/bootimage/modular_quad_pid.bif deleted file mode 100644 index a5ca1d7de..000000000 --- a/quad/sw/comm_dev/bootimage/modular_quad_pid.bif +++ /dev/null @@ -1,6 +0,0 @@ -the_ROM_image: -{ - [bootloader]/local/ucart/microcart1630/tasks/Quad/sw/zybo_fsbl/Debug/zybo_fsbl.elf - /local/ucart/microcart1630/tasks/Quad/sw/system_hw_platform/system.bit - /local/ucart/microcart1630/tasks/Quad/sw/modular_quad_pid/Debug/modular_quad_pid.elf -} \ No newline at end of file diff --git a/quad/sw/comm_dev/bootimage/output.bin b/quad/sw/comm_dev/bootimage/output.bin deleted file mode 100644 index 415f842b68669550922a9c08ebd56daccb103905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368340 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 zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- 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 zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 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%0Aiu-1B+AoKp13>mIxE%Cd$X`8b&_ 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	E_7M9OiK{ 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 zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L 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 JZC}*ze*tYpKpg-8 diff --git a/quad/sw/comm_dev/bootimage/the_real_golden_boot(final_demo).bin b/quad/sw/comm_dev/bootimage/the_real_golden_boot(final_demo).bin deleted file mode 100644 index 415f842b68669550922a9c08ebd56daccb103905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368340 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 zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- 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 zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 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%0Aiu-1B+AoKp13>mIxE%Cd$X`8b&_ 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	E_7M9OiK{ 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 zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c9&ZE+N)7(Oog3ebc6qWCv>NQU zjWpq&AS`KI76t?9qu!uj3Z5EN>PtO^aWz<gurL<*N)7(yTmEL+^_k>3BFN)p^cO~d zvLDzF90ME!i)9QPYTzz>`>)<wKw}!HWhOsYsfSL+vL4IXSe}VR9q?pd_RtDhhMxYD z%Ce`=ddq%)wzB%CbEV4DXDX`?8vlpKs)tLJ5B#XIdOzagPtJMEe)&jc*&UCp7`kJB z>A=gU>gB&DXMVAD6zX#1flo||Jx^7pKc!y2^3d|}qe|+8-b1DFp1WYnm3h&DxBgu8 z?oN??Eh78GiIuq(mBN%#7f*v>e-Z8e<)K3lRaQWLnVMR$RZX3I^-Ys&)n(Ize|O>! zD`PvqJ@|Jkepu`~TjEFhV>^2gKXO}f?@VRI^0{kYzjsEd_s$fQ2EUtUwj#duRgi7H zd1i3M$~hl$NgG^Im{V$O`j{2vxhJhyGWQ)UuTkpZb6`hR#->$8&kUOI?wQlq?wu)C zc1((F9c1fPiH@G}5cY!baR?tg335-*3?Qs3yHSser~lufL#xX{ykvZhdaj%+sPXBF zsl$rN6Dt$bI1-&$<qc044?Jyh;#<hCLitgF{N9B8m_YvdgnVTn|BHltO(5T$ke?XH zuZR5l!rqzR0iVi>BKS<e@0q(6GO4Td>Fcm;MSSZ@%is!xuL#1wh460$;RDJtD0pMj zjvaVU4xPAiZpG0%riV@}%*hxotlTjzV^^3Imr1#WIq9bo>QD^&>HVv*J)knb!nhb* zF*vv6tjg4f&mEgwjq#$!#-{(u+c`0~YHV@|#!(T>S1R>|%HR2OQrF6f(Dw>cC2x3Y z+}}HM`-Xvufmgh4^7Gpee$z1%rQKtbPyX!A$zwkC_Q}h>ykxGh`?sflap=%r6}DYI z^%(r(*v_eb^^(b%Lx=uZ$`ZSd!wH9;IjK|yRXcESIhI3*5IpI?!4ejwe(m*T_$x7} zm%~2^{`F5iaBvXIacd78^ssCzJblTwrC5%@vJ%UauoRA8qQ+OLUYIQ_b?}G>lsc|o z9V`}$s)YETyb1FRPEroN73u!de{$`S{nP6P_s*<R{&dga)`>p#lIgO(<2D>6Ppd&6 z+klCepM|<YzW;T9yQ-S++UNC8OTJamlf37jF*f<(^KO{<O63!xTUH)ycw*xcu~|Md zuu(y|$NFmeC?9Eq_hYQSWV)j7IQIL84m}(#w}}3c`bilwpA`njpnvxaboWc$qq=CD z(LJuBjQ&v-o9Akme^9okmrRRZG#`lfo3{CP?EgB(M{&)!X4Prmnw?tqhjYEx?3q1z z``+2oOZUu9{K;c;U%TeOT+jCL*$4X{o4e<lN9T^*zGt@bi=WQ*pZ2X?V{2ajr)A_* z-q^d;;MltkuDx?ldD)$_{cG;rHMM4&=*&*O7B*HtHdnf4eD*_YUO9L3H8;)ObLwMr zeXt|(8(;d=xyj#oY)-vY&n~&<l)1u7$5H;-bH!`)Y~S`@pSuU;_HNg+%VF1!9d#D! zugc?lX0{2Bp*=GtZ_mu~!96p*Td$p1K6K+mpZ}_f-tkvW6e~AP6ulcKO8%7-J>$1b z^i+0C6bG-I&>rR{wPo^pfA4oNEWZEdp}jM`i1+$qw_}I%P*Ghmxpmy8U18F$nCu;Q zX%|m!s@OE&*tvMJSg~pAP5dR37+c1!7sQK$Hoa2O`^%UEmk;WhZRpRvHx<+v7XOGI z)r0LEb|$5d?~yTqc~-`rLc9KO*#on$Kkb28%nOsRJ@@>na%IoV2hTfy>Md(FOznR5 zlDR)Ral_OB<a=<<!MU+zch3FZng>kZsb&8)_u#W1o0~ZI4Rg1jcK+P&p8LS;)Svuv zZuhf~ncKa33HE*OoLTO@bLPPp9-I?fFNdACoVIc5`On;lx#I4*Y4m?J|G8Hp{>!<` zU}N_+HoxQ(y^p-^rirg@9h>a)Z<y#AylNtrZ_Sl+FGQY6DR(>aow{Vs<@@McZ=SdZ zZMtV@Y*KlznktTupucXI==Db?dIxU^?JRr4+;d>#!^^hLO^BV<$IKPIS56errzIag zbl>;%jZ^nm_RgH{ZJgTs-1Daj>XON?k6$?T3x8zl*unFszUbLL`Ml}ROD20g+b0F| z^;po??@#n~0dv?$(3cvvC64XUjFGENe9PpkF&40WeSd2ZFIC1qSqR2MN%|Xoy&Qdh zK>E@ipD6!l|LMyZ))y5wh_5c3^^O09Y3n~?eSK>XzwkakI##Tmv1!>JWW1Es-kCR^ zsj6dU_n)sc^OeY7mm&YX4EdEA@|R`EFVB!)oFRW<hWz;v`9~u4KQAH2amM6wv`gCk zt24qj{{!+w(;kbYeH&>qSFHNsi>4IDX#wM{=#Nc$YS$F<Ods;brZ0wmA8cb>!2YhO z_dZiS+_U`$X5Rbb7mrMhq0Hj;yJrVad&wgc&@FDi-=rNvez7y+Vc+dzu3mQE><dum z4TBTY1B3U?l%8_L^tFRH=7G+!{;rv#_w5It<lQ%O9puHqZ$Ef6bb6kp9`-7`rYhbp zj9Wc*oZ2-r0R7n_>VV_N%HRiPO6uDW7BH5-vrIjF9O6p`Z<s1!Jj(u7=89E6+%+Y0 z$^_c_|FAsr(Z+2aNVNH-DQzwUZT>KH3w7FjM3Zg)8uZiJ{E3t{-`1ebC%k{9dN!6k zZT`2xct0PX(q<L3`6{$o)oJrSq&L&gZ_8-&8&cZ*I}O@=1={=OoNazzqRkV}2*>ti z7~Aj1*jCHz*nS$?w9mVH(v52w(+9l!Ca=f%zO~8rz9^%;zn;?G6C1SmeQ4|FbGG;8 ziT3_Qq`j|9Y|FFIt+y>--ej9A8EyVWp>|uwL2}(~`C+uT^nrZi`lLjgUz5^iH?BVc z-FoACb(3xWHuTfB<vUW^{Fe>dd>Y!jDQBC1gl#uEXP+8r^X0*~E(YWJ4QTWCGRE}} zk=D$1{N9ZA?nr6x?=@)e)oAMtIotcOM0@9+9&X3Kofy}@jyBaB*S9y>=9gx)c~eT8 zPjArX&!D~c=4|t86K(!vN}Jud{snaFjq6u8+2-Rj+PoyC&Hu5q{<i!dXz!8_=G&H^ zk!bUEkv6+=?dIz{pqn*cuWz!wlh9Awj=zCxJjvsbPd8}qsc7q_obCM?w%h1-d`_gj zZ^XF%SmfAi2ihAQ*SoP_GRJYjvDd>$m-r{)H?vKDD5LGSq_q9I25r9%?S6aCwtqU& z_WwRT+@@XI-T2;!HbuvGvh5!a+Wz_`+kRz6+h3H@_Olzb{cq6jyK}bvx<uQ*5NW#{ ze_ZyAktx@=#btNR%CYsW=x=GC$j?c%^ZEwI*-y)8C$7;xjO#}BI2-2x=U}{*aGd^Q z)GvDM{a@wyHvY53vG<RIc0XyaJ@&@2(_~rgo+;vdqk!{{GLG#(ajG5bO5HfK1aY|* zv}DkqDZuZ8UxeQazchF&7JsG;|NM10UlAS8pXtH*$u@8*d$-Qun#*+G`0!K@>Wu3~ z4;9qD2Md)Qu=$h;Ij>df-826!*W)}rA?FB72JbT09S-7LNb05r_svMXq<&w*bs}uz z{hvqMr_gS>j(HI06S55{<SU3S{384!{F1kCrbohO-7r}iym6*a?L)nBU8{5h+Ib`D zHZrkf+qY+~llFQes1weO)J-!e1NHpbjH<i`;X5D1xjU|ByxW{x<6__!a4l)N4{g9T z6Vs+1b-&S3-r9*Cb@8NJXDq7AC9S`Lx-LQ6uQ&A_Gxa?Y>@UPJh&B%F!}%WCc|G*x zobTh%E2*)`Bao+rbFDARbryeUYOC7&q*Y3-UXJrBxn6c8u7&n`KbSddb#b~+{a|KK zu`qEh>h;db+KF>;p0Csga2~e<*OSI3uN{BqjGQw*2j}8qTl(Qxl(#2fIIwTm)F3#% z1$BA{7CA@x3;0J~^Rv0Lwm&d?7Ou4&iR)`8V0i|X=V5s<mY3t2*B@Yc3zk2{^1G0o z3f)tY=hcW`h4^~J*CT!k;#&}3hihzdovjb?r(E;E>{G-(;+G<A0KSK~hdh@dejRj9 zK>P&6M-cxt#E-_Z2C_Af-3Zxggl~fXWcVk;@5S;)EN{YcHkK!0*@QgLhkpSU8Dnxy zqW|AMeC~bs-uv8l-1WxiyyLE)Kj*%CFMJ-tUsU7ocs|np5wb5{b=4`p8hr8vN-y1{ z{0ld!58uC8eSPNnavkKrMNj|9I_bNuW0M1F&rEUK*ksQq#wIV^{ehW+9-G|ke_&>4 z=mRrv!f{6BZ1l(AyKsKI3u9<#y5vb8zOA>2b7S;rzg&mKW#QH3?cbYK+i#mKU>ueP z-!?OT7V>TX%Ip%z3-IsResJz7+uu9;)9p9Su7m$G_-o-GfPeD#duIQ0``2dI4c>-w z%yzQ6<oy}SyJWiPjrEkgxAls=px$tlY(wjzx1}QWc-PDo7-P0hmrUc@`|8r*pUt3d z)5jqEy}o;}4Pv{%*jm4KWajiUM`o@*X=LWwGe%}U2LI#mJ;>KVz7_FTBR&TIFW?_6 zd}DGS@*i0H4QziOm^py>_j>P{Jg6l8HZXbHjH~atQr5}$OqR!XO_eck_8mVmrD10T zcE0C*V{#PXTM*uN$~}`l!kZ*~(l;hIBYdIgK(0`a66*0i$jb;XM|j&W4n4d=ePRDI z|K+Bs73$;rd(``|+_GQF=tUV<BfUJaYwGX6Dd}I@pVTQHH!}5#K<BQA&c3JKGa0ot zj(XgUdMts>eQ5935x*Dlp&;*>ru?}5E0*0q`{^~f?zrsHxliNz>5<$2ZPvA4S4O7F zpTPANT*tm*&E5B1aoYW}6Q?~ocP)I8O(J~7vb$d-;rFlI`_=cKx%aD|IBDdopE+aX ztJki9?wUvE<a)TIU%z(m^Yxi~pO5tCBmMab{p;bJL*^0KJp$wI_$_Pq_NwjwdIa(u z`JrXoj)Z^03e-n*VDE^t&fMF(7J0;GVf(j_z?eK<j_*YO_CR0GV+I1=XQ%MSb;rr& z0gqL%Ew+UDN`(K#u(kao4ECLNH~8MNe=sQX;OTcy9tFL9Pq`a&_pYgN@Hx2dZj8-8 zo2djkQrAAz%eV0pu3vWl5gQTykN>t~;Kz|N+!*j-=Ru^)7&!92^f6Gt82F*F@sInz zAJ`}lVtdC}l6h5Z9a|a2wXS#lNUpz@)bNk~2lodnXJGsFZo@w05>wBDQvWP<+<>tz z{&DDk%;T$XL7&Ps?~}1DUx>bY5Zn39+y7|p!R^1CQ`^6a>*T+jdk%C9LAVHCu2uJ8 z9ye*oe_@a=b|hWoYVh4N-ZM(mJ%~$r*p5G~25<aq338cxuEViN$-D8ZCG6W|za{%P z>?c2qdu@}*_mwiz%ATZMGPxZ7rop|REhF7~9&Czi@W!tW!iJ<t9QU;U>Il^7i`TvD z*wSU+JumRTe3m*&IT_?%K5%bAO?>jup>=<W+0V>%H{uxLM%;72KKf-NQ{Nkxe)z1} z7Hj=?@9%}q3NXK|fnM<nt9OCvvut~%p)u6`mi<>X(9=WK-kTceEeYy(Spz*ku=kz@ zdgIV5TxiSwNT7Su>+F1%#z)$+LVX6yM^gM-A-ie+$QdW1?=k;-H<&pX`vr3kZoRq< z@!d0W?@i&jYTe){_7P*#>u`*4;2n4D$Niz10o)5e7WWLyy)N7@5P!May}!pBo+u-4 z&*1RHau3IpxaZO1-7qC%564QMl>3lsaK{XEf6_C!al+h_#CB8?8T1wM%DpcqFGu8J zvjm-<!B<U`13zhdIrOD2yZe`5Ke-qC%SX-pw+7=<jwxIm``0~3EA>8q`_E0f?1LY~ z{l5Xs!DDOgoEs11yPw_n;@zkAz5K`9KQI1^;lF(MYKb45dyQ<Ln7_uBy|Q}0r+_-* z(BL6CF6_Z^mg6JG3rhXAuhiE!V!2D<7@&fCTd*n5cAyVFFe7!wT=35Y@5+hFv-{>M zxCeF5_RnLv!}zCMa}VZ&&(D3$%ncWqxnXzzF?il!XtJQjJ}G4tD>g6cIQQdg4r2MG z@o&E7YpHpQ$Xirnx4U{)a6GyN$AzCdN{+3^rXM{?J-iv)x2mAu)D0LfduE=4^e-Qe zbR3h)al|0vhfcG{;uRc29*6j!BK<fVgUYe*Q(;4nIVEiz$CL*#7knPePY~9t`_vo3 z0&~FR5|mw1_s#THaIXP<Bgd`lkpFLCTjse{7(;T*TEaaD9M4QI$GzOE2gh!B{|V~h zBVqf<F<g6v-PfYter0TWKkkvf5zh>~LCzz#;@rl!=Mbg9z7Jbh`(xAZfqgk1UIpFd zK5Y79H%J*J)Tw}Sq&+vF40rA?a=B;qe;~Ua<-Rm1SL(k4<>JAG>3_oURAotV`a3Id z><3v7?BLjMO75eVDnFP}r~TL58tnIVWy6#l!}ksTU`FnBYTOspxDWVSVE5p;2hDxR zA#d-@hj3q0EqiQk>kALe-TuP!=Oj(N@XlGeuX+~xN7CbIcg=q2v@7RsU$znXzA`I( z?EN?yhx)v8Fz+4!tNmEivO{x^NFT5H_Ux|<tD&*UtvGg&;|3_N#=ZB4rA-C2qwMdR zdS}qK529@{cb5lWjeQBmJko_1ZahN%gP9}H=d#`7e5oIOIo*e}_aUtZ?JXj`7aWS~ z<h<+$I7Y>Sb2J6n>%A}kSPkr$e8b?EfBc7)FaKD$TnHX&*|%oxy<^$l9-CW=eVW{- zJqvu)vVV=G^-CJq94GBs_U%~OGNe5ZJfaNbJgoTkr_ai{*pWjx*2P$n{kmxb>i!0t zA4*tc=OTVJ+EGM1dQkUQq93JCUx~Rx+S3b}3ffc1XwQSE*}j$jF=5no;_aWCy972w z*0XbDR^$_Z^0~Q-0$FMMh`C?hi~Bww-Ts=nCEI_~%s+$6E`DSj*E_zBx#)~#8y>lR z%{csvA9)+D1N3aab+)wg*4eM`{M_6i(uCU*<nP7(qN)wdd!qk$uyH1I)}HqDxib;} zW908g8<(LygQ&w9r`h%$fw=UMl(ih~E2FKGuq*wy6mi#gGJi<_y=MDQ@f^k7v(k^I z|IWR0&I2>K*FS}Pa^1+>Z%2E_&b@1H4a&Lww3nDPxvwYvC@jWKyKC;~fQ7U}?sLj{ zYw_)OJR;|=;rJdr594;?qFwJ5U%&SchQ%Mh{rP`?-c`m8`iT3J+pjzC75@EefAfJo zlJ1v3ev8q6ZvRKmlkuR@&u3vg$b9mhUmbdQw5KpVd8B$+;xe8G{ITh8LcSVt%nj4` zBD@CSV-fx*gpWg5w*9Xm{ObtI_VJZScpPDwgYJb*8Cx&Im@24k)3W_x{#(5sY5yDJ zt`}*zcmL2YR*X&G3EhIfWeV4HR?D1v7TPaum*+FaFb^F-y)Sy;MN^wD#`Q*QtD^I0 zFRnx3+^ZMId$=y~ec4t;J_kA4{m^lu8>C}f{pUgTftfq|ByDK=QIvBQ;$IEo2e2*w z?;iE=BU|^*?0a*+sjJ+VJ_mCf_7Sq(On>ZYxYmp9Rb=O2Zk1~@W!yiO_>#fzKDZqB zmzN^$|3*KaP5SPG{Rm$Ry>l?<9^qlm#r38N&XeUB|FZwVaXIR!P(L|$kZUAz&Fg94 zVr0Sn=HDpUYhdnvvt09%`S*?BCG`@9ABK)xYm&Krz}q!-6>JZ{?xC~3GJR<9E7Kd6 zy=3|uXzy)HL~m^Rq6cui1GbN?E2z!;3+9^0{{`dfb+fH@f70WRO>Re?E5SvWt;hAF zf;qmQnBIo`1K{^@lyyI@$BW&`)wl)}=>8l$`%o_rV?p}<r-&bget8+vk44>NK9#yl z+vPaz-(f@a9)zCQ68ja5(R0x6mGNCu{?OhTIre*w%zOU3%{7Mt_9s1fZV3C(zmhTa zyk}tF348A>c@sB3RmKypd-*rcoa2kFT~l%_@Eq(Hd^t8R9Hr!#;JNZl0^0dp<gHXj zrewUn8F^QzTlfD^=6lrTxwyAq3F@;AdE_~U7k+b>9H;-J*grP?=O?R&Ulcs6a4r1T zzXIoY{#Pf9-`F+v+~*<eePwb#o-sV=-#0lNq{+2ZImY^Z=pWc{-{d<3`9XwNzue|O zGSK-Q(b;(4<TXwQ;YyHpRUo@Ubk4tT^7tU{sv!Nq1@}$93~46?ayec&2-(R&e8B1b z=6#b-4`c@sJ|hSpjr0SX@0)y@OMBXVlLt<{Z?bsquBn5N|3)A`@W1Yx{O|2AF>R8x zQ<3jKw_jo7;BY$Pvyt>?AU+vMA4L5BMAFYh{J}{2S%`l#lKyLm|5GIW9K^p9Nq;ut zUx}nY2l2Zi>CZ#_?jYSq_|70ro&ABCjfhvy*fmo^_(HIgei}f$jQFwem%~2}zC4R^ z0CPeg#*BIXBQnnVZpWOp;psoQ{0A?Z8kB2k*jAUGj(PRST~qH_kL?BV0^;W({!SM^ z4cjK-e;SFu1M!`RKZ^71M=^#(U*@7mFt;i1T{HVo{*NG+e7)$~dlCO0;*xI#=92SH z*fsS{gr_0DC<sp={Ei^}1B5?*#@?CBkKZ-5!JC*K#I;}1|G($&n(6WGd{CaB*^P90 zZsy;ga^Fljcy8wV&$@5sY}o%M?EL(h_PLpfo?SElKXY#aB~^9p|KD3x-89uLeH$9n z=_YbPG(<EOib~MXh2V(B0z?duSSTh&O)Q7RM14thHx0^=AcFc(UJ8fkiy4S9F)?b2 zAr3eM#}JZ8Rb5K7p<6UDAwGZh@AEx%Z&Os7OmF?y|5t0(y7$cc?6dbi`|PvNxqq%- zRv3;Q1P<$(brdojAJ(eaik<SGsfPClSm(;ly)Ad_8rH=f0sl6u{Uh<kRr}Skn|Des zNFEmHyZBi70~v_^`(5bR%cZ_ud_Vo|;$P2MR*?Vs#LvR3@bRjJhvme_c5-3CaXJeN z4i`VKdSej$tahG7hNvC&H|XQ{h*KYJcT-;<L$OWB8QCir6g7AK6<k#TSJ2-Y3!5D6 zc-T({ATPG!S0R~J<E$*Ac$@Ww+EZI$_vW42OVC<xfb~*wBk8wC!(RBHQkid!f+k|O zu|7C2|15U+3tj`K+mO?3kG&z8wE=qC(cRnoF3(r)Zm{0qUAF9l?#1s4S@tKwdrv{f zO`*%xL0izmmsMv1S?b_lnL*CR`KQ5aBC<m?EBXMBtZ%I@h3!OVAxj^l%u}DEtkwk) z>z?9&5EsdS17zVS>azWE7XIzb2hn<Krq{##Vx<?cr=t27758>N_QvOd&5osWq3lc0 z(o5`Lyi}}vin-<4rK~@;><n2;^WjL^tR<Dtc8DWinEbZ&QZY0d*p6%`Z+qT~w3~dA zzt!lonj37!MEeNZPxx=fz>2TYdXDu-Cf~(aLqneWr||Cy*ARB1QT((s`K^SRE4<~= zfhPPiVd*rEAKpT^(WKXybjD<t^dBc$3Ty4K8M$C3JBy*(Uv<C9dxYoHJga%W!86KJ zx~tZ|!d)F<$&wnLnvbf{?=;V8UXnlErOfFy$dC&LSzU_LAHAhZeO5p0IOCUK-n3Wl z6dh{3u7#%};Gcb_W()dKJ6n!jh^=d7@nxQ(xvf0wc>bQJ+S8mWS`hxO`#+`mc|5+- z<E;gSciyMp=+LTX5bKGdyw~$2y;P1eqwt9hQ9iK6k0yMH(_WCh{Z{ZY9)1;$w^NsF zHFeoe=F0E+_8L89r&;=j+EBgdYSwscFJ^xBpYpr4u)}P1*XQ@T+5DCf>+^d?Wb<2j z?$vW7&ymC*O8lWb3GX3na0VYlp^-!e`I5}!4Q#1Qp0!>+l+NVQF?MY^?FmB{!ec!; z;K6s?+TDcSFSr#Kjc4+ciEnCowY&b2Tf4P>c)Iq&o)NXD_tdm}p{J?#3H+zyJ<qWI zIJo5r%1+yT0{K5oKE1z(t~2P7SG#v@ewe(Ib`K-&Qqr6K_jgFIXYXU@Z0y)P_aJ|) z*)Meuz4Z3()3b{TS`*)N;>Bj&BOI<BlkJfmXOPN3LyK!C_uM#jUe8VVa4)W%(sN_W zOtW^pt9E`*1A8TT)>n6tXXJ_OL$U4{tbLS6PBXsXcT*;ZU-&NS8FJ|p-S<8+pr>*6 zR@0v%aq{zh=8=bcM%GU4$zS$xPi_wFUb?Wme)bdH`;VjSaI$N!e8ZjnWcP?m7eOme zc01QC>TbC7$!^(>HO5isT=GEcnClyVa9aMlm92Bxgc?2ftyar^jtwW5Js8=@Bx}<= zHyBzd(P^T9?I>EJ?HOJz?{;Dm^u<0OG_CP6_B`}cXsO9|-h~IIdH7{EvvSCbzQR78 z89quR3P?=qLx*GyuewFccJe~bA+Tm3-sq+7zIx%ACe1++=hdC68{O8_EnZUHdP+ZT zH1(Ez{!JU?#cupaM0P{$&dAyC3U1i~ZTzfl_eGu?&7N_P2e==RUTg3`-J)l;Vd&cM zZK809+DVAlXL{KGqLI`}!{>Ht5%cM+d=qWfu|F+4IQv}R?MOoR$m&os^JAWQo@*uV zyGJ7bf!kspW9`&zCG;%q<BA6cfP-1gzctAP1}CqRA9>#;c=nn;m!9C+gbjYNooVg~ zB{FKeZ`=%S*snt`03XbQC7b$Y*^>kVaaF>z)^K6xot?sg?QEdk8LSUhntk-D<c6Ip zt37MY$@}3ymJm%ur4wn-QS(xS_unEv1N^BSe~#Q}r!p@Y`(kR*Mk_O`p!wZS^H&{l z*~YA{(e&#c;fOvVU!$UnOn@``7~oAb_-*1@Lw3dCW6hN{;L-s`*|6%;3yM}MTWlme zns5_Ooqrj|)8*;%ls#t@Pt_$}nLp049^$|Jc*knw?;Ph?3Bq;@>v7s~fKBh<ugmf2 z!qNE`OLU<zwW8Mnlj?KgkG*m2NUKY8jOIt#`0kgDi#l}1Ap#F-?9NTH_KiQ0-)g;1 z-_B(|{#9;D9NmF>4q^{lYcGenOtkaS>z>5Ev9Y_IdenyMeZ$%Jj=(qdYmBz-U43=} z9Y*bl-wmCRUpP+z%h{BhPx#NSwQJF2oB10aAuN0Cseam9q(!jlG9PY>15-Q+o@w_& zwT~^xy6)BPk7BoWDWkFxY$zeY<IiQ<Yf>KVGYKZaBA5hE-+V}YAz)fdThw9Z2ib-1 zkxf`Qjc2sKZ0r-_j~MYfuOc`kXT-yzKlTccXB|d{MXcq;KYYaM+AG{Ap|4b_4dKwk z&Z>H~pGMuZhyB7?l&f;*Ba1TmuMY$Mcsi%EG4%Tp@tlDb7~wgi51h+dwX}w2-XczG zT@RR^Jw&#U<;G9{Nc6d5(KADqTi9adc52Kk;StSOw*Rw!+E<-Fp+DoZ-}cY{h!5^8 z+Q46z)O(5ceur)RB<Sm9p2AhcRT}yS@ZAM`E_jbXPtqCI`QaLc$$Ox<U;6oC;8ONX zCx+d{3cp#CkbnLkigoCJsKMyqe<(6AtjqpTe3R#wt+!s+oIf+Nb0=rwc3ndl9PK)n zu<;K8rtQ>i17n>73^BoQa}iruet89~UjeV>u;1&a_g6MZ3;Ov(Kkq-n-BKTSo&Df$ z26c=o!`(bTT#mc`;!=LT{@|QdQRgS=V|g2w|DCcyTF}R@_<6PV6-{$ktm|=b{kZ4? zd~y*+bNRgeFlh>lH^fI;b7($qN~{!J^zq?we%u57#C@kC4*J@qbx?+<>Xwg^WR108 zk!eHqizdtAAl<71)~3|TqV@r#TL&`W1m(BRH)lP>ms*p3U2V`O&Wf?$o%0lDLGPNU zk=n)kY-E^qVa~#SpnUdqYr36iHRt*E_8_D;Yp+lC-$j>xj{U2>J@;MrM9*pdp5AHK z?fKLIV7ZSp+r2Os?3XRNZXtOeGW!?gc};s{YVR-bgAK0LN6CdB$e%8WZbV<?pCsL> zj(K6-MV-ZmuI?;8dTeL$XW>r#Z=UPEJ;D4#o|VwOO?WvxSmkE&zovhB$_Ghjuax%& z(mq63`I^ufwAT9-`7UwUZz8RMG|pq0y!C#*VdN9eej$7zmtDf6fdx9*HHvrP>;vS{ z^60`={=dxr?3juCA3yur^Ct3teDoP1>u0M%R^wl7YwPVH>#ICBogT7&&+~h?g)GUj zxybyX*x=4jah8|%&rkAC@Q+KLEGlXqv7Ckc>9d1x4Qtye<eNe~@|HjACDJ0KJx!YS z{cP$xlILDzL-RnZ>kC?ETc>_)(0pb9Ys%Lw>tz1%uiZqvY}7yC`6B=L$@P}z$uM(O z*vhOY_h$JK_+dN);9tTK_8ddw(ewIwYD{$|QT3|L^Y@iE^_{gZZ0bX|^z664eOoOw zbAPL2t>gbQ{#pK|wvbtrk!~eDgG$kzOE6TnRo=HM@htVqmQxc)2jSnu-{n7=e~iEM z8|b-9eU$!uq^TF(iKp6A`)W_^ORlTEfKQ0#WbhmOU+2Gre}RAQE5RIBnv+Uv_lVuO zQ#yDx_9LxzHQ!oU_8zQsPWlA<oB2?Z^*NPVvC9kiM(&IyCKm>xBUiB}4s5IE5w0RU zD>iuru&tithfg3}Hx1s&E-f59Gn2pNlu?{hy&NCT8F}UrbawO<+LKH(wmjOp3A^?T z@T0TxR@&$?UR5fS@9^WTq}H2O^mb^-$TZOvwu&n3KawqVz~Lq*7tsg8!_v=H?SU>V zYnHbgJyYk<v=+jLlXX10B>y`8(kCtJMd=rXkTc!vM}?gQ=)@iDE6gx!9<BEs_5rlN zY{jru5{~e6c-AP)TFntG*dHXbJZN?oe+L}q;wpoFZ4EK&td|+Hm)+91y;q+ug#0~q z?U$b-e)jW9?>rp5hbVUteZG@&8HaM{Lho^wRcAr*8-7JPk!av}%3dRSz;94xRGzg$ zS0p~f=<t^VyJ%kRNOwH~+|>B_G#2MmUOJEH!E!Ts?KM4Giyj1R{F(6(ZL98}3|!Qu zbNIpEvfN2i*aHxc1?M`)ueYt*?=)DFf5X{})1GmL^Vq_R_93;`+#1sQeS3EboM?~G z_(#<4DfvinrgvUTM?r8OaR@%ZPDe2eomiajwXMNk6?hSxKROh>h&(6p9&v6dexI;( z_P3#%sqBNPzaI>+x{jJWY**p<X6@Tq)}?#nmq=Ij;T{H@k_*Fm?#C<OBr;;vPWciD zH`n?&L3eDH&M)2Ys#>e-aLV1qzY#dX*xd%PpTt^NeA!`JnOnr8Pfq-xw@&GdIq|HO zG8+}Y2YD=>9_8{^A7bs;=}u-n_P5Vjv=zv(v9vcGeu?CcD&BzZb}9H6Wm$`lC2k4t z$e6`3-rISHZx)a6<KffAF7M0H8}4Tu59R$P@_ek6-kc_GEbj=8=rKGOlJCpJox%Gj zh=cDJPvLzQ@2BuQm1msi4Sv3Jc>gGI37*#yr*+>IyhG1X*6WMs^L{q(=*El1@6&jn z#q)CV9!1`Zc}K^Ieu3xbi5o%O)x1yj%cOX(<^3w27m$wr({(NH<cofl=WOC`A<nw) z&pnarR+u%+(6X?6aTx8c$aODvFM;-C1ENnRyvPqrS5Ugr77!=8W!~wF`v!42;<UFM zxo$)Ee3Nzy>mh8EW$(aA8O86x=DF`3+9jSlTu9RzOL9F33%&^Jz;lSJ_F=fF42B@? zvt=+;1H)wU%f=OIdC|bDI)kua)p-NmD|0$~4}xWi_8@r1c|!bMC+UfNnU5^g{Nwuh zhWYuL{Ctgl`A$YwAb$w!Y_HW&k`a=Td!T3I!_50uy;HAbpW?m>e=7fb;#2rb?|+hw zl;^u;ac>c)ec9o_VqJ$n2X-{&xzka7lI8r_SDH^5%~48QK-yM!L;eEdg!^j7|4GVe zES0V^?kXd^D?Y@#>ear}bjm2t%VjV;4-DGNhd_4SfPA-@vsVA7eowcSo<DCLhun+t zKa&4w{@1~m_wav||MUF6fxOfFT+>+UuY7y72A;$EQSa!|o=t!5!B!oF)xS}Mhxu&= zb^JxXR+3469cNb5aZ6bps&hzL9Y(HUcVV92`X3jtr(;*;*!MB}D?g=wve#?9`(xha zHz0eTbb|L<Gameu`+ha!fL&3#fgQ`_dw*T;g(hwE>NidC<S$akni{zC;ROFAHWK!v zq@V5?ej2u;bMxG9w3#s*LRna8I_vpN*mlE+sp;PF@T_ca7vt;kIp}&`?Vi^(M@UEL zZLRly*E*R!u5<GzP=~_9Czirv)CPM_nK8+p+0Sh6p7V?C-E;5Q-u;;ews(K_`t98p zEZN?joI`z=ZSTJD#O>V|O-0wXuJZ0`xv=MZznIiB?-~3@?wH#1y$7cCtiAq>p0!J6 z_pF_BTF=_c&hJ@!;wkt~o!4W0qgv+otZlifCs#XZ5Hc)!$?*fd2JTB~AKQ_une$S& zbs2x`ftfke$n$0XU+GEKzWsR6hfHk>pPEvCP93AU@GsPx>XBcze5ann1{0)nDdjHp z@g2X<!Y#CH`d#$nu>Eb$P~PwXb>)H08nXxcbjsY9@d$HsZ|eXr9GhbBRx{==uZ7&q zOJO&&k+xsM&i<O!())a&HuW0!YdpWUHv8K5r7uyJ=q69yYfW7ndhSy^<KA@Clym=Q z#9x2uKU*8Njr1mbe|hV!gT69q>h=HKI_;BNGM_u>N3E;>&ui0<dhPqIUvkg-)pMsj z-1^1U*ZlCEbw6(H?XXsiI%7lYl?NaC!4p?L+IrAT{a$I^wCi@mPe)&V>5)?&y6cyB ze%ZS5q#Y-G{eRYnbXQFN&0kOULSr|2b<C&2h330q%y-E2ZM{d=dv6_m8anHYe6BY2 zJo3!oG2ojTcUd6|J|Q@Cri90gA4TUf^M}@u2SayTt>@Sac`pCHjSffs?7MXtydq!z z;>Th0=nC?^L!5M#d9`o%$S!2zf1>hAKRdE7js3AM;P(_SnW#LckghgfAuZIf-mGo^ zQ9se+{;7U0EbHfo{eEIAXF5ula~hSfjPzkaKkky=AN1MEE-SY9X~ll}&{)>TKad{a z<$FG^wwA@QX79t*i^Tt<z9J0%slHC7ufnIDwF+u~X;y2E%L{@XW1_(^{xMy4MZdVD z%%riGY4!l+$2S^U(tgqh)Oq^F+*6c{ds||!=H=teddckRp$|m02lW@q3!l(aG`r*{ zJs+*zZq8RQpPnf_S~if;$ZYwUNp@N8tHt+^j~ahS$qUK4sI}~k$dYB)5Lj#RbfJyv z+UE{}$D^6rEV{sSk8n3_Hcw?wYXteUZzsPi?XRG#G;f{sT)sdbv?t%~!z4W&U#6~! zlrecJgHIOpS^8<M^*>|bDdh8;$dS;Mzw%uAuKf+sWGIPlO@GnHwq5^;gYdzY?3k6W zN@wyaht9NFGWxHSWj@%JY0+7f6nfFD{I^@SA4K>gwuS8Ae22o4A;=fx5_@OdofKkE z&-K?xpBP)Jdy>W*S@%}!X{N35v~k)IC7e(C_{oKDAuFr#a}`{n=F@WGJDp|NS&P48 zi*%aj%$-Z+aS=Z*-tulwbqjtc$k#CQ4vf$ouYFhV_$A>Bz<!9*7`x_B?Umh13*zv7 zi{{p&A33t^Gw(Z$5n~&HzNSFamUX`TzrJhLzS<oc^J;gpMgFhJ!iC5Li++aK%iIX= z_gGKlEpTE{&tCuiG2)R`<Y)ZJXYv0TaqqES(fvl}f>-U0%C~bW?>d`t3Unshlze$} z_(Bec2G?>A5&W|Ge&!<EjTb~;p|Q8@9Dpp;9F?zSPN44G7@okZIYMKw2Dq7<47~FM zH+d9)8!)KMY1d&>L?2T8j0s&k2jF9`wJ>sG+hM?wslBKtH}$HX9hwgrgHeiWnbDK4 zy~gNKedSUY<;Jr9o<C;KYsiUhZcuj2H9duvYfRaX_+?+B?K=9ZIY;zV3;huOi0pvG z4N`b*89lA_>FH9+VKdUa#JVooJnx|`pB#J9h30v6D*W-qAHJKTV)~^fbv*U-7h@Of z(E88BuRp^*Y<0)=pBQ}`l+FAm9?&>RU(whYU!?leyggOuJ5D&qK4o6^>yU*Vv^GBI zQ{Y(qh@QS}@}=wY=M(N7w;o;RV6Xmo`~<H!wO}9L;bo4_*x}@<g|wBiJ7VpCl2Kg# zi6piSY!?S-GhW)I-h(;MO5Ha56L(!8zs_^>?Zn&Gf-T|L{4MN7Zn3j-3mvh}+*;s} zzonbN2O>?`2A<NBGlK8jyzX&>mfJ(_{G9HTimKkk%)(vgsLcgA)vG#WThMy6CeA%# z>?5iyeY*LN)E!zIDcEW5ud-*$KOX(;e9z9L?|L2j*#X|eu@%~1iQ3i;9<YTdAGKq3 zg}Q7<?t2ODz@mQJ`jFQ<l(VnXI){V~#t&&i8+$RLugSZm@9e26`D%n3HhLlF=DhX< zh0|~{W256VXNG3-L&2T)h||$bUVLdE-+&FuYHm~g*lFzQ2JQDmISWy6vlkU&!`kwp z<iea2&g54Erwe{<S2C3OoUnLLa`rVtJC-GxqPh65Rnxo^fUAl9U30e=_6NbDHSb!^ zZA`dqd-sV;*t46nz5A0>w|7rGaeH^`nC;#7Ul#Al%sH<oGxZdFlF!BWcryPBd+x(0 z;I5Vg^6$^3Cu=jwLHSQ>-LE<iqt3&r^P|)`nmRv5okvjTF~^3zmyE7AEq|c;8Ha7^ zlVrK}!g+rwbo`_jE%ZG7$Bmi%`}<Cu*JI5=-#anU6Po(&^MYl^oG-t2*VIJMfH{AD z-aGM{9<SxgeK1M?3*g)IqlX^*ubvSTUmkzs<8Quq|6|{uerNieudkT6eCRVD&e-ow zyms39gD+oyUh7##kGr>3XIyKTPs6#B3lE$b^}c)N$=)jbi(^j>^j3cMsod==))b$A zE0b@?#yvZU>_w&yoOb6<_#q#TXY!}#zm%)8Zp}Ua*7Nzs+_K`J*ynPCoLs(*JMP*V zI4eYc))Z&n*{*r8BX@~pIQwwn^*83|FFZTL`%Ufk$3zpM^qu$VuE*tz2mFA!;s>PV zV@p20dv7{#_{Qw>Ph57_rN3TwS7*K>!`!_VS^9`{_>*nxkyM&<rOs)bDWz_3yuOxo z1NGM6ccwe4bhlur<tpQUFI$jgg<#q1?#AtVZXQ|L>@L?Fb4sDA?WSB+hJCOE{(qcl z(%#x(&o3+J{=TNzvf>Z!_;&XLOTOJbjJd_KW_yco&g7LoFt#)|x^{-n{B0W+<NCoK z;@ofMq75Cnn_7}Rp)psPbA9rYf2wv;$!50sL+I^S^+d9FV<Vek`fB(MntL5vn^pU# z9{J0-Eti^c{(|C|)2-Tf2;=krfZenC7mxKk!~B|jU_uYVb(_=G!n}B9;V^s{o1BXa z;j!u5hq4zJVxb|$#0dN}8{*u%87@wH6xoyeX3puVg>UBI+f3Q!7T#y0|FjjH=Gq<> zN!wg>a?8SpWqms~VePRZw`6Z`oQFS1c&Ke<hDg_k$B_jIPdYw!y&b)7Tt4R5kY?n~ zU3t_Ial=LVj;If0-e&XMNVyPC=}87|@D?8X&0K8ckYews4PN-L4PI<y7~97jZ#sG7 z5B$We!RC-(=jCndOyHZrxgBe>n*~;AD>{~Y`J7|1e{x?QzH?@O89nVN8~avvO)+-N zFr%A2OdU;x-5g`T4w)SLW-j6$TeR0Lq0Z?gIh9>ps9m=>R|}ndls4p7Ugs{%+2}bb z%7rtFb9WxIrq}|$+ea|oYddlSbNKQtUjlv}p`G(Qb3TGGk__Ez733H4NW@vndAidI zDNE;(pe5+Gts$Ko4DCiN_H$j%lZ%F-(-IADfrhW_qhX!zQ+=}84+OToR*!Vd=2~d? ze921cLC0jQ%73XzrBG_(_}iIBk#QQc%@4$S?q{r2pXl#2=uGpgXez+>-K5umt7h_8 z?&XC#_~Mh~YihZmTX}WPS^62qlSf*{T)-KnWY1yv#@2wZ=!mwQ&7G`G>JNR5j%~~7 zEUV6b<k6e-p1c0Bo~74?x|d!z8L}(sU^Vn{&+y6Kp@!~fn>qhu)NjWZ7h0ZQR&dkH z3dhq{1ioLunA_J~RXPuZEDyC@)GgY(3tukryqy%CNbbz^{@ciogm)j$YB!l{Y#3gA z3Vdk{+DA~2q45$;nK3{%g{_%+$rB5EoslQVLFs(Z_;(Nc=CVS1?2VMuSS9j_+R5F_ zxy_QHVe8Z0K=zQ1pw1)bI@b5*l>UF3?O5ml&EnH2JUZ^dA;o8Yk;%6(W`+;wUzk1x zd=T>a;3PA)f9}aWP}&Ez)@6SD349|$&@cYIUANMYCqB@)W0O){#GkD)@XxnMI|d$- zKItr9Q=HQBhwe!2)7{c5Pp$n!x6w0Oo<<*jy4%^@(lfxSE3Dei7_vUn`B2FQ>6Ny- zxX|#~Wrb6Ri{?9xTnM$y=#Gq;0ezxpj=73C6n&pDkX#Fa53P4>%CpYi*6{UZg~8B< z<jFr%&YZtOerq2^I%kQW=g1GJ*-67IwNG_7OytY}=M46^PvuW-ExqsMojmk?wwGY8 zVU31w8L)qRS>Y^j(J>a8)^au19M0IUUfsFE8sU&+%O1q}Y|m=h*ezViE{mMnrnVNt z=knjyK8fxc7F_5%$hJA2DPQ~cAtClmzUQ~k`1iGa)Zc3x9%CF1v1*@{?%y?%yq{AY z%tfNJuzO>!CWQ=2!2cr$7n@S26>3tNi>Axh&dg)dE5osyas%LH$w51FW}!*zGUT>& zGVCnH!>ChhmBSc|=-5R$@tv!7D0_&W^dn5$P8mF3Gw~$}BAyTQu;bCg!subDPj|a& zZpT&=%`opBJav2bhpyk=-Gr|6;W690o6((gzDIfPn~ELp#3?;G6Sj8F$vs2Iur5Uh zx_8b+hoJi$a@U;m4q1EI%tPu~TiiQl+Mu<UO+MuA+LH&pUYj~ZvPyc{t~<vpe!Vz* z;tj9-diI3h7C-qPAN**R_mL+jzA|q;de0H9-`VRlG&Hoeo?-N!U$q*0Xaala71%@9 z|H?c1OOuUUsYZrY#qrmmFX%0s%lm?TrrC)DGx!X-_-@A*u)n$@&wfT!V-1aaXYh`V z4qbJ9pY8CY;|6*q8{k~cPunDW&Tqj-VCvhCGscgLp3Wn@170}~Jc)+R+qJ!W*6+4= zpa0DE?oa<>d-v=Iu#?__opcFy((AF4UWT3Y#FCw~ynfkKWhec??<V!k*|oj<2hU9E zS^JB#d)7X1R*!6^YnPnaV{E3Eoes{ina(-2=PqofnK>8s%x~G#b8pM!p7|$YlRR-! z&)H+Jy%Kj<3pUj;DeU;x=AfS!*6tYuQ$&x^nv=QKI<dFsuBjV)jstJw7!$3xtTEjA zi(U0tXyjh>YppwVCh#Km3hzN?YV2fhxohf$*!tIWPhp)CinD%+&o3-Lle5vRo9~tk z8MDdQO7q|)!(aCZ%a(9AGCioHiSt*Q$D|Ko7wy5%sm%WQX6t~tjmIATowk#LS@7x^ z$=^Nm<v%|DofRi!Zv1*<>znuOIi~(+gIn#3-+5>2l*z5=sm*^mJk~loeBRR|zxc)0 zp&hvop8DOa))QW>Uht>+x3=E0;7f0Mhqt$0_krkYed`C4e%$iN+6P)+zV4UTq>lKX zi5D3<d!-foow3u*Xzto6x`|mwz1e%tB=ktF6~&)Z3PYe9?4p~+3r8UzdWYA0_1vL7 zZ3y~j+|GsKEA!0K(a9|(+Q?$_@NFQ_(p=9zJoDq};ic;|4t6$+?-qEZZt*7k*mW%R zvgX@nbN&td4HC{`R%s14=~I&mR)X^%@hOGlrl?$F9vK}SUC|b{RMQsx{78ho8f=gI zwIf@r&O3{C1NbE41s`zT9m;0bZe@-PH9Tw9bRq8K-_tskd3c)Ahk%cUE!5EnthTi@ zgbgz~`H*?&;yR1jRv3bemai;xYkSzu<grbd@eS<Gw!54(Y(mU;k_Wb%k`8!m$fkZP z5oYd>hQ_Y<gj>6Ma$&pK-_W^wYccDHQkiPCZ5_e5n6T!~J=hYYSMol@wn8D*t@zRt z=&`j3&l)@Jk;^t|#krSWu&iJ2S=l@DvR_XyxJmY`J1Ok-ww}Y<Z#v^MZMO?PRfo-Z z9gl4*<UnXASY~a=m~Z<yYYeSZWXBwftyA=UBWqBVmAw+5fj4@ew2YmdIvO;-te2zZ z_23H#ZB6qedsNpqB3ZA#I_udJ(q>JMZ%5a`K77~=_>RSuqL=R`j;%9rg6qwLfJ3%% zl|P>GP#v|k+q;8$#=`gV17M8JxRm%TF*z8YPycc6hT&hj7xe14{G`zOa3M5eJ@$j8 z=B&c~$6>=Yw$_qwjPNTNU4yODN|w%P|2H<%EphDeV=eENQ|~oro9<DZ`&?fB(GhF9 zjV)q=#;0b>vVvrbe0@ig|2gW8v7b2(zl-25{PMKXq#b#HG>5dt1Ejg6jXFSD6KTWB z(k!<=pN+M9VZIZg@sRD<Vx2sk?@18OqnE4>O@QXcpW{vBn-+TpbQJZy0vCN!>GW-} z!urmHp}&gy4)W_0&!|qPHO?Hof4wQc&f}>6K=m5m@Qh$xT!NMQRF`v3tmozGH+H_< z_B!;MF4*ZCb@s?(d_2w+<<r=1o*c^AwpfI<Oh=(Qg&k-Ha)@}_i5FH)8<EpGqZ&Dn zPQvAAnIY&=(MYyEf8MY8egkEy+;;NJP+yy|PvvxWts0+0{DMs1qx4;V;o>#t9DQq| zQGPQ`FUS`rzQA+N;oB69yL5QLEIb@fUxhb=vl#tyJ3Qe~V=&Oi8M2~;v!hEm3o{lf z7vKn8)3mR#Q$7D19DV)Y#L;K}MI4E~Uj{EuD|q7kv(sw#l<xB1ha1t^zk?f<I}mQl zaX+D~e!*cMF+}H&8-^aucu(jsFbSW6LFI<F4(KuYCY0b+n&{ckvY#Hn8^mjjMbAOJ zb$~Ip`x)bMKByey8}MV$d?7sUsX52{E_(=y)B9T9Q%>*eq9M`hnuFk5KVEPM&!W*0 zoIzClD)QTLryyF5*rhs_6E~<S>nVIyW1Go$d{djJ_=X0{tMT(KB|L&~ogcoD@UT#+ z4nAIFd<$GZ+(wvrbXU;swS;Xa?FHel5th$b0PmLx3tsU|Fg_vXuJZBG+DSMVLA^Sc z_Y`6E&5BD#EHE<S$D{@05sahijleIa?uz{EPw(2n-bs*d0aFUx2Dm=Qhf8?e=i9Zf zJ@(A{+8dtum3Q0)rSVsN@_*>B3_1nAdOqz_=J<*-ns2P6+E~~pqlF9gqndhC)N3V> z*YPYmNydB3AM;VdDRu#5cL%b&L$V`vS_k(t==|SI*_{?EFMTv)+(drqOF<pNrD$X@ z@$dUIr|=*@toJJ3Q*qH-$?vm#3?rl|9Kd4{4#w1sn@@v(LVvLN_7ga*!Oy>sMwld^ zk!&B0>>;f3!oA9)KbUYZuI2n0<iXBiXd{o!;csYzab{nwZ>&q{T9an->wJECi8d7$ z4XD4r_F)k1l*T2Kw-Oqg&i&@3;jyeY5t$))A3GcTo{nw>p3&*JOSE(*9eWt#LwVwV zPF$5gmZf_4A8+Z|8sk1X0bl5IHvUY_!>ys(uW8mf6z1w9g1K5_t@e*U2bt)Pc`#Q8 zbR!xK##{ZnO>h9yFMv&O1!H$J@qKN_Hud!_54}{<-9qxJU*D~$BVAU<L|_tZf?crT z&mR39b?p_cr_}dFe?#j7z|Y<T(E1llo6!2D(E26kbVz5}bK1h<nlk!UJFJNfPoRtL zNBf^9Uj7N<ca43(?=y%GXs(ie_TeMzP4LGWe~&(TYQ!g0|0e#Ia3)0GVM_b=Ta9vt z7e~3nu^Ug5uK(SL)uwy<y2cSduAlfRTZUtkDDf(;^}C*w|Cb-W{S0f@LxjJ>Kk%U) zJ;L(df3Dhl4m-D#jhnSi*jceNY)Oxq=7qEE17siK8!T1hStEdtX3c4VPMTidkxMsp z?2NcejZb)AJo^RjA64x+)SDjBu~RtE9cn6TamTHm>#Qv$J&<!2Cf>=G;+@j@U&|?- zC0-ZXl0THYd&8U^Pg%XMo4lOSn!&lBLpfW1b*%UGk&Q}E=R>2~@>jXYnVQl$^AY3F z-5NXc>-;)LjK|kt)Xtq(GWQ+2i8AA`gEY3AI_#znc&yZ>OF7-a8?@(AF44Gir@{u7 zaqXn*4k)$NVfrDNZ6`8$M`xbF6>^*<i#g9)W5xNt67kw!CI0?8>y@H>dk<!ub=RTd z;kicw*{^!E4txH?_y_7NEA*zjj`0scm(CpPiDz_AFzsOHiPre%VA+4gHr-j2Zf>(C zW*yX3nO53A{ZsKTgOQtl9oo-m<n9@@BmZLj47wsuMm_DDnKMAZV<*{zmW?At9@aJW z)}wDk*%tuLA$B|xim;C$`EDgH9&D#GLn7&n&HAxeZ~fqn53`qKWuGrfX2_=@Oy53F z-^aW7(i5k9=@dUMHiP|wDaE3JZ2@chL;;_gX6*wvC6*PAVy$htn}$-pLFFPz@B(ew zu~T<+7+l>}Iw!>U_X1qq4z8-1$C%d^+txM3pHsJFAbdohOZmS=p7E@?<V&Bjj(Ri0 zdd`Y3FPb%-+DP2O-p0$tu-l1!{KX<TWY6O*=Cg!kYSeat6+Vk)Sp&z_pBHynb~+b! zI&*0YTfFl^F~T?Eu5?spnz^^gigS+6D%mmWX*0O5_bhOA`a0~v+E1~5$3NlSN*fvc zgscSLs7b~>H_i8UzA?b7Vti|9Z-MY-y<D`{366xfnEZ$F6u(;8TZ>i(98p(vIp?Jk z+NW8X8^*IS{an$(?rQ5^hq(57LVYl@HyM@P_-8yr+DmfjAL}5&6dKW<Q@g51`%LZJ z<7_)G?bk=`=W_-En5GoiH|`3%A)SXnj!pO6SUPkVv^oR&4YRL+T<@~J>{!oUdEoyW z*ErV8{Qq8_|5wv)_&adVC++mVlde9E`#b4P{iOZ=YKL=~+|2@i={^k3Cm{<&Pn@TK z*2`(-8pg@ooq5i_`;|;tM?S-pV+>VpD|*nyj8lm5x0h4ry3+VxAz49NQQA>^<!vFS zOxnJBUMl{Uqbf6qpBKY_$RGbn(D9v&|H=dW?>|8NLlyB~C2Zh>-UIkf3t*0w;@H<V z^goIC!>o+=6W}?TciZ`0F$T{xTF+J4E_BVg{s=UCl`Ec|ZqCGr4{VEm`@A3?fUkCl zAH)m&@d0~l&2{1f$~5tuKwJ3GdAI=KBML8xx5T63Nz!g69(!Nc0P=j3cVsi?W-{Iq z-sNkjvN!S`<++e2`mOORY(J-@Kg!-@<_|OOnf#HAn`CRq*P}-hmYi?noQib0QG}(3 z+2q%`UhewpyQ?I~Gn72Y`Mx?D6i)1`;~-N<A`g7c!j1SGTL}ADPndOw(N&S<F0!PK zd1mCukT-JV$zBrMR*1bu*|(^le@9VvdB-KsG2}VsWMjjti+2un_=mF0HQ7u!>D$}Z zxi3kc<gx8XL*PSeoXWDM40Dv`kt#pWf6&*a0nBe!-1`JL6dZy<V?-Xtx5L~^z<tS_ zwK~_#F^$ZtP5dLw!`x9^#FqTsOMKtW>iB|Ob#f^>6K5*upP8G5f9<VV9l2-B{VXr< z&|E+G5NyI$I`@Q$I~O@me)1}AJ#n0k%QL3U4P$N30^T9xw{z!Er-8@ly-Dt70Qbkz z=j0>{xjxN%E)M=;!ux{aNand3_tv7yH;kQR@K;S<_4jSsQJ>%EOug;rm#%!tDcCQm zBNDrndGqC+g5`E#QP`!7m6FfIzIg2c)l;X&Nbotag+-;OokgY&mDiceW&fwQOYQFQ z+kLH~-JpCO<>dpdyl?q=Um|b$xM)lSYdH=+T8V>{U|mo|VK^WTj=>fo9Q>jJmi}-s z3mjCrFLO5U)?%79ru5?TiBtcb)WV^4iG@{yNpO$#>%F(4UZo9T%+=<99iUH|v$bwu z?D`#3bPW2le7`Xj{#EzIe!Gjx+7;bs?fL29`{?`|K{{!o6Qy6`^O5cY;9jSl^3%}R z>HJ!gKXw=S^<U8s?DEMI>_+#6=SNh+pQWwr0_mfRYZAb}9-3S~37u)C@dFh6oqqkZ z0{DPUda%;w0l)B;s7SlySI}z~dIj!~gFYGi{mzIFyYyGi@fcd_@avBE1H0Pz-{5_% zU-!q#U<>fx%y<ia!9F5L|2udOU>DvW@nPrsVN<@LAJ~QWay~es67R9n7#qA-$O75f z1>56({eR`|jdEF_w8#9kcPi5Q<B@N2UP=5B$Oso1AR1D<WP;K-Z-o9`k_k8Z{ky^+ z+uzbge|&D{3}hV+x%=}(g1#j<OWO~R1N)F&4b~7AUQywGgAc!v>Clzt2lcOu{>iVX zkN&|Cca`l70po1oPDFA$mG@2ZDZlFaVFjGkW%ES&e1xu`y-^!l7^1bRc*Eihl#x}_ zEMz+JIuZBfb!U;iw&=R-3;E9acFq$oc++xnUhaf}_+P}mb=ghaVZWewqHxUlQl+ip z4DShL;d==mTNeHa;iCyl{+H&C1x3-N=>2MB>nOiJ*9T*3=#u+2Nmtrc<WYaGuIR7i z?{1&pC9AM0MayN9<|6G2md{1Z<;^<RE<20r{+?g=+@Njx7VwP2zMPRmteeCKd;h1m z>wz+O&k4$u@saBMu3zVA{lKez^ni{uU)Dg24I_|2BPMx*S3WZa-b9I}wC|}qx#`<x zoteIpHC`2REs}k(c(qx(&CPRH(-GS1(Y<NtY0Zf^b9XG`opl&8$&GvAh7~*IdnkIj zGV#{y5ewe17UVXu#~-VbzR23q$Mw@b>`i{(%IQ>n+e~`N|81J|&t^yZL;_x#l*wza z^C{AmPvbS9qW|Ue>BR9_X1x`m9D6EVr*md7kbSy`swTT{ZYho9+<wOqJ;IFRE+6hL z&iVziL-UD~EsddMa-BbpOBqMO*yWe`Lq!>-z3HdDN?N5XP`zdh(H}#}On#!FyH$O2 zVSjXYs6URQ8OOcZ(l|!qj~1^sy8OBMk5!DJt1)yLLw`ODHQZvxaH7T#8mMQEvz*K= zjumgm&fCG-f1w?#E=01cijJEu41q@AU2Fro|B$-I=kka0Zy3Chec;F5nCj!8)|aby zmf;|vg~`4=Tvd^#wFe9F<_^YAd)UGk!p)5N;(qX@`fPV{LHReAjkTGhp`CwcyeIkX zeW?sK$%|nAZA0c%h0{6By^i14s*jZ9$h?X&g1^<TZ+1WMt6np=`Qv@Eq0h?k-k(0v zI}G14uA60F_&9Te!&w@QT_hKb`)Bzk+5Wt1pVj}kXMyX=6lKxP+v>&Z>D<fQhidN1 zbTUI4K9p`?ZjDOUSKpN`efNd;O5^hxzkegk`o5Qbi8dNOl+}K)8OP81`I;*72}c+B zX$}3P&GKm_N?Ikqs2$M^^RXSCoUxz7W-fZ*J-?}p9{yb!exctsmxA~4ejvj|55k8H zEl7qh0w0U$hx#KK^;%G-LWZ-BHR-RCUfG|2RfePc8(MIog)Ik=;oJ|fpA0v2z}N&b z-1cSoMDS~5IP*q82h*X0N;&==AO7$7{i~GY_mLjRaqYnv8P0e}hI4I4AAWAF=zqBk zx1G`$>KtbvzyCKpz1fHPYr&W>7nk#Ndl^r+_;mfWU*__PG8*5je7d-}q7Tv={$Jqf zXMii<>2{x|x9h%HY}oMSemt$d2R!}zzxwl+-}j@+`raQ;qkkG&KC~jAaCE(oqhbA| zN!JvQ3?;3S2mZh2X+GR%+WvE0|2!>x1U$V0e00)}fT!OK%2e?55Wh|)#=q&$|DQa4 z2KWtlI-rBkKnImPeXI}vkNo~s^7Jxra3G#OhOz;E)>icY@9}h?e@Hf4S#;9u`eF#X zo0XLvN_V(yScN`xJ2o(rrn@m^KSMuQjh)NH)%bB$#D)F1I^wi0iDWa!Qs;4Y_N+pk zuj5pK56jtP>;Zji`F}%Ch(X^;Uyqv~&_sny88K*|o=^=Psmuj_nOPNOl=fLaEm48P zK&HfmC-j6m_M;B}C-g$rAyL(PgJ182vNr43|A{eoO8-aC-KKo96N)EeW%;n@c1f=o zfUUb48~M%H(<9g`bx)z@_W`j#6i0l#y<mmga}D^wKD)Pfm*`#fUGLX7te^gr&IbCn zlz$Wd8NdEW8NB5(y|YZFe`jwArf>UY{=z*&fiAByg7?4tv^}I%$|RHL-^Bl;e!bhu z+UyVikNNqwl;x|$|JZ);-+A;t{9j&%|6lm^>7J>|{s{kOoq^3k_wkn7Q1@G7BuZ;V z>~Cgm3!XaitO>+#qLq7nSj**w)_@(p3_TfmIAd(=;=*wbn4}MG=c%yjSXlvIxy;xj zoCBk1-cIQoRR0)O&X*dUi265%8mx_?Z?$tB?Fi0b+%*P!82f9XZ_&1B{I|00qyLD$ zJ6c(PhC6Z%^g(5YoZw*d=1vuC9dG$GZZnSs^llF;@lWyq{n32_!8-I`wI>KyBmFt^ zbRXxkYnJPx3(MxM9e?TV8bSU5$0r75EXI>^$W=r0vd;@Q$5y~BnWKLFZ}ER}8UCAT z;~(MwYi0Of=;QxKe>pJzCzatpSc6#=eF^9(!2iFiM+%pL{ds3}fB6xt4K)VA+VCdE zKxJf?7LK=7lu_D6{+PZ*S|yK4<`^DD=F7L*#vX9QzaaNJ{JI}4Yd7$<E|>d(-TA?? ze3Cl>PkaUb7-GhyB=>`Hnaa3m%~<W0<^shx9Bk!6@XVQ{X+KnbZ1>?<-A^C4ktbOH zhT-p~<eDPu+Gq`H&A@&xc_e+n*sess+`%c^m27RY(Ws4|`)#z9^<gjg)0)+0?I9b@ zBF08~?xBL4c-d)3GDj=!5I;_Phd258w8m}n$M8%37=EFmezpCu-}Z(5^iMDZ{gXXM zeKceE5BjHdU3vdr_uDw5qWz$MLEm2gv*ayzgHnIcHx7vq$DN_X1%3NHar&l_?kg0G z>POLUBUaId(!S>R|6>Q}W65vEr&DCC`ufk<G6EfCkgtC>l(j8dm5+*ORkkh849Hfw zIG{`Uq}beDaJkvLE79g6UuN7x|3sT3CnCes_~9VWCCmTIj~C5aag8-+*;&8ePP}v( z+l9UuBfe?kRpYDi3HcPQa;&{89qS(c<9HW7M)-2GIB=gFc+sc#dcQBPm8HqYNaYUl z(|$u*CBJVV&){Qe+j%M<jxWd?-U9BRPhSpTCr<vCrf>A=in4go^i4hvzCir<`|7+A z+Dqr<%UWuKa4bhVkz6>%B_QSTv>i@m^U@IpA4?vmCZ~Mj)&1lV<ILqB=nj?kD&H=i z1eZzOom-lZvBhmJAG;4^$Cvyl>*Mi3Ul^YO@jsaHi^NMZ<>>OX#2<?4XH}w<Hkvf< zKr{NN_6l`QJ;FR4X1)$&p74K>kN<1^u`zQ4^P&6>lzt)UTIYmg7WPfPlS+B^YE@rB z^S;jCDBnE4o{KBS(da?Uo$>(<=6dbdONPl#RlZ-qnezQ?(P7RrBG00#pUV==oN;y; z4QbA<<6E!#=4&v2f7{PDxdIN&-$9-ud|I7QQCA?Bv{$p=7|ydwdmG8P2aoVySOnJQ zYm)2_Fy@kx&uU*dWxhGuEZ@H19#hE@r7Pd($fNfG(3ipkT<o!$M~JIq+!c0^NxIuw zejV!fFa7@1_rbcbPd+{Fr`7b+SG6nuRMqiwUsiok^S3-EALz@={3*0fghu-IuT)2z zIs%=&`v7%lzE@u6j>1jvmiEw8w{#1w(V+RLzQY{&CG4kDqf1H$(^#vmm(Yc!AG}Cg zfo?jUx+Jf4ZsSVo@1^gOSBe`=+*QQIDW~uiyzA)@|2f_*@Ee3L@zWyky6PB39^JJg z+x5J6`St_tzv#FBU_X5o90AW`M?7$!d|nUw6xjFIl=Ue^T|d?O1z1HFlYH2Q)BZ5v z`lKHgoa&?Y62|*5273wmj%KCYRJ{i8>^n-YPEG??%o%3iF$b=5olI@)J0@PpkK(SB z8t3Ms{C^|v0y93NvI~l4@6bV3<x2M!uS;yoXAP{G{Li?{z_CiYw(y}nL*Y$hc5%=@ zOJiEvS5(@SK2AT=54_q}G&nWmxxCm&U-$lrZ&Y$OvBMo#Dfmp^)C%*>6WQyqp>D&5 z>NV=_V(wwq-YEWuJL)K>?{mE6mzCeA_Pz9t4*4TO*Jj;i_?$JA)=wJ4Nc`4ffJ4g_ z4V8R=enUOnm@U6cbHA1Dc0R}H3^S%&`IgDQLi%WHK|$m5BJWyzi0^Ft<v-<g>Kij% zlBXwtH_5(|+$`l8ImGhL@^RKwffJRHyi#3(ObP)j{m*lb(wCjS-;WtjzEMKFWJsVR z>fQ+Hgm&$D@)16w(ZPRMbmij5#P~<ztBQ{TmqVZMWnv!EcY_xcGW0{TX*Frw?OxFQ zEWK~_pL)9l?-%`X<YQ@lyeT-9cDbLnqasbXS|D6<mPhZ4c-PuPWiIv0{Dv~Y7}$(K z(0}E*%+K?DMZH!wQIMWxgO^Ym{D7laC4Lgrl~_>J{%>9E&SFEJ{oni~z8N$lFP+k^ zodw-mM?~Ux8vo~}<kF&xKYL?hY4I8#2S<a0*}yFPNS~OczTlHgxy_Bl>HOfHNsqlT z&BxILKD>98!7IH@eF^rf@2E&qJ@VC5J*|E{_xtrM?*}(QegEy}SyWM<IpYWa+rmpG zlRrgxDVGCD@RIB-o?-B^azDB`!Qf@KhhBb!zCTc+8`j8)MTN%ng5t-)OO3Ut5T)M{ zzE?B^e28Xhc}mvmeGu;&Yx$ch93gzm6&Ae6w;Tw|cfD483_lN~z4!m9@69@%@=8D0 zOIUf8Pvukw9^S0<w@I_fiw}3yvTikch|X0Czk#pWWFH@fmyknB7d$$*rSsRyD_=9} z?CR#Ju;kZq6}VOzLyMH}Da$v;uOHt``~yq%@8v!!=>UcvGvGa)$*&ULjjrSKYobJt ziwxdx+Yj%@8N8qGjS=3L-)891br%(zl8cH?@}|NTU>B{`ST_}Z3J%n_AMg~;_5LH? z9elPA7hSHq$&61e@elZUBg=0p+{OC?tyV#Er|aGZey5k@DR>5%%>&8*pX71DujGg7 zU8S&}SLIY5U(e0>1($Hoy(+@rY=6DPhY5{r&{%0+-|MG;nsn)sf=#q8*cMRtZ-~?T z^=c<`8!~^k+TMn38-3H-41IJxQ15uGjWC&H@>h~iGFh;FiFe(-B)E{bn`<~z%l@y) z_j%RlP#@nh*I8vNBmGKemw9F`6$~5alSlQ;Rh_ygg?gA1wms156quWvHHKl@ud!z5 zk(0zX7S<6jJe{L5J{)JMEzT*aJT%4L@NGq%F>XrShV4FGm_oYhkUxoSZQLPzHpMun z5Iecx@?<Y?^8>As!heDb^lDEyI}g1rpv!OhI2Eh`PG^D7Abk<(<?_?;nC1}bDYxqn zf$k#l<^9fgEx>rVFQX6PUGjez<D_`L6;i0@y~*@rK_NIR()h;`FTLZB{lyh<h<BtT z1iHWc&kof7|GcB|%9=Ui1Ku^aicYkb{N6jIc19qJ#ivvIX-E3KnJ<xhY4MkfT=V^4 zCHstjQX-CC0uREo%;Qnv?=rv6<9!?(ex|NS68$5!(8!*bfk$I4ysGc73RY`j;dv9! zcY+yv*^OOfmhP^^=DMxXod4$gD$47qu4F;uXFH$Ii4H}7n^c}Tm^pN-zL!&#T$GbO zBbs@bG~4<W>@+j4dYhQXq|dnU6tv!~dDo_0eFH~#B1u+8QVR#;GuIr*PGt8>M*@rF z*uAVjf_P*^vja>u$%ewAyi3ljZ>wq3VGQ)XhIi=&@I#kiY62gE>t@CG(J}GBQ=;S2 z_hfD&UGhUd*QVd}^)UF@oGCM~tTZ}ar}6=V;zLd*46jF#Z$HL4=@DcaddpBR?zC}* z?ojc5^cVG<19aNZWtFeZ8%4kM9U85dgbSt1CrkAau92+K_+ILd@8jH4Th1eaj-kGZ z&ZKuHeVBerS)-GpC(6cN_YZu>1mDT<>s)^xxtq3Z=q!+d(#f?Ca5D9$M{}3A8}}p& ztSob5+$tzvD1oeT+H(=~aoZXOo!#;woxiiKG^)nAUdT#^UB*~rulfeSb3uEHD*9&R z1iYtwfevXWOSZNHuESFBMM`66MOE)6a3Wqy`F)Yx33OboS?bjn)(<)-Hb8xGGU&<l z!M$^5wKW($Kz{jyy>L98i?}O?@~;XxZ4Du3y{&$!FVf3ZSBScVgSF@jj@8-Mj^Nnn z!||z#K5G2R?WO-}|GweZJN^Lu`_0?`PXE@^zqY^W-)8Dk|Gv;q|Gw_Saqt29r?X*_ zpQB{+hDPc*%X67%(yjE{+uzQFm!IK<8k3hZW!4JAcWZ&gLPi455C|)3&i^n^2-h=w zTfrZ>o1~n6wU$x(RA0`c+?n)XK9arS;FRtkTvNQQYCx_gt#7v=FQJLI$!oz!%xhdA z!`)qe{O5#scVR(yd5LG^z}uMQJqGV{K23L3md@+IM=8yF%ZdlbS)cI?ualms?^v4e zfvk=*cOM*IP>2%GeMC_^v&6_+>8LLVR&Z=B7Yt{ZGleT{J100clcsX`^uuq-oaI~` z8^C#6Yu&QrBFmQ@r~2$vW~}PRR)`NK->_!wz`40j%U#pS*{4p<^>hMfXQQj{Ve7s; zY$!?Y!LzIhHfN~RKm4!^{?7FAcL(j3%c439+cWfh2l@1U&qm5b5}CGN^!Bc<qh5{O zv5cGEtDFV--jg&>uHgH2ZF$9uFPBnw80|NaCp-&z!ktLkmm3HUtmT>fdfo$>rn#!l z-FHqTiH_RmzncJ8iIN<6q)f(qNqA&zM8}c^flNDy_7jc8orx3jJLUUYgPgmiVMOj= z^4<cTucVyvYEMEmB$+a&qW|Uc>Y9IGk4jNTV8c73q8{O}&+ZflPWpm8gHC4VYtgGU z|4H6gIWO&uA@6tWVUG1}2uBj$Mp*NT*8R+1(P6H>_kFRMlR49r)Av1xxvYiA`)l$J zARqc+RNpkML3gULI!wH9G@d>OwxVFa$|bLGEqX7veI81DqqEOG#$Jc+TZ^i%gMFGA z<l{e(!+{-F@>Acn)>%Ex&p!k%-K{AYhOx$T-Ol1D{w9C?u{RzT9cUbUJLul<{<J6@ z>ddCe<G1}5c{KKFTi;nMx7P@7OKCF(4y1#~jvGoi1<mK^%+Rx=wH|Vw`8v6hb9U)M zn*3GP6FbXsf4yIa?n46ii%0voS3hF3Ta{?fjZT#4E}Y2duCFeQulD9D@%%B`-Ve`N zV9zcn9z}d5o>^ZQJkRv|s&8QaxU9dT&2n4|&l>-8fVX!z=d|J_`=W54ATGfDXmEcd zc#rXa5V;=_A5yo*tA@O%kk|M^F%~oYwyQ{A+0S@r&8qR3>C5LOW$?X9nwcZk`F;W5 z=CkUjd&fTgx17I|;3Bzzts1L2A2r`MUi?Mq5j)Z9n%Eu1Hpw@5Wq5>rM(sH<H>hpd zLBzY4`)wPZWn45jDE(0ANn@h-vE<d-I%3^Xth%`~SB2cRQaNN6_E!2`lf1*odC7Fi zbFJsUGcVI1S*3dCtBv%OLe=t{a$ikz1~XHNUm3M?pHZ4Gvys<1<aXM~?5btsC9Cba zb9KjO^L%8Ybam_}xddf2S3C_}MdEiL1NgT2TfMtZ^4A-q(I*j>Olzb$$WY+?gCDjC zk0bnBh5fQy%E~rU_C>;y!A*%J#UJ@N__&WRm$u7geJyQ^$L=FvuwH?;@)Ja}^Q@9= zNXC)D;4HC_yS>nNb2k?s+8p)jDr~hixst86&RJ00fWO5!Xxw(<-Z1!N6n~e$cqYdG zNdB^qUJWhEPSKcHFqHM6;Y*Fn9qJ!E{J6mh`WgMYQ*rPudbuat`|W;M^QmmqEB&ze zK=i+yu+|RJ$3+Lr$tRi#r!x81up5_T$ihCF`Ies^A^la-%kd-}X@5z)ePldc03Uhj zcpAGD?MO!J9DmH}#21S=WE=5a<ID0Z@5SVm3<~njBdonr$!CYW0S^oQBxx!$8n`~= zzlV9B&AV)L$~()%qcaeHF7JE~6I^AyX}nMI-#^7W-_106rt+@!^AhOcbl%7DuC??j zysND<;c2aLCjoouZm!arqtRWxkAJ6?tzX4U@lLKu;J*4x(7&M-;jcOkZW0Tbt5z2u zbYH>7)}A|DZD1D;TTcFGv6T%qaqj(0Eo!(n)q8N9HHFUXn(@NEwGfz8&kc;5#_TG8 zyp$f;xRlmOKBY&=tNXkw$4uWkG5wG&EW^I6kww_L`df?Bm&}a=!|G2%Ivz&uG)Iy* z(udoM4<=rv51qMpdwO?06uX@}cWz~m3HT9Pwv%q)-XB}}l;<7ts6XgC&9e0g&cJ^x z-bZ&OJDt*k{j5*)1Ha0f`2?L+x@6-&p(p(noCJ6q<+rDKt6WbK|7-xxR{spp-m)?u zs({1DR_I@PQ(!yMUWMkg)(YK$xpi@4*;+t)oa`)uXShGF^l~3eiTBW5s8eZ&_-T79 z(zKT+SVfa}_Vjis???Q+Twwe+<E{GsReVVg4)C?rZ@&^>+VlDf_|m;A!owM5WuB>k zqa0rWEZAWFsj>S)S-n3w04z1<Tb}fs>A<5s_8NcxTX4;We}lf<`%l1i*gpx^tz~e1 z>i}>`ZXX3q;X12e*Ol%gVO_L3#Jkq<VV>xx+WRu+<3&rrT;oQNm%twK<7IPHcvV@O zSN)^DBucjK(WXE9bl3gX5;0^IbB=rv<-db3!eZ$^g1fg{a``+jJS^*lhP8zwg4cxG z@F|qf0>1eszLa0`eQ&o<kG}4DhL4wk&omCdrVo-&C-;-~yq|VrMc*{nsQ&@&{Ih)D zQ8xC6`|VZI@p$^WiM|GWU&}lY(94G_;3%i#fbWAdu>J7;>I3n8;J<E{;lQDPYFGa0 z!q0o$TU9O-#P_Y-QzLlA`)hn$OP5pr9`aYpde!-_;%rqJ&VK8|P>D0?7T1C^&C?o} z8D%(owgQfFoN4Ztzd?!j|2|F1{wsW3=lAcYW%!V8AUYKsbAUtdGkC_0eSDSq4(m)G zKVS39f2RU2(Uj^jI-cgj#J+nQ`qqCg{NXMrvggLSWZxXA^&foPT$;PhUfJsUWCs7f zl5Q1BX7Ue~;bf5yyTJwgCjF}}_6p|%X2`#IvF?G=nN{pGi!Iif@8D}>F~2caqyODz z__0O(%&y|w5U-%`kw14^u{xGTXa8nlX{;lk;U3P=u^svGJlh&N@<Yil`<rk$#^=WY zz%{=gJZ$mv{m92v75QeD;rl7l1A5n5c?9^_Z~f-W5!qrZX<l+pFjTRpE;^l3R<G7= zqR}Sq3=@4@+(RbW6LFRmx9_IE==PbI#l8Faom=d}&WPJqJQSa^8mo=(F0VKDQmF2* zUpMQ=zu^Jh38y^kp=-4djD371pRsg>J%e$Lt{d?Zx{dCHF4?`cb})CF@w7r6x!~QY zuj+~Mcj~Kq68t|?Kal4^Jt_V(>wnl28o}Ii^uV5jprc_t6+VflDes^!N2$;Hly?;O zImkaJ6|=k{u{bhWXF_I>W<_N`pX<XI#A8FL`2g7a@>?C|em2{kraMsWYh>HP2lX<| zHC99Za_VtfugEtXeFc7WC+CL8uI9T@9eij!!yQlGa`e5cw)#Xq<ldEQtB<?3|8Dc% zHpq`3M7;lQ^WJulAAb<>{=3b4Tb&<YN4)=T^WIkL$JY|?zuUaGMg90F@&3Ebd)q)i zejxGwyUlxBjUQh_y#H?V-ZsFGA3(hSZu8z&?Z;OW@4wr;w^jM^RmA)6Ht%f_KR!ad z|8Dc%7WU)A#QX0y?`<JJK196#Zu8z|`|&pM{=3b48{=Z|Y!UCj+q^T^o4e{nbI_Z) zpFra^+`W)*>y*;OgPczoBAc0H)O*;#!q82cHDh)Bu{Ty&VeU1XWav{g7P8#}G{m<h zM-<ZTx_nz~T|?M9rs3pg_cToAe-d;t^2kj7(37sph28e7?YLRX8c}-2E_(38&>;1+ zg>1(QRi(Y&NS5}KgF|+M7aH2;^){~eEN9+e>dYTXUHWFtwD9tr8@s5W^EIKd=sj%Q zTF#Zgkt>9%%(pftfLG*}H6dfI%g+-Z@coky*z1OWkI=p9?X{VlZDqq@D{XMn=B$Gs zGr3Te<Eahpu{giJB44AkQttGeQ<urN*QPU;d*OqWSsM#={K)W_bqsKhpj{VKw1?QA z8~h4<(-y<u_t`yp;ea(Zdd)HU5KoKz;NMnR+lr}8jYC6kWUxnia~gO<cKT4IheoZS z-t;lNk5xav5$P~EQrgK!?xB39Ve(0PFr8!?(xbrrxOFyl+ICgijID*t1UFrwu@1ON zo@`~;sjv3baUI~4wF$BYeXPso{&~eKKeDMW92(nD!mX8J9h)!Ml((`OwMVs?@Eq!~ zkC_|_9fyw<bX4O`FSMUHImf*ENW(E5IcGyA??PK4d#)D?-JKJ@1-r{wH27&tt>yW# zq<ybGYj7eNMg6RAGx?_uws!6KMCrS?x`XT_WO%vE(%Lz44EG39rZH}@XMk*r$Gss5 z*2D3Ob5ka*%SWblI$`i0i5+M532nYJEIWYw{iYvh8QVfllKYBPHd!iLoxC`A>O9IO zP8kdw>_4jfPl~cRNmfR%&%+nZPCw;NIL_Lovgj-|l$W0c`xSp%Rys}Jz42x&Zed=s zx+>$o@Da<{_G;s8g@ak&>fFzO_@)lo5gD&roOtGzds;JX`ra{iiV?Qcajf{Zj{C{2 z6#rOyC^p#Ucd<czz5ZPJdL41km6`n3Ph(dGPm4x$=IUZAq$lL3+4M8ZzD=qFn!knp zarW}E&*C4*`NLR8PHA<_k9@C*xb|Ws+fmF>uj~VXo$#J(*5#?+UId+7NV`Ehb?ep6 zo!BAxMhWpSLYI6`e$PExb<9P6e3b8Qv8TZ|4c+;<deY&;Z8qPB;Xd`k){jNG7lk{t z+_+bhYcI%$E8?uEqEGwEWmRsj_rBS0p6fN{+KUeVQ)nktH_dyM{;zF-Zn7(ib~@v= z+3mSWgqs?cvaiP8K^8rMzSYpTy4X_obJE4rY~%;LF@%0fo?@q4Y%%9ypKsPT|H7#! zJ%!~91+Bru)X%%(ptb0twVk;E=}bPF1yAms;JSo^oWTKia0>^n#$ay#cZSy3*Fnb$ zJL=0cgM(0tvcO!Eei(acd(O_ZdC;TL2P5(JVqNw|((qfuufgG8m+L56Q#$yLWXH~H z8KYImqzHZnOM!jV)$C0GA7hlim3Z>-Js$477u?)a%KawLY+LaQlv_l4O$uEQf28p8 zr}5P~S8{Cez?fj0;W5UWYsRfAUXy`;GI0ZszGFMkU6iw8tBbOghxz^^_oWYZ)^&vH zV;zHgCvF^4zi#7@TIhZaZOC43TPe>1M<5N-n6CSe7e^>xqrJ4)l3XOVxVW9Pn#ii+ z)(=Cw4)?WDMljd77dkZy+Nwh68{`{0AlAg5+eL%z2^S3xrEhd<+>XJuF}`heL?#@b zz+A*XwC<vu+W!x=PdnGR$bfWbaR{_!U~w*SY-b67&bQ%%V6Dr9tN2c+fyKFzF<4xb zjisJ%W8IGqROg&gkiI+s+O5h;?k+N8XXgeL2C+vMaX4?1O+#1d;!o+@kxr>iwI}@Q z8&fgjj*PW;3YHQa#1W3fz`f`}JPzIwzKex>Xl=9l51)G<U_a9Rff4Yo@!Llmi{R%) z1!#u*AUlhHBHv(t%*Eq1KEFq>FRLy)_D!!2|Hqmv{0$9YAlOw+{zhnLPHNE#Xy)dD z>`9(W_%pyU>MQtQ`Lq-!-`Y{o5PW+kIBDcLC*8i{M#>=DC^OyrI%P&Iqzt}M#OEa! zwhm-GE${$u)G^*?gIBY+$=&$KGSS-+H9mjHze9WwaagCoql_(lO5fnsM)e<Bwi8Re zMtE2_aCjQJj+0k%E!S3b<85!&W!rZCh`#-r`wr!&Rl_&v!d8=aF!hJ|hG-4nAC%m= z09dTdYUI=GJZ&=%tSXAX!^na0T1%lX9Z$Sv4Kd$it$|NNzyVzNB1^7K&xiO{DeXk> zqb>1q82%MZ;`tiq;o|+okLb{TVF@Qcr@Uxw>nFeqy821fUz1{f@af<N(r4DsGPaa^ zuFd4H_3?i<^+Ynui>J3Sj?AGU@Y~R|7}`r0e@q$4Fu@mz-Dvh+E+y{V<78K!l^^xB z%*{72zVBx<9bZpnIyBDTqCUg>e!HI~f2cW=AHiR9ObfWuIf;SJk{mqZNp7A_9`&up zf#%@-pSP6wJHi~JJ2z+6Pxsa?%G`Wy`bI++Ul%P^S&Z}a{D_-?fp`N$I@2M#`3hx( zb1SwHxI2sACT!#@xWZS2eckDN=jNz4&u3m_5Ezf?9`j4oqOalX3p>Nv>`vX+r1?#A z_W9b+sxRHUi%r}Mx#=9=hb&@4joLBxrrfqd*a@TSOh?z?4(xS|rz5_gj_l;3^vFL` zk91yS0%O@w7>>+$kzt|bm%;O&_VC5ptZ(K;VoNr#p4`Ab+cr1Oo;>*@*}>56MaZ)b z=*{>&p<{-TlkL(uH@oRIz;eFsX<F@Okc%<y9A!`4=6iK^cA8|f>5Jk75BEklv!~T% z^12u0qS?!slKE~CJi^||wn*ZlLdQIf`I18CH1sj*H*mxsES~fP<CF?unZ@|E6&ioF zv;+^d!~Wf7t?%ot7O!1A>2gPKj60sPL%7!&eO3JjH-cULiDYYwx^r0H0<X6kyfFBn zTyylGPkZq_FT9)PpVbq7b{L<yi=2EGT`z^-i1q0_-wc>Az=bbTnS9(@R&<i>1vk-N zh{f9r$xM5pDYL8?&$bs5vGzjBYA>XT8%DlS#4jhDAv~J!k%ZR~&JvCh9!Gc!;T+-d zgij*8hj1vvH;7&4mfCH*t9g&qZrEL&EQPCFg`e16l~DM_-Hap8U+s>>{c!E3-A#-s z`cSSeTZ#*tJkRbnb3|X6jl02pZWwt@J+*|DkGN4~arRR2ODTSIS$qw63F40|ix1+0 zI%7)n%a7|P-}rvwPU<I4^;xDL8+Tj4sIbN)0^E1Ao|62y-OxmXccbJU`hvq9wz|K~ ziPa*D8~E2Ej~n>cBC{I!*P3t1iyp)u?CozxW_Cr-KBHj0{ldGw=(Q)s8C%}d{ImS6 zcV2im&OgmR%l{tc4=V{zFKsIv^!>KNpy%2O^+&-MCqYMPzLCzDo}OJ+Jj*Tl4JDQ@ zE1qjXL-=pHiG|S6!a_W|u#mvtC>dK=NTnA-KMM=P(xRP(1<_E3IML5K;<Lo%mM<(E zN%|JzW2B2l#*w~<G|`ECm2^H=^m9^X4Yoe^v6n7H4xOKG;=M7gw5N6tNVnw%q=d_@ zyQ_GQ)IRCc)z;mSR5@M!W_KOmZ-_u!C7OC=cPOs#v%4d;FYgu&iC)85#clBE?Dsxx zmguaUrUH5>r>7t;pc~QDS%TB0PR85Nk!Y9kw)Sj&H;DgdX-f5;PMs=0kU9tYG*n4b zajTSPii_XVo|oUX_H5z*;=3!5dx_<17`rvaL7zOMaH#I^XD&szD}=5=-fTiPxQn2* zMTNJSpHxo}4#6vjK%)a<$ZW}w1o`3}g(~9RY)2tRJ>g_quEd|O?vC&-I7>YJ>h8Lj z!U67I+8r|CXLpxm#7nzXukem8Gogz5<s%cwFMRX61QT*U&pc%0SeQJD(-<l~lobuU z?DG?HB9$4zTyliwjsfeI<OVp%BY5Nr>e9S+W%jMt_t<<#%%9h2H)^@<=+)pPyK#r+ zwD*y>d+hz^GucD!ICr@wBFN<obM;Km&Q2+6{i^xG%w5EX5*Ov_u2~9C&h!R+bx{sq zK;|v;9pi22QNTS9T@swbpOKW!yw#@io7HX}xHT7PKD0G2YJ7;-+PXAn3_&+%&H(@Q z_~Z+YNGei{0E6aXwcSfw%Ug0iABDGdSA_W6hQF)htVeWqD=B<$f)+P*SGR2HuHhNw zS;un_PlxAVo{c;Y=GnxvnddN`hwyZHj^sIt=ixj@^E`s*kvu=nGsg26p5u5P&vQJ_ z2|Q2YIguyp$_YAe@mt23b+#7=KFg5}er6t<&ICKno;&IBBtCDzY|fhz_xE5H?Whbg zuuJ6}*7e#i*HhoyVXP;Zev?OW)oIq<eYkjPH$Fro&_jj$oNx%gbjhZo{~(L=m${?x z^E$iWWc5Aq<;+jaQ88f3E-T){IZ@feBe^v@v|d*keS6^kp{4bd%F4cASvMCODesh( zRb4A7uW~By_~m1=*Ce=ygmSh8UB=Nd*mJtyzYlZe3HTDA!&>ONPJ9{q`U>OM`DpCL zJh;p^VuzQmI*ezi8NCbJy!=}oYZ>1n_$BveE;D*q$U>i;&=Ia7Jl|PSRYhBm#x~fY z3G2h!tC$~auR`A}Jj{0>EOc^|_OR@j@@<XvV{6fVgzQH1*-!WH0A+0tub`J`FY&&k zu;H`5WdEkg^8MQIff#D`g<?k)O~2#QjZaF7zAuSoeoT8mCeKgse|sbi{%!z&`i6Xa zD}F&d1@l8=pF=lZR?wK(xhaDqxs0u`adPxCoAZY8{OS7V@@H$`j`mHx)G7aOd`pK~ zE;b!^<It4)g$*m>k3*ft(YN83V4DVPw-m4G2et*kmKJQ_(!j=3FbOun_>W*a{2#z} zjSrh>O*AIh1e0J<+oBQEK5eS4P(H`Ebb#do{9x$6aA4(f-b2%#%Qq4K)BJOWersq~ z{<Yu$dfG_eN;nAG5&hrK-Oy@FW0KDCjpi)0M|&EJLA0fQTGpMWt<d^XyYNbJ7=Piv zuT92)Z<-V#rv2Is@E-7w))1vV$Be#-j%;0C?EQGX_rb@{@zSvxv%W~jP6yr%tQA5z z*)Jp6&QKkB>wqhgyK_g7KjeNhr!s?b8}cd>jtw&T@o!{3EIDp<X?(2M7I=d1ea6y* zH7A6Lll--^ik~Z+J>RJ=-7O<}wa~e3*Ued3$@0M-213@j4c<tek;G9&JAvKz+|GQ} z`JMSl{3z^@4an=8cT`b#l{*=`{fqg|@L<*uOC!WbuzNJuP-i4gp0e~RcM394dzMRg zMEc6y9Err2M({I=Y7Vet&+h28hIkh-uWPP|#MkVIB-ZQ@o!DA4Xzp@f*kQZR?$BC} zc$@ttkM&UWLH7mbjKSW6?z8MGJzLdVH+abN)M3h&l~KKllTH!FmyI!E%#+N8H}8mK z@l{<94&9u0%t;*$_Ii9ApThQM`mrIu^w7cRLBMRKL+T^(R@mKO6K@6atc#+@9Nqi+ zU~JxZ+1!<)wqkAIb_lWqzY6FOLO>0e&Y2RP*%yl1Q!wAVW!?^FGYy)fm9F^G+VgFH zOrPB$p3pi<=^>XrH0~!12`|pRIY0PzOoZ~0M8^*43!JH4ZRU=|%{zKO1r2`c94`{@ z%%!t6UR8WkKAk<?tII~9skzz{j%ps#UPU0QZOK05^IYciUg9N3)t6C%HCgh%)Hf}y z#1?c3#xnadV>H*y^SaYrbSJumUYo5X_LtbHMdnHBndw=H_9|%C)?F0UDr@3(p9E)c z6EE+uq0NXT`uIJ4nd$d`rl&ICbO_%C8fsb8X`Ra2ucYr-)(UWz@Hju%j9$_u_+Q{D zU)TuWvOR74*@fTm?bi_PO^LBCL<Vd9_nes{mKQJK{mblY9hq2Dd^Gk7JQprp9sA|$ z>ci!v3FopmEBwQ1E4nqktdO~u`79Op=BALD%Yiv1e$05EKd;)m=krnTbLXAvH6-I+ zDzU8ie|dWsFgdC+|G%m)Go6`{)Fd+`Orlg|fJlN{fq)UBbVx8kqBJBV5%bqZ!bN4Z z5p-Ea?PMm&kYsRx2pEYJ0xP1wbr8{AHe!=-i4i0a6b!g_ccmaqa28!Jc%9$pd#Wnw zj41g0cK`D{^K^IBxxMdsZ|8mAbI!72e|Xc<mf%L7w-@r}`2xmK;N4>075RQS|5N$D zt=u1eozFY?x4fsqBk7ZV$A1u?yp6pp7-VbdZi(cbY`NybV(yZ)TJAu;eci!dpfaVa z!e;0pQ@AS3VpHDX(zc`VUiAb)+Z|I&<c62lR;QNK*OLam+3Kgj9YUpE<VZDe9Y2^R zISXtaW9so9Weta}F0HM*-f8t^j8Av>eA2dtE@n5|%=o|D@I85!e3ojQ852ZhcXAoT zjr`WTjr`y78vc`ZUhQ-7vySz2JdWhEvCd#T20eTEnFC{QEc5k-=PMe@H<o#&?|Xo$ z827Kf^}nSaJxj{(<hQ<0<TFEAB3Dpx^lU-=?%x{v-}5uXU2!x1kTrn|-N={ZVpFGW z{7!s#_@2vJE%PXofj=|uq2WBrS<ba}@kGjpMhCI2kt6gr^cQV;9d(ExYRm1YllWrV zQk~K5sV%i59o*wS8p81Kcl7u27usKOocF42jo&&n_@&xr%vuLzypC{QzCYadJ@gXo zrd{@sBl{%xENfT&JJ?aJ&L(66bZGqW^ozWqt=r4Rhi(NIx9hj<`Zj($-klx%dkQ*+ zHouzI-m^u)Qa+!u`s>}$`klmizBb3Nt$)MHT5}OQ-fgL72K|}`&)D?eTG~{ToYS2@ zww142?n5DVy1`2m<LZWQY;e7pHa+^v<u9~m=KHhMY4@<p`0a4kawpF^dpJ8uYvz1K zdomW+(Diq91FMzygBAK@Y?3eCo_u^g^=^1ebD7F_)a47&ciwff?j6Uw&R(7`<oPP* z+_TI(+B&}~yYSPtwcFtnVYz$nSBaPU`QQrRb(p^^3;m(;bR`>_fKhTH1B{Y+@(D49 zA%`=g9CGbI;BLte<V0QaLq45yZp;gb{6Mbn&REg@*V|my7X$1sIXtqrk7th6j`~qs z>IeVhj;1`e7k#zRXS46ut|-Ma%8zAK{wl3250X*u1fE&Is6M9CUOMgrTI*8#>UR!u zN4^Tlbt}IDTNs?tPo}UsaDmw>JQeO@9o^W@FWwN1l{HqE+StPTuY1^&l4Z<AW7+2@ zJH50yl<#DV_f#$4pc|}wb^KKNo5~pH|BUqzcbRLCL^H77Nt@!sW_(P|#B5j>)<xqx z-EI5nT0E2<^lS6EQ{M7FS+@rF)sKb7Tis1H$=ODFKNWqZ_9Ta!UD|ZF(&nnDO@C{x zwFu3|ym44uR`pdDJ7wq&=^pe^u?T)>$At$KM-vY=dz@#XF%}sk?|1s!YARz>W+F+} zt=6VminfyWZQ7GAzYE*JhJU)LGn4<pA~rSU1`CfGJ)!S;=4A!{r&C9~ARO<c%^v4b zGdGujC(*cKG;ThcuZ!Ym<%VY;;90X3=~yp+8aZ@3_oQd^RK4P9^)b*{53xn7WbCC) z(o;+0HgpaEc<ThtEORjqSW|-4`r>szKaBh5wf|H$zv$-;)scOtuOA$qToLSr;2OqR z`Qkmp;?+E3O9Sg-#wvK7-~VEmxta@1=P*~N%?BR^a0X93E_llM2Mj!E>LLgB^Sfd~ z^Po>Nmj&Xf(1&p874TVd_oL`lV>v2@S8yJ~d!$Q?hrS&H{(y5OHhd3fMy=yBP?@&- zH&i!Nz{i0yic@WR<gpF44%(UreQT~X-;&vaK{;NMzscN*J|)Wsp}o&BPQfAlay@cR zW1i|7zCvDihFcHEmSW7xZNx_u?jo;jo<-Zh+mnAZ%=qQHRaCCslG;y^^^tu@u42Zz zx6Q>~a*!F7{_v>@#49V*1K%ycXjvClg=?K_C?D&iX>0c*r#w=VU$+~)%%qO!NV4-A zn&Tp}HP(m1-P4RipUs|6E*kzWVs5~ZrCcX>x~A>It}ObKuxdZg`a3zV%iu;jPHkOL zK-a~*Y7rMr(Y6O2-!Z=>Xm!r6_JW)Ce4et{h4AlcXx&B+78#Ft<fNGH=xaYc-%THC zJ3||)tFq$1!(*Kyy*))Zrp$g_>qWX-`jGhAkmf~j`D%-~$Ti5fFY-+CFySw)BP4fw zJn`dIMvh3HXZS98&R$U?XJrS<9{dcppke^hAxYidxUOLOTXnCX?m}p*3|%4=TJp3r zliwNte00*e!O7?no#UbLxC;&skK%U=bCWL-e}R6ai)1@XM@bjKW3~SYeRRd^BN<QZ z@)h-wWb|zM%a_oHj7NG&xHfh(y2#kg=%$uYI*Ik#K|1MuaX%lYpF}5#Z|t^?;4Jiu z;GRi8rrl!Hu55AH<ifplD)Fuz(zQl!amK-k;L$5ay1gmZ?K2D>7Y9w5NVlt9>365V zoj#OB*4L&F#(JDPUu6fd<~&G`=ln5YrZ9%Qke<5H<zBze!`j_sVe>eCEz#v~iebtN zceEwlsP@z+KFS?w${KjUkHHi8vYp=jx|_BCK{)D++v5&GgCptEZg3(P<txqRdwuTC z8&sTC`g9j~lkSji);eelcST(QFK?vX{Q7%_C3|0var;2xR}`Jgexsfl6TcHWPu4si zNm)DkfMtQ{cTo+S=Uy{c@E`GH!!wsKF12$pWz<eGR~B=Z@QZMFc-q>b_=a7WXXH2X z5;{M};3#*-;o%b5V#wQB{^n5gqWLj47P(+5hhOiYxzU^ytk}i^X4zORqvmDX<cOws z{|P(-M?4>}-J)Qo+uxbP{`>&%5}0Os{n>YXw0|7(Ydr7lIo^exIqyP;=bhYNXY3}~ zoe8gwH84cH`Uo&2ygIvtZYuom@oIkz*KLgbm25}x>O$sacIofq)o1=Zau6L}7WcDG z_;Vur@d@O$=25uRIho7idC`1p{!Ppsnv(2H=t%SbUU*h?B6_))`U$Og)>V5&Cx*YA zs9Zv`pM$SeNBx<$S)<|4Ku==(j-pqX!N>%azdSC#5t%F-c_Muzvg4&uFrE~{cor~< ze+1`VU~IH$XT)WWgy!c%2aWHJiQmm>z|lXAsy`(zGpnJ@rzumkHiu8)SM7#Y#$pF# zSXUi$9CS}^MeEypYST`|e&aq>><}YsGlR&T0_!@R%M`D%Bp0C3Dl{5?1HSL$x9p=n z=0$j0;laN=GdWOs{}$=2tiPtJ+zQR1@FRQ*Z<%~FhY7AUFSj5A)W!p6K2S>+R-mKK z39h1U!n+T=`|$8`e$OmL>!y5>eaR)(I*eI*Njl2#alBT#fU@dK@>_HITGmRBlM5qz zXYU^)Iy}I~?<KG9-1O7L`QY2S=dY{J@h{wuj}L<n$u7I_4kL5^DV8}`oOw9=Q~tKR z`HMB(YmhfziN|>#<8+W)ksgR-oYr*v^+1g0(SD|PGrmUJx-M?-PTEUoQ?Q?geWUd~ zwiGtn=1$2g*;LqCovD29c&$6I*H{Dl0ZF?<uh#E0c;c<J*;HVyiR{ROvzaCE#ynYn zWvrr&(YpPjc)Xv9=SgEW`U4tR0WIi!0{kLX^!0u{qV=!nvn79FHS3X6LmAcpcV%K) zeXVqAL8py0`rAJp&@Yd?^XBkA&HdldFZb~NAi8`F^F1ww_f)~_9ndeDqy2gjxJS#n zgugf!^q~2k5V!Yc+7sTAIsdlS7T`!{R*|dLW#$E*H8K%jgLHTzZzV@rpYOheI*qhs z#cfY$m>Z4r3!`M!Z@MC0d)+IPdn!-d3BH!RN_1_D>j$zues&c3YS2&eT+eK5A+Nfs zZpu_241Y`+%f}WPM2@jWW=~aDQzeoWjdJYM(5%*)TJNlWmi^$BXuWd>w6Yw0YVD}C zrPgH2ipa2d4XNBGts`aEL;s=Hk}G(o^<;@QwH~;MJDH^K^Z4$5fqu~%0zRn?`s|q= z)Y*EQM5AV1FFq1qwNuyB!S4A@Tt_%p9mS*dPIdFV*ScBjXJVgO)`}_0wA0==)`~pu z@5E-d|6A?RZ=N*`WwX?w{PkJNrC#!%Y^UBh%4SuTdYwD)^MOO-<IBc%<r6$tW1;V< z&_<(Q&?@wVCj)2W{Fmc-z2OfBbop9znP}keu?bNCJEQ}$;#<LuK0&_kx1kRE(@4uD zJXgEYEz<R(SJA3uiQY-iNPZ-I!2ZY`R^b98qo0d)%f$INhmT9I6wxa_^bOt38bqH^ z-{_OrE_~<}^hrK*u<xzaiq_AGz5ccs7mH(DXspU5kl#_XBRSFy&E)y5b+p#bRnbi` znzI}K3f>0`+iE}MejeMpGH?eU4500FnzHk)_XajNGCo(H9X4&zi)zchWKAG_DSPzv zFWz<EvA%yd{Bi3$y!Rq^FRQ2X-!gv657I^&dLstAw-1{}^O{57Z{T|yp96e4e5zgX z%w+DZP@jfxz?+#L>e$3wpQJ6#SzBJ`9q`@zG3UxG3Qi!7A(_K@@zp#&9IYAf_q7b@ znewOeQ7$t6+Q4?V?U9_O-%v3_^_4+>F91*9qmI@dXJda{$Y-CsIs6sRL@VSs*PfT` zhh8Piu)(u-e$}|Gr);$^D)?#s$3Jk&1MT=NvhoG<*}1|Me$EXrTw3zZ=I~hXAYY&4 zi+p9S(;t3{xe*^&@Sx!XH}a3mk1wBtc-S4q4_o4Vhh4uvzz;vhUQj!YZTx}x6u$G0 zAAE>29A$@aZUXB&a^At2?3+Ae(f)yXlsyexe4V+r^Bc&$B7ebpZFBYw?kh;<E0Zr* zH$#t-O;a@<<WVN}Z|JUf_0!1PSH-aSz#{uE(HkAKAwTj=+Icly&Rid)i!P7bT;G5n z@kyiZk>1`n${xNjuJ`FtV^Q5K<H<uK7jh4d_)NT2IkU2#*W|wvuVtAl`Qv4atDe^F zr;M7vg>gUUH;ixbsIknA%bcsRcoAM?531cJY>i)1Ui~C}bTa=<ipy5~BevlGl^;$1 zGx^cv3)Xl)&p1Sf8h@VOqQ9RoABIn`!xvE2@DY1C(k`?Iy=#xo+wobakXh_=tHZ;F z=QrXDv)Idbtn1%B&Gm1Uuk!Qwt+0u9h|jL)`;GYWJ#3L1pn36-)-)-`emQMu{iQu3 zvi;AOtOQ2+6NN*?M)Z8!Dcfoq|FPiykux8uNk>YyCHNP7(vf!ngXlHH9#A|;eWkn) zJONJz=(=s>DVu(h_9oJv%FU)<$+c+>I$$c_;prOuZE*KG%6_@hUoX+-HvFLSXWHx! z+&H&V&9|S&TI8(2wpUim)?AY}=Q-uN<!lYfeb{lU6~Qn6CTC@avSr^!-rMJCPkP%T z4x=;7k)iPUi$)&3V{AWpIv=S1h8RCS_n}0d+1@4Nz<uX~*ihSmll@rrw#uria3I_W zFLj=a?`&)ZtAyUb-#iceSry$!to-om-RrpnOy3V_fEhm^JdaI68?rZ)*C@Nd#?Bz` zw@bQZ1??od<@>x((ZA^%I@26!OtVVNVX>-xXu;GX{c^_bH<=sJ)JK8kdgwv>7!)&1 z;`NLE^Ii2C@p^N&74j|x&(Eg4ZVSEDE_-euEbzULyJ@<CO=m|J`Hfy^nZ@~>(m!L6 zWm_t{YpIjk_QJ2s@ZRCd@ayiM8EN!!vZymi@}ci{cMQr}?@km`Sp?_IoW;rso3 z-&yLfKUR+78w*PP;YAO{asG#*IDd2L;_AC^?yoN^qh}fGiV8lHB5{4nPR<kO=h?;l zPv`%p0pk38`uux7@5{j8Jsl?T{GZaF?e^6Lw~<eyV*Qe<ZE?KccN8CEUa*_3ifrh! zqIkc%s_HxR<3{oRUU+aixXQ9#na;S9c)#MKiuEhzFCAo+tHD&p<vM=wDR>k<=3Lo+ z<4>PliulmA6!%AO5chXe>`P3wTMxwlx%7eW$+P5hGVeP6<e0MG`UA1-`1>V%-e|SI z>VMMCt9@>#t#aIU^4VBt#Yi*;J-ededt;ePXe0UEZ6ElaJo{^(S5S6#ChA{(>;FoA z>seA~UW}v5`MiVwz5H*9``8(O&ThbIneWQgm~Am{rHksy*O&+mWY~W>vBI;$t`MFa z>b6*SB2RAPOmgXU=-+-9J|3O7Hk~@td4DExO8c1uu}ams2_E#Iqw{0G&cnpLM9Uwe zP3_l5CYis9+-!GW0iGJu8JvU+SafxN{k9K}WxrfsedMEO29pOjg(>!lb`NX{|7G9U z;M<kH+Q@&M8LX&i{~zlt`r7IA*Jpd1!*_p{ahySH?Ee1nzCvHks`$Z+gZMoMkTs08 z%Ky{({%{Zfdx7z{oOv#ord#+S(LqUDQ@FQMHng#0h{sN+{GyLAu9F!TcE-plX9jnB z*B=zO-Qw+T&wD-Nw|G0+{~Z{cEWb8HJHJF;DYyPDJo}W1x9kcPcTHE|!@{#B4)>;J z#rzeA<BT28Uum&F30$n>Gf<h_%D!q}xm;~1W8!ezKi60DXiNJ9%EXi=7NdDPM$hO| z=bI{4Ih(Z>e$F^nx%Mw&m6C(MdOC_z+Kl1%nJ7ki<I%*H+<cH`9BS_-^u6|INY5v+ z%1;ri6rSPh)3oL^G0HM>llA7T3N!`omh&n3Ct2#2kt@utOBvCd+D%m^8yU~u9+Q*c z#yJV|s5?MT!c^+Gl+EQYsmd;2kKL@;!Pq8icka$8C*daK=p_Z#+~~Vf5!vFSmx|<M z78HZn97?7s9;CQ_8W_51lkps!pMboJd~Tdq$a+lq35mRu?>xtxW*pYyu3r-^e?9gW zT$PIQ6V#9L6Vz9dpCBJcsfd4raVb}V^(s0Tx$4Jqm33amU3HLLT?~AUJalc`&u{2Q zeW>p<$WfSB0w<-l!9?g<{Q7lhEtz+RSfOw)+Hk!?>*Tk#$k#1-+)U1wiS<`j)n`}W z4aNFd)1%ANb}7ogF|^7(6x6?6`7qGd?H0d@ed6|88k`d6!n_w*uUwdS@VU&|9Oc1~ z1KF4d(>D0(c`%{{#mqRHI+z9hnYB>qLUQ$&)|xB+ExC$+m+Ur|@j`QEKg@FAySRbY z4}zJse+haM%-CiI=KEv5vn=SqQ@sD#J(dk$5&LKFaZt8;*he14`=?s{;d}lXK53h? zg-qMc?7=X34waq=m*iq-J(UJ#lWSDmRc|9ct^6O2Bf+uGXEgGboImlY^8Q?4U(8%C zQQLXZ%z+$=*+tFMwwme)M^hVfDB^h=piQ-9!>^KucNCF}lo!uhF1Ra0CyLKwQ)zxR z_jhQWNcma3Th71oJVaM+16>^o9t`c|;q&~XMy_Q1wZs^7w$GB<yG)FISs<A=C2QR) z9?8KYzaAUujE#EFT+Yf%9xbi?gm~ljQ?}Q%R}Nk`<I|jKK7S>g7bDrFc=pxk1ktqO z+3zCek1UJUdgP%ACst`x9vbwEkJ#W=`6&js$SZ?e%HN^(fX`tcu4xbam^Cpt$#|0u zPQ;_P(T03Ds{e6#$1XB=%%5WPP2lqm)+NHP?3sV1?5DU_P5NSldHIwBPT|Mxtewn! zHR#lBJk#6?4lA$og4fg~(-foZ`m=I1b{U=g@08Q`G&nUm2VPGKJY>O5oO7_#<Q%}` zJnQfLKkAEiHD2Xc48xD=W4e1_ZLItXgR?ll;^V4A8B+%t@f&P@gKP5ieizp_xY63W z0pFr;$qCJs>Z*+BO?eKgFT8VpLtT2pDv|GiEK<IM=<Q1ImEwCdZM2q_RvCZzX>h6b z7K7WLjhcVrN&Dyj&Uj48T3@h?&hMKN&waiD=iH4pB)KUXlO7^JzC|+nQ>+vF^0L1b zYmR)x#@1EbY?Ms?0<pQ773PdJO>12LO6sew;8Fc37lM7gab5ZEWGio^u6!nC=GlUl zX7N4aUxY3@*Q^bd%b@XeoPPL^j%KYm`Sim>>9bjdC|)H0p7faV38c4#JH?Nr%l=<= z*dOBcKk*?GCmpTBn)CP+3)q14*F?X@Pa^$=-ZHpCkF|`#RWmR&>aTj-$2-vFiT)Cu zD4$_5{R;MG+AuLT;jt98E!;`}ekjgm5HDqreJ6o``F!Lb%oHvJkLLs@(5K>U-N+WT zC%fP#=GNphz`M$?^vXsT)KZm$<K`XIl`kOD{fh#V(@-R*0hyrn)NPe0r=i)>9uIKu z#`-^oYqs=1ev8`}pT^*O2XY$BI$ron^nC$(aaZrx_oH!j2lIY?-0ttejqo*{cD3(W zFq_y<WrL3lC!BkBFrBfzKsm`K*##Q!XYtX<zep@#e{RDRa4)<Z<i}=QMmK7G_X;%s zdh!v<^qVh(PkaZ^+P#VX`66oowO3?JqJ8D58G2wI<-68gCiJg4B=2p9+OdlZkatUh z^@=scwo==|!+-Sdl(qY&LVtbY!o%5D%Y0GR^GD5B93P!S*~a<OJPnZNkjzzLt7+Ym zjpu4kj8k~GOY;=Z(a>$cr+y?CGSHRiR`s-gxueuyKc0Hn_6OPe-y`l*0mrI?PteFG z<?gD!<lN<@&EaFnxn;%8;SZ5LvNz>Z`vKoGKI;Nx)P9@RmrZ+a@H^sBi5!^xu1F4a zzbldhGYgR%Al~u6CI@~uG1ApPM&2r4;+5opa*h%?VEjL#Yv%f|$$<xesZkD)WUx;< za$Zc=qSyaG-sdZkeQqOLKaA}wdJ_GpUHK|RqoU8m?;v_YC+|?XB6SPpi1ykfL)xQU ziNtRI1m%)kiGO2$R41R0%4@&LLAestPwL%HtW@$q<)gfvvjW8unkch?T!|Z@jYK{@ zH40Ag@a-|I#AeO9SNQxPur}gD_QMzBa)-cAqQmo{jf2Y2*0pgN_VezSpYI*j)>UyC z#S0S|dmd%d(DHs6l+2anYXhv}Q~9<V`~7&_-cK6Z6Tdg&PjjTTi}*dk+s4tj0LBl* zZEXR@2Z65)e`pOc7CzQoEa!K=tT|a+L*LvYdno5e`4{R_eeBl_F$@XrHTG+ntL0vt ze^FWiKP|<Ump)i(^y+Qzy7@;R;`dGOx;d1LnFSv?*u33?k$lM%krR3JX(869oXw)T z=The&IRh=`?O4vZQ9hO8W?68YaU-2@bPVg7c&(PmnPtGSxWd^L=pyY6h;mpqL^&)e z+2;pxSg@zeeu2gumIc&p!-l@s$ek#sV>dY+%I7fh#*gI9H+e5y+9k=^r2)2ZgolMU zEAF)WCg#Jy4y^E1O*EIP#QHFX`|i<jBVU~aZuE`hYZkaAC!1opUm)jJynQz|WTSjl z4hHsJC;C3h!NAVL28?nrShryRnH-Gs7<W@1TcgPOoOVTL`(?{(pjXN2?eQ3<H_)un zU*K*zIMKb8InFSDtMphN_>tM<S#(MMwB#>f?f1&L75izh5ZQ^Mcgdzk8vH$S#^hEM zMSn{Ia+mk(x9&4;{?Q!dn$d4(-2AHgZKh;kgFW(E^xIW2?2AU>-{|Nfu!7G*DUy4V zVHtQ=d$}5QH2isx43HeVEN&MW*Ckv^W=p;(W{~r_e-s&$;BtU6X5MJ~m1MVM#8*el zhkSqi+_;Z3v5mhwO0H>M&yL@JTd>i$v2)<3&x|U&ATEa=<S)v-7CE?T)YxXm?Y)U{ z-9TT<^3Vx%-wJ(_Yhc!cA7U?u<VW&cc9_ZOz_((`R2~Y?)7}tpWe-MtEg9Vc{>(lf zWTJc>ie*`}!yX@U!;004axohBZ&WtbwAPd^wBq&t^^|!<xWK>WIFZT!04+Ak_CIs> zp?Gx}=SE3KD39b<yCPp`v(~!S6@gnKHeXI+^GoB{JpLb^DTZ$5d`oX28|dJ;{L+Ks z@}I=+JPkSY4L*r0)$M#=z3lYYdtLm+dBs;ap9fiLS;%Bh@fd7P=tO-Suk+K0^9nCX zd<s1k#o+%+yq!Mccspkf5pP#4bp|lW9tH>#Z`c0tex6D9DBk{A8+ib4*!TqO60!Er zZM9P+-@d32#oHf#?BRBNCs}+?oy*Nw&kgd_SDby~p!`vfhMM<T^!*UAPp#X(PdrL( z=4q4les*@{K)%aM{<H1a@8f2(cE{IXvo1a;e?@sXiH}0|gK(|98GO{ynx1wW*T93N zZM9YOH@h6I6*Bl&Gv35-b{V`@dcsdNjAfnLs2JH#ZqBo{EIv>(PH#f}lkvNhr(B<B z59InF|Fw2c=<YYbs4;2XuW{iU%F4%Vc{gM^n{a<V4>`U(kMem6uaQ=J|2VSyYuL$+ z^eP!}R!p<^kRO`JfTz$Il5c;{nr4N`&EdQ`U^TK4IE-urcgBvDY(&0W<%4A-46{RV z66w_M8ri-ySa{ma;T?RJTsJz^H+ZdigMX=0Z=&32nLb*lwpfvD$-0p((GkPks&#V( z8`+C;a1O!^`kaf93_pJa+$8c@u$>7WX93s4XFiPV_^HYFlFv<kzAolaekjdhlFI=- zGRJW~i1c(^rt$q7nMa-JBVWJPf<C^UbcwU6@%5C6)3~K*A9Swh-#-zWF@8O(Km0Q^ zn5Uk6$UgEfSx1if<4DU*qitSv!jC#5nBEFZvKJG$w1?;*_@Rv*aoIOF(8l@D#w_6J z;65OY!NAS$%3~Gzxoh$xD<?sI0@0K3C11e=U~X*x?zrs<jct#j&pYEXhiI(Kk;a-Y zMln?7P`pfe^^^4RdvKWb{o2K{dB6w$*%?ixD4*it&pjOZMaxk>#SM(d<VtwOY99Hb z_R|ODO)RTD^5+A26J^RsCU3x}Hac&jAD^#sCElal3G9o{A-8he5$idAaJBQOvBBHO z2S~dgs9x;iM`moPQePFB!8xgG>sHwhkcBnTkMO5Gj>4^E;4Gg!MDUqLk4es3)KBER z<ho>hrhKq`{}0aGm=8ZmzNaMTpeOmZx1tlx8i4$(GCC^Bzd8e+HSm*v^-22P{@C`~ zEGrrdI5aeF=9y<7U@VREI47Q?+gZCe(v#*S2TjSBB7Kl5#rYg1@;ORttC|n_%^Al~ z3fLZw%aVVxTeLhqmd~;!-^BN=pWRv$51>D4m#I#EReeQ?oQ|<k>`1o34VOJqU1%4{ z=^);Hf4RD$GPjEUsCm`~<jeggrz4I1pgGEr7h`*Kj2{>u*QVC|sag-$Eah}qx|g1u z4r`Cmd8@qhs!in1Y+#J7(AQ4rEYX{`ckwuAqw^c^-v8mfUFxehmsahEZvkT!Jcl;S z1A(3{yMoWV!u$cxDU^}SV82^*?vK@5H}T{0M#I;{`R{He@59WaH@SW(eM$B#Xa3zh zc?rS?{XTpOIOQ2R)kB)k0^@0c4s`~k;=wv+Wn3j6c$^Pm6|jl&(1(FJx<@_Z3RmCV zyY{!@@dIbmBxQA;v+Nsas%4g|bDhr)bO*u~?@8hk>3Z7n*@vyO7|srKzJbGCaQe;} zEBFV-*E#2_E7h<kx5L?()%%>&8}bg?RJ?@yooFj*NB3xCxZgtO3Te*~zq^ul*$*0Q z@gAr>FT3yc>AKDe-UE$it%xSx#o0$1o67$uIOs5E0+9;}U#d^|xUPF}tJGJy#<L`z zF}zYW<9RoC3~PPuIfCb`pqVk{-QIdCI_K2%_abG~h6OEq+zrvqzEv|$`pVE(dKR?B z^CS3tjJA?9vXw{E!MQhzAK|O7VFv~qr?lb!!ftc(_-FdVvrp+Ue6M`VjLUj!kbM>B z=^TwEf$k8_6s`~L{5kc*3#-rW^Vgi6J!@ToF`hdWTDCX~Lw8?-=oaya&bPL$%Y!NW zmd=&$BSRie*8Na5<*unJM@+uZD?HA;%&*CUtMOMjsZPnhVQ|vdetkGm=fw`tC-=qT z<89f%Gkq6b=Pdm3PNzAyTkVopR(qU2Ebgdl;`<Nz-Z&2K$m5;#*CN?rT^&37&E0i6 zvzz{g%2w1Cao-`er*h;g)0T2tBi~{Z^Ub-3;p7*vwYj72-zeKONUX5v*T}6O0tWaR z`yTq1Ja~MfHDvC6_x+kv<m}`EpPW<9JvOxuA;Z(|ntBK4cy*LHTNIyNYKr(o=T4TZ znE_;nL#&T;Ol04D<$3z#o{(dO&nk399~t^M#NxAZ-5&BlY4<&~D+foOo4(zzU247b z+ztDtRc~lJq&jWy)zwc`MxL`OmsCH)eMxWLOPnuPtg7t7T)ApZTwlxQM9Zu80RJ({ z2TRXbSIw~3Rea-sgEZ$BW?at5<$TVJJI*|pZJS{p;nN|V4WqL7P)%9%NKG*5J?GV& z<P_JLwO1A#%_etO{Cza*c<H4aa0qXi!p1!oXAWn8<KxcAb4M=Yd;kN_1=UvPysAa6 z^_;02s+aOEHF0I_R5RutuIc>W8*?-GjqXX0?p@DU214;tiZf&sOIj$N$}?|%6f^EE z$k$HJI`eG1tc`$o+!2bWZU{O1C|rW9fHs0W^1v#R15KIKc@N$F(m%{s4kBlS`M2tv zFzD(oK5tjqmrj`<q`ju9&d_V8?TKGI<Hf`$${wGtzKXG1S<5ZQhJ(iGX9MN-9Dj3Y z`{ZKA&su<GA#|UL&m=Hq@m-I7ODcHsD=p)(pT?{1#nd%*Xzv&BV%poy+~O<u){RSh z>r(Q6&%;K@(4K{?V4Ymc>o?z9nad^XhMxbpnd4<z>(>51#+Y|DhjZRu4d#`>Pg!Rk zE~{~e)V*`w+*dzj_Shiha;^}0Ice|W>Pc_(Ylj}Os^%P%8(z@*@~~ZAP?sLl8pdN? zdH9KQ>$&yc8UByfpZ$Esw7D-1tZN?LzJA8=zfbzv&!@C5FrUv)dwKYl)>DV8pZe2q zrS;dtO`m-9=gN6`w{5*s`t49)qs^XKmHyQTsC6^I>8z8Y`vf*{hJe+&>*uxBUkwZY zS{JG=`J7v^i66Af7gvprEHA^)eetPQ(O-mZHCOm2*YWnYa-Yxpdo-8b9(fnuCEsi+ zUNUG^{JVL7&lU8~^Lxfn{z&@H@|mISD`;Eq(1Y8M6}wX2!g?CK>nt7g(a?)i+b!=+ z?N;TecI#!nFDd@_^V^SZVcwSnPioIAa$M)>L5p_U_uKoKC(Xx5W*fOSm0;v^3+f}> zqro@=%~=|}YF^SOmJM#dO8E!ALOa;emr0&cjxlLG@U_q0e(qU?o^=M0$McmrYo9j& z?NRQ^0=Z;7b1iZmtzOP6h-59cs);!r0*vHE?6|VZ*&>a2p0w-d|N0N&|My64ZnNFg z6OtpB;eYj*6Bm5gyt`#uWw_2<4h&5g*4);ZThF^1Tk4TLQ|VWEAJYGslYcpUYin^h z&zx({h+DO&jg-5gK4xG8bY~4UzPEU<w#VQ{NYRGk6@Sr>b9FuCoEjo$y8PDCaCOqJ zOxsz@dS@~IKFoLrS|$wJ>_6BS<<^9*Pkt2moeIo0{ldSY`gkj{FI`bzbL+>DZ=kyh zkda+8tSAnx7?f-_oeOArTj9N};ecc;d3SejFRq`u?x9o8oBPr8zq0m;Q~vPJHy6gw z+jYu=Uum}#XA}*78Gh^LyYlv@7CDQAF~~N=rr3r)V;ze;qEF=REltJqxsUt&s_mR# zol1Y*@w^>Ix#^7CvfdYP7CJ1lJV5sBRxCm^AbMzHj0=%x%{+rf%rm`v61r&S6Z$vL za`4YYp5<t}jd7(*#KHC5T~z%xcvD-p;|KRqCW+B=#v^*b+O2mE<5#~k=u6MVBZ@Ws z8h?;zw3~65yl{BMw*2%@S#NVUL-lZPeEkIcJg$2_vI_f<b0a2Wi%r!SifgLra$hxF z*-#bzh=<gl#;rb^=&vAI%~*xI#<58Eo*s{7R*bJ(=~Lt4o(Aj&e-}93W@y@cE($ss zhknZ!kahiF47d?o>g#E8GX+;O-}UTr^$U%VYp~l@`$hazv^|4*X&+qS&(Z!AWRc0g zNpSQ%ljCXjEwyB^F@R~jM}K;+dHD|S^<6N2i|<Cp)28ND?c3glx_E{2^FpH=&;|VN z?6dF<Rmz<o!QOv<(#yjM%@6FD@CIb!IL6V5UwCMk{K`azcX3aab5d^jYMv+a^)BK? zqD$L59l5p~`Z?d{_dPSKo9{`xmkdfKrm9y*a<bZgkMPxGeQ*#OMuz%#gR@)6>$*oU zh+ag0$vpl8v?JOQ9V$OlGD-4C@<ufL-{A5PK6&3`7qZtLQo(i_U>#EJ4<~5OXm1|& zGrD_|^mYaw?D5d+;Htxl&azd0{_i+HMddVxIWfKynRh>HUE%Qr<d$&y6!f%^z0PBu zHsVp^gIUL*Uy#vbz4W-1Q&v?knDo*iR_hZ#Ph<N|oi=7XeWiInJ~!!!*Jma@`ubZY zJ;-v!#Hd?%Z|d5#V@-SF_1J{ta>%MLw-(>9%^OrcDYEJQ;e;NMb1l}S-y$a?S@nJN zUfZN!3=5|NUCl;@o_F#~!~V&q4j=!u_rCbLd(NmYrH<s)7?*P+giBz6h+C|ae>0rO zZ0X5W=*QHwML!p<eEH;UM#t`#%abk}t|KEo?uFC+e71E!J|}Y1Bi?77@!R3*w9AL< zvHW~o@nCqg51gsp%(Pz)BeUU6?WwhfswZDQTst{}<so3veJG!1Y{0+2|1VEEZ}|C> zUp}aB>4kvtBzSmnWaQjPE=PU`@^p=!6Rk++HPVgdvaND;Rk}_*Cwy?`9&`k~#B|gK z4Sl4c4Rpki@ch?soSF8EVc}3XO2%{{dhtB!B){jgrjlH9=(nwa4a_(s12pcoN|hW! z#zQ}oq0t|}U&&mtm#|Caobu*SWu<fOXT2yHmUG~HXm&Su`-%V2|B_RIH(0JW4eoee zv2@Wi=O$^t=e?Q(wI$s<hI|#^|E6G7UBe%g&B1e$S89Jg-zBq%7ocC>Be`L4CfO?e zqp_rTo}!JnN>00{*ViGNXy4GTa6N<Zm~n$^!6@D54&ajqMvbkBzSjWH4t}2i&4&2p zR1f=#xmgrk(E8FL;-R-;vyOGr^|{9l))Jl*zlqoU)(eK$Ad3@zqC7CdQ}A5EQ@1qm zlyb2f=VB9m%ceB&S*O;IV=hIv34fGjJD$Aj=Y}7Um0v#j{J*eM2o4YHtV`1dHXi4A zn!Hufd?P(e)~c*m!Op1!=$1vg*S<?Uft_BpCjDmkmT8v_SEogMu@}1Gd^<DuHE@&Y zld6$Zg<uJO#zem*^Z!=xnb41Li9C;R&z!Q>?DBYaMV0<U^XM}4+OCx3D4)VPG-00y zzGVl#1Kc>2cXXH2j15%>Kh6N{yPU5|Zsd?;&jQAuY5m2p!@Q0u_%$D%m7SN!hPmt^ zn`6qJ8#EIK9O?c+F!rde=%}-UZoj`X!!xawQf@18TAsP=udHx30Q-;0OCN_V(D?^o z7i}kYieMedVynIiEbw$q@cbabF)&N-C+)}vIYYRlob;G*k}do8cJQRR%oZcvESlGE z?OB%1X;)h6(}8y~&)*Cmh?b!{?63at3C1P6=nBfWRj#Y0XlruZHu?jb;auIzbZ_*Y zGuIm4uQBfz1>Z$}Xb!Uj^gnnSaq@F&_w#P_T;Hd@WEYhD8f$NJ#%n?c8q>G+o^d75 z;D2Ka4f5P7({^DscR47|!u@N1;LbnFTJ)*k^TCVkBE9zpuc}*qRQFt-+m+MmveDXD z6Jz7oL^sgUc;eMv!h`C|zkDKPbtXA;XZ$H@U*k%~bG61%q<-12;Wrzi4f0a40T{!T zd`gFB3+bx#vvQs#rzNv!uZObN!8=0<PP*x5b1WO*2faw{$fx;j(GGOlk1iLzXpRHo z%9%;O9F`wOJR;fdQQvkJ){zy%lJ{DZNS}WB<otepdMsl|`dbzEHJA2-Ntf<lL*V=0 zop!-3eiGye`;^(g0Y7Oxvj1K1at(E6)1T-aTc~sH+k3|Gnaz8fvuT|HiH*j8_C)Xe z)OTW7IQ$<txEr=WOe(f(6S=*Ku_SW)CmI)h&ZW#-i3!bM?q)(8vd?qWHS&0H+aBR& zh1%xR<{Wm7?P>Zzt|P-I1uNmpF&=OXoL;xxMZj_PemGR;9O~*`Ce7!6XXu~1f!dta z$Ug2`!SAJcZKK`x=SGZ;s=3#AKdSLD-$yZbW-R#B6TOh9&9|}_8JjISE3>k`t}+_8 z?m$q#Z=sBS7nqCgfz9Dtp&9eu`~Du{=cYckli@R9-^zIvL(pXKb?SW=`V?&c!Tay< zTyj_KYi%~2_sMTFPdq!CXS2QY$L%8~77G8Y*IvfIEx(<ehvymREbdFvycGFv{J4DY z=DYmbi7)z%{C0}+0WXmsy2YFwUEp`Impj}xX0ytfg@2ScoAY|n3)T*PFyH5xHCmI4 zz0X{9S2h}6os2(uw$7nup0kBw)ne_#8DBf1{;L7|o{WF{WqjhZV_!P!#2uD}&x>an zo~0&H#(97?qI>tI(zbZx*WkuJDQ)~%R^f*5vLgO-cP(RDQX`(yQlM_5Up>n+`L{D( z<l|1c=T~QY8$0=QBnLEBVB=mZo%vk~j-b35X9c^4wruVJ$W(y&<ZWim#$S)WyA2=t zbZF7|&I@Z9+gSlV;1>LBb={Y2(~fDMn3dr2@KFf1OF0W&@k`+>>0fds>0k0{qQ>An zSrg3Yh9T{ncs+CTuk7(!$@%>j=dq7Jaj<qLw&iOb>yw7&mIO~gV+F>tQ|-pI5%BKy z(8Zyg@%(w-Tfox<ZZuxYDF6>=`6YMqqGK<hZsO-((4G$3ojm&Ty6|!KVG34r26_Cs zV0_NJzms>4XcJhiJm;M{mD+tS=O4j$y5j&@&KjsUTn<l)##Zp}@ZZ6|Vi`Y$Pruci z4PKm(h34=((dUAx+2Hb7{Eq!llk>fy3vAs^Z#dQMWuGf;07Hp>FE04O=k09OF2eW7 zfrSD7?R=r$3~X)88F&w*8|GQPd(*(KF=So8_Ptm>=#I<;X2H509GJ8Afn}ET4EUSH z{R}q!NWNB&W6kFH!GE06i=8_V?&bH>+tR_TLT}h!$>aYbc2e<!JzIO_*GEroH2saC z&bRp8#_w@_Pcbgt4@w+vKh6b@RRnK^>%v*_ncznO$D7}`n!Cn7|AOr;qEG8we6{GT zx%G=VUsLxWimv|X63c<7w0^S~tL0UL<;3OgBi^)vv56LCe<=QB@muqf<1@p*!+!_= z6Z!vV@Z#|~lYjZ?7Vw|3{F?A&SvsfO+<DtVALh=IEbqPvTt5O1(Ux#?BfnKnXFrf5 z*u~n((1zu$(SEr7cZrCe^q<h+_VEX3t^>MCp6_gUehAMc3!grn*kC>%*d^i1ul<;D z=a2=NBKP4H9}52b_BD0xfvl%X7gdku{y^Qc*R0Q$rT7A@do^z9`9q0^s9qC$_S3A( z#S?nBjrJ0`6_vfH-bz`?k~YfZkS|xn_gps>FRH2xwqu}kJ-PEIOwq4Z>Iv_n9ovfJ zU()CA;;~xDEZsj^C*Q96XcX(b!r@*<@m=Mn5FcVdtOT52f{nT|d>Y&tJy7J{4d8~4 zb2rjfrf_JO;3HRg2foY)q16rSnUl=aou9zPossWk+;*Xpc+e{OH^wXOlCusCbH(0z zTLpOz4szUE(M0*S;!T~<e7dbz?#x+ha66F?1HH>Hsd~~8w#u9Kt*!^`n;GX>wbSWC zcMj?fSKZ%g%DFv3+S~AahS&xEz^+u=qJRcYx;4JXaUQ<wBe>&q7BZsjfX6w#)u-e8 zH*+p9;8Q(~b_I*Mx0Uq^y6TwdzQ)C7-KYCy&0VVW!8rxoE!ksq*30l%;kl8aTW5$i zk^9U=&y?QkTz)&puf$&D9!lDkjLJEx%eblkU*KBjuB3^hK`-1vcqs2aP)!+_xkFO- zNX9VkIhMIYR@qKZkc0mf!^+T>)>*_0Pr5v&6X^wuSlqkekEdwAgR<N^#rhn*LwWTt z90^y7xthBztyR~8lWW*ZZ0@#f5w4o>6~wr@n{wQd5$0|1RzR+Jey!8$#ok>R-pf1P zg?MW-cOhD3(+>L$H!be80&K+E5o5Ruk>`JOxR25Dd(@BaKCFIqoRtHgicd-Y>8ykl z^k(_=ktgQITx{_kH!<|Y*5H0Z;^)^e-)9HNr<N3Ui1c{!{%D?AWn@l~cF=jU@mnmv zCcDILT@o~T{tWwM{|MO{jdq5GZ?&mdte%NonM1Fots*qKmVOEWJ{ZUd{~fU?osF&b zkUzCQaCSpvlN5qyjqdJ27FCU&$F@W^uG5+8Lst3o*m$e!nPO*1e*2I;Fur~gb3G;= zqhxPtdb*w~Z-nj+<O-a}bFF`J6~DF?Iv)3WyDmH77Q+`C!`vV~29N);)+6{rsH>Qk zg>Cmc?1qeNVrbEVwk>Qyd+@{6+#obiSyi>5g`BH<aIXUH^Q$RhM7gryT^4MMb-iFi z7Iawy2gZ;7A6lYyjaR6DiE#)Q4t=oie4mlOz#QSEy5CM4q)uu8dlEQOj5)=4)sO5* z*<>FupTL7}1-#9`&p$=BQ?7^|hm7c`>eJeE2zH=i<?FHa6oZ(CeC?);#-O=ub!iva zbvMq5vLAujDi-Ryk$X)8@2UQS@X6dZaX(qEd|@?RWWR4wFfR$#7?_s@l<l$xBY3R} zHbuEJ+@(3RHeydOKa9s_ESi^pf=84)q4@Zb%#Ua)8H;?9#)d5y>hK3N<=4JUJJRjS z=S>$6%+=NLTxpESd?~)6@u$62JcHMf8}O>Zw`i~9Pm%7sm1kortZ(BnHVq!2i6)+3 z!E@1t?8VFJCuv_aV>=g;zoU0?A1->C@~sv;gU%A~xW@i01ol9AoITK&vhiJv8Thcn zXZjk-c9fBIC#P9wLt}#*L)|&j2QRe_o>#r&bKFyGt*<wcsI#5^m~(iU&$2&5c;fpE z@%@LueTp&umb1%6SC{Zx?P)$m&;M43&#*g0&*P5W8kEsjTd@6F**~3gKU|faC%8Mx zd;*VU@kxI<;1LeqBA94jI1qgtCzzNwjX}7SP8NRIXSL7J3_Sla#;`EPoyKf($yCoh zP!E50Rk<s7QBPx&tauakI9F)sr8$v}WtaWhv&_|-KXQG2g6O;iO%<*Wb9r(@3g;+4 z;hlek&usEfgo`X?{><+TW0TEg^Lv(PxwMww9}i@U{ZceqRL;ke06VAaLE3Mo{7Wmp zySJ(2>+YJNmrtXAzN`N&rvDqT?dab>xPS7I4(cBr6!i~Y)aF5B@Yn4h19ENu7>KWT zaqjIt;q&FyjKPn_VC;476%$N?=jjQ=YOy(vi`Ve*bk{&L&#XK?VAgGv8HmfgDK3K# z#MJGGpC7^V0mY6zY!~pIwtP^;T_Duo`#SU^ZOPW#`!>E)#>Li-))P0I&$fRZXHh<0 zV?@uU^DMCe;rW{FiiWr!9vnOhE-mXoIq9R9unVPk=Ap0bd@QdEs&jTAALO5%$NA2g z4#=kr`H$nxc|V1qmEZE6jb;6rI%W~J)yL3x->Ig?EDDYUN0OWNhtaJkN9$Ys1VegO zE~4Y0o8<W?ShF@Gb10k67ya>B@FxGm(c&L)B7Gu$Q6AIN$7Ab)2l32o&O;O5h(8?u zJBqy_>+r65(re&vuE!o2?#Xuex6xl6d=lp!nhMP?&^n2BbO$tR!7jCr9u3k(ax~x_ z<dm`b<>%6P{_H$i+v8~M${8-+lkM1WoK^BbJ8MM)lk{Dpv&lj0n(LA`#=2hoq_u<k zclfUL+mES}#vZ)X`LE}6htu1EPq?-#r`F%5@7y7#JI7@k=-y-KjX7Ixd=Zw*JAA~l zL&SgbO+YiW-=jN<$^BU#ki@l4<?Z}J;$8>ZW4>B!w+v3ez1rkXGUB*3(X-CqOU3PA zKPzX**a*pePHnvV1LL+=tgJO%yoNO@cd5nqSe4xz_TEv|vb!MQoc^lT73ur~@O-(R zax>WAoNv#(kYmBxd3k`1xK20_UcvoPszR=%KKYGJkNsGvy#!tkK`*5$+~Lb_#(s?2 zNfB4py<8fz=-IAZ8tS)geGL4aA0jKdUb3P)sI*4F=3WQ9hL&H3_p~QW{(igi3-GvY zk8Dlg>N0jsd`}oQm-04&5#65Wvv3nM)Kk|!BAvZHmi={3Ax&&(GXH68p~?JnPc)wy zK9OhZocyWvv6WPPEN6uZX3o|iKZm?Ba;S*oZ_1Rw1#PRJqc24^oyYm}iUAdF+Qa#9 zHP)AVG%mZcww`uV^)}7~X`^l%vfcPV7@Iz2Cn=}ati21OUDg^JGqP8Hxr}|?^P*XB z*<z8)nVHh_yyoBW%Gmv7&H+JAIesw3^@BO_c@u(rA!|_P$<Tnx*p$(HwJ*lE<>EKQ zXLv$fUOp(#D!;IoaY#-uhR%$8O=rr!4ia72nQHHuAer?NGQ6Y0y_%(KLUWE-nQ{93 z=dmq|tlNYm&bRnPVdS}^F7|8Jo^WLK+NN~%$XPwrkMk_OY;{$6m6^hZJ>YnUV3d5% zxi?}@Ev@nW&gLoTXmZ+|QXjm=dWJC@I~O^gac+!sBsy5W<hxi;IMi)(IM*xjgXSp@ z-9CowQTc@~=OiKHZ2Ma9*caL>S3RF$+~l7co%GfpLi;6RoZIK(3+%ymXHIEDHsMX< zE7fhM__c~feg|_f4O^V~4lHoFp+Y&vAlhc0cL=xS3++?B!5D1GmVECMW6J)n4(5pR zk^In{(Z(3Rx1J-1yQQe-Ki;FdIIQu-&#m818#+@&b;QHD{JLrmn$@`>@WO7LiPl`| zCI9ougX-NtJ?$S&>e;j@-KViW1+4DWLBkK$tXMyh=P{B&_RRF{oK;SZP4WFW?#twR z+UENV-%jyebHv==W%JCo%Hv$>8T}Q<BATu7j19Sj98)e`iqBg;zx@d6GlucVgtWyx zs?KHP9g4o70ozgklszKpU*D7d^*!!i?Ph5AR$}xvpY(5ZC1XJjM(tYhGwFBDooJo7 z<31alcI3<C=kgB^XkDlGPJugE(UndaA3+hjjCc=y+?jRJTf8^^ZJvt;<Ri(IR>SwQ ztCwodw~iOCZz)%q+j<B4PcxRzI$i|N`p1K?V=`9Hp0stY?hjs<Te+s%fn4bD`s&%U zdhxX^sdd079jw1*n_N)VL_RSXA3te%RlThgosFKUT)*c^a!tki%H7R)3+l}-yjH<p z8n||kmFHX$#{JKOBhS6*Mr>(t+r0pLWzw|j!0A(}y5oBK#Ff=6$y>D-Y^Y7y4&UW_ z_DFVXPgJIIXgGcQV2ylt{0kF9wXHRQcv-YFIPgTx&5;L7yXirAVT@bVUbGB(qZtQT zX<fGmzr>!>0J)@$W6DIzTr;KGO`lU3$FTZw)`v~tLHn_G2p9PN+e)%amrAbh&Ujs6 z#(!sBG=_d@VGf2e-buVCz9ku6T59ey7XLc<l+uhV$vaMa<La_$Q+dW*X3k6a>!~wu z&Y<x(FDTwfJFKsHb`<SCkRPmJY2m+<ol1@m_c}<oYTp8UW@3F!u4n;VGQS#Q#=W6) zp?4$l4>{<p?Mz+TGePahj@25xnX<;lbs}3{b@3%rcTH#&8CRhkntQA(bL&&%+!e|0 zwkg*>|23VxMmtZyo2qx|I7@q#SqJ#R0_2pbkGznceQEx&FKp$Uf7}$I;LLF^yw<NR zes9&lUVsLjYrxMrHSoB*#}f~%L|30<WRu#z(46(g`716std!*^-mSjUjMGN$Ws2M@ z8tc;Zj8)YR&aZK-8^Xf}4kO2UZQZihRy*K1(W2{pur9e`6*q>59wvIAuCtN)h1!hq z$Q{i+d~V4XR9H6-9J01JjWON;&5Hk4h4vKm8gUN$(w^sET8nJ=qWZeu6y30?@i+6c z?&siv@v=wY8f-=MAa|*<7RR>0E<yHp<a^@$@1AN3J<D07^v78$?(xw24CL<F!VUJ- zV&x#6<is|H@?fC%>+qBG@Z8{9IED{uDJNQUq{@EnXPTQrp)Omm+4JvWzs+44U=d8| zGP%YB{;l?ae|H;rc8G6u6wqP7-NAlO@odwjYpZF_vFkv$b-)iDe!1Q@P!2Qh=l8S# zSH|DC=VQ(vpUbc&{Ukhf%pID;4_4o}{X^BP>(}ONkMg$L;J=09Wd|AKM|_q=E-?mj z*|AIV*J2YbtzBOEqmc&-7xWq#keRrlHZQJ+zF(L1s<mcpku>`sgsZgIhn=T$Q0786 z!s+p$^3P?nq2Gw7l|wU6z$}0I6RfXn=%)i3mo1`qqNga=+OEFtgt>;Vk%zm}lt(s3 zYaH?i=bq%(#>3;H!Q=Q8EgkQj|Ag)OChu?D@&4oDb?J=M(a;%n&xWq_TkA;W`#VMK zB;c3L)pTCD+LVU}OZ+AWUi$P@<^g68T(5|pSSP)^qtz+0_Fq;z0b8sSS{`|DgZe%q zec}fEmmMd}Zue(&x+`m<QH|NG9VwqFz2mr?({X~zwpI%D7HB~FxN|wV!RM^TE-2PB z`3bAjOI8Onyw!sBx|x>0vVD5FCcnSR09!46;_84sFhjDVjQs@M=|W_qPDM6OFK-U7 z1h40Oa_ISynGXUtXGEO1EwE4QVOhjI@$#h=!Gr0aI|B1=_&UZq$?!I?R*K^??&i)m zYje(WHg_I}9;Qy`xalh~Sr-Kz?wZif`{`6(vCpNPLAr)}!`GNKS7yeV>fA%}^_1>r zwAR66*M+}eEWN2BbkT<#Z?MBG?PK<XKk+{DGc3hEUW2{1CUn6oFt^P8%>4QZ;66?K z!LruU#yWgPeIas_J947@e}jX(<fLDF9r#`gk4<cy^J0d+GERTJhu==+^Wj8t);*rf z2h)~6uj;X1+jTbY%~md{_HNxk+vF*n)Ki%_ZSEs&U2}F)_E~q*_Td?nlkKQ{eGmOV z0eY}nfBQpn5q^lS*=<_|lYfAo?oykguc>ivwepZM<gh2twHHfk4<~=E?9%%EXTzWJ zq0T{8qR+Eup&OB(=(S^@lbZIFNY-R3E42<-m+?MO?G$e%{Duz-JtUd5NqocFVvl~y zX7FO!<WvU2`^kTltW&;chl|WW_E@aj$$#2m_|~Rh>=3Pk(Qn6OyzxeV0w1>j*){wr zJoC&m)>h~{)(&y|hdb?c<Z4U$ery@yF0<#L8|>vZtwTkp;ydEp=FVR$e^y=dWtH(k zK!5lV!nerAc4fcJV{OzCwiZ^^4@I}8i`#<c!h=1IgIuln*WLb@zY>|T(k}Sd$W|a1 z?szk2iouuo_xd`4hg^XrHTfvS$Ib2qCPuUd!fAHbVeh8v&7~fAaUJ$NdwN)#XX5oi zhVq?^Mfy1Li9h`X{4E3dps9-eY<(d-1l@G2#$Eane&>gS*1@Z*nZYlzex4MxRsD8s zF=NAC!8me*9pLMIK@0xr4Ev!pXY$FZ49{!Z`AnC{OF{;`h4HpIUkY12*$!U{GwwU; z-N?)~r_9=AC2Nx}@_9F((eGaY&v@RaUCzo!p`%YXS<v+)o;mLNYjfC4vNhZI#Ls#y za%+=(q-xXQnd9`1Ys3FB(dkWfxa-4-?)q`u@|$(t^{I*0`fLZ^C-Z4p*aPA%?sabU zp&@JrgD*aF;7xF`))-1x9uAsfSneZlvCaJw{eCG-VmvodM!t;WfU~s%ehoZZ{sPWV z#BjC!{{UATaHW}Zt(&t>L>uxmWD7ktd>{BTp%KNXEWv#f@aUW`(aVPLMb4GKlzMt6 z{r;I}WQP^%_*_~<!#QVuo!sys1<j?1>-Fk+Jg4(x7}5XNWPtMserw;D#a)ex(do`c z#pZIvE=}LGzmxv-{U3ievTq6fs!v0sXMT6@`=23(1&=$W)%7%c$D67fs?E@sRrT+B zFLROg*HsVkE`auluNhc?3%JcVea>QmC(;G(l`mw%b7)_FUipzlOZb|v)w$rx6Up$I z^VVKV++dT|GlrJj-f<J%-W1RABS3F_I^NoG$k^;eZ*9tP)@HTuvxCnEX;*$}`H-Z8 zg#Xp#uSxccwlo)_r}ntqXLtuK4LO$JGV;0hkHFJPxi-q>obMc<AAEW_@OHu|+#0@U zfF<X_7iOIBfVV#4i&3!f+`!Vo=R^;_VEnEJUpVju-zW3=*XAqht*^Erb3{KmPv<(t zbLb)?yi|<m_2D1>b7bEh@}4rK31PY<-dS7KUAV%JY!>mHaPl^TpD%{wr<pubz0ct5 ze~X@1Hiz<)$>)O}WzA0fupnN=W`^FdpZ8^HOLdehaSD5i6Mt}tI;N~gydRlXA{M^T zjrRDW<Xfam(nZG6E`P^a0fL~#%3l+zy<?$8%UNvJR13);Q_ixhHInDou(`WbM)Y|E z<?`g3slH8pJ%0nw7PLptwBBFz(bd>eXVn_p@1%@;7aBLVbl2ihZM=^6Nq&dMJ=^=d z8JG5uR>wtc>$&<X0r$7Tk%{}mpTM8Sf1c(%&Fq5nlmoUTKsN5*Q=4K>ZT74+1@zuK zGu{c<IrHjjS9@sXQ%vF$f^#-8H`znVBaqHeIlk{r{0H)v|5LojvfypJ9e*)<3446| zq-}Q>yk34kaF;`Q=||ZNT8C;Lw@^>^96GI*Dq<hZw(H5A_l&DWK4{Cucgq}|N&Cu) zvb*lb4p!X<YE5qBr_Oq;E9c;|Yl(7<)V9WSs_Ni>x5>pI=c$wNr0tW8AG@aUsLTb_ zv0mEwYwM-Qe{H)i{)TY@a;husI@k!6KzRhnoIU7+3~S?-wEM>TDtv(>GpoVz>>K3y z9_}2d;rljr2Ym;bdBoKh^wx5;o1@)~yO4I-f8uVnd(-1=+RLcD-(X9$wXyf%0bs}0 zO1BlJ$iD+Ew2UCD+&0da%5UByoTc%ftAE?wxySY%-=iFGY?vwX@usa)t16Qz9BbBj zws6+Hs+O9%s+O+Ubpt~l7z&IP+fROU;vDNn9(W))GP9hq&qHr-t2G1ns^iCVFQ|bP z|Mm20wrx3jn)MC!p@pF%@rR<rhel@Z3TE)!Dm)%`KjKT@4e4{FkgXG^9m=qFQoGZ& zhNA5wbIY~f+TXtHEz>^Ffy=ZnpLBZGU~Lk=2Mdqax~YqgY$(gVTz%L6Tw-8DBb7}3 zNXGRy#|>ObyJp<1J+L*0M(|&xfnT`j2Ja(_$${ayXj8b(6e4_&xNY?jD~q39=K>U_ zFh@49+rqa6z8lNRPbOP0hpj6=gZx|AZpbJ62c>I6ogHHhYF&0s*a~gxxqK3{crKgQ z$e*&ggX5$vl^@l{y>7B-u%!cjx7}W1vwZ%bt=@x8WfeKI!CJ){^?T3VdP+}qo3HlH zl|Qs*`TmTI#hFtkF1tLKP8*U>*Zc%IMjZRi{1(rsy+zL`CQD!Y<FOBdufA%Fdtucn zuMRUs;3%u@)nSLf8Xc|wDE9rt@6gfi7toQP4^#OS*yWN%x;I7VZ<nh%;#8`a<6Io( z57=+OC%9H?K2uJ1btBxIvwcj`UkD9wE{hrOZe)+((Rg?KCbFGPjsiIv@?}bP3x+&8 zXp8$GexB$KOPl#LYa;qj>|4#zBg~O<XC-%ZUU!-E7p9}1lQS5ggO-Ut{dv*-8%>-a z-8a}@FRW)TR5>54t@PJhHLvvB>R(cA8{~XVbd>h%&hz{6n{s{(-xu>-XIL!bU;7g* z?^)nhjBwHTCG7vSUG6c;!}IuIbO%Oq=Z18EL;o$s#Z}fJEz4Zap>y!Xs~mIC49_>o zS5pMHh1E|icj$vYkL0Y>jzP{tCoiIdzLR@3*z0KYn_VF%mAN}p=S~e)1AO7w%kU>- z(4HUmG=%bhxz^lza;HWK94>f&yR|I-pWX01d6s;>{66*x$M3uO+;e_Z?`b~06|erE zwDW483*&ZQt(@LFf2Hj94;+B0x8eJ%wYiY8F9Azqxjp=DeCAycy}ymVzs|cN|4+wt zo<1*n=f|IF=Uc^S5AAg3TzPyMYaMI<<$?At9Fn%~)SeIBHNiOwbv?^)F1F=89$p8J z=yMu!et_@9k<4@ADabL-0pXqN`su68??tSG`ol9h%jY=l6E6Be5jxPCQFJVtD0=<o zUL)3?f%c4~{EoWo^T{5U-ocK#2Tgs5y;B-b+rWkJ`+I^5*>~meSzwQA;cM`RPflwd zdPmO5Kc_p`nti_}`W-`GqUEW1@?i#$;YICRMOVk?N8()BEgDyjm1tb|ms(@8FNn59 z<G&*RM*Q65__f8v<NFHz^;=>ePKN!wYDfL(3{LffKV`>k`qKUYovYMLpDiV9JjSDb z#=t}BM?94oIGC5nE!jQQ;_OZO(cZ+haX&-AuRhebfra}NbZ+_`54RZnDyLUCo>gIA zAH1tMWgT8m?oH5szn#Uc==qM|YR24LxgPz6PGFvFmo@zWb1?vavcG^kF>ci-V+A#5 z2j61<7;DPl{mdWn+h9JQYw;;fW?ufK-LHKG|J>R)tgM0Wpv7&f>g*j4IGO8O^WgQG z=i0|y?Ty4&<!)0>8@_{%KzCV99^_m^+SC4tBA;!H+k>ujZ&(ZG3bJQB+#JIyI(lae zo6Xo?3BG2F{$iNE5B-_FUeKJO!6NWM=bTAk_D}1b^1(9xhWa-87R)oj{iYN?4F_H0 zV%L$Qr<l%m-fPeGnFBu!t<w3`={{#a;7^!b?0=AT()}N2KPTVA%NXl)%8AaW0~=!r zipXvCZ|*V}Twm8biT<a9KaEBFa0+A9d}cV0KxIYGW<Kd>z2q|Q-p0J?{JN7Fi-D_z z%|ML&TgBxy%`g5qa@>1OeYN$ixZXSCdJE!u!rfqz^YW-Ke5no9Pw@7s#&)>t>H^^$ zT!~+s(H(}S{8e?~Kr|&<O6p$HSeG#fhKmw<^q@z4GvvIQ{&wo_31~#?Q6o1hyXuF6 zdyPqW);N=Pm&N!o^GKUh#downQ!s(&4#t-Ow;68|cZ~xJF*BY2RE}j6@suIE0{?ls z!)8(N9_o4M8*_&ZzAo&ep7;HkILILJG|IHzwZ6K3uv~2@qd3W?AAE0pZE@U|W%+^U zu#buImQC5B+FKHoE%FASAL1aJx~=|DXH|(Ngzto3Gd}kXz_ZH3PBBKEfgpSqpoJ^= zF1$3mXIIbSxA;^%D&Fo89+(s1;R~8y?ml=H*`T{magdsMqI^yBOHSgD8^eDTW5~zf zkKnuLBf;ejF`ax}?eP50xE;~OuVUJI=(ADG3|~quk^i>k*De8<=<XE#q-~Eo9=NNx zmG&j8B&W{gyfxV#FjtFY-<imIBm1z?r1Le$lCc?n%chXbJq%tl=KwU+D>T$2UPP|X zU)Ce}dxy>kF0+U5tMsRRg>3^D8GS*XkI@%*eC6hFD&G}5ot*Cvbw5T+89QVU+V=h0 z)O@5bq$8v&{$KS3=kOW%@k!PcucRj?t3Sq~y8)W%PkJK9IMR&i)pP~xqJwnBAC-TI zta?9vHR=krBiSXqH=}!m<34Nk-o%ExMZRg~UG{mmud{_O1ZRtbV+_s~2dmLZ(y^LP z$t9h4KXm{Z$G9gB#=4aCyY4u`4|K3DC03OyXYqq&jjbrV6d(2OF;-;DC;If!c<i3= zL|Zx^TkWY&@&k9Iod_Sc(|bU7=2sj2EO;O?V}lwS0iOo8sNXiYeo#IU*`$}!uH=`| zpNxTf+lNG#ALF@n(SyJ~uY~TQ%vyMEE%X-YCv=qNhBljv^5wrL(B9i0QD0+J8)@n` z>g-LxB0F9-@#wSov46*FJRR2N@R6PUCLg?;a;>pla~8OfU1QyTfKFZL)caqi(|?Td zPhQw7(y5z|=+qM~{!Tib3`~vqIXmv_9{Ose({aeF#&Qeda$jpGw|G>UQ{pn{zLr~f z*XI*If`?}M{o&_Em7N)vmAn%jJkFlQ#{Q<q@2PjtxSm0tHI{p0TyFKKa=Ht~0Z-f& zKQya??dC)_(pW#Ti;f~Tq%$6x-`-O@`pf7%ouLjNq>B;X%T|icP_Gypsf{*d2gyci z!xqBF49zMRV@Y}@afY?PDjC*98_n<s>uzjsKllavid*u?>-f2z+2m~;xVQU(a4%&n z`nAE8^eu5E?z5yX#xEO8=hC#4E~&~#-G}`m9W7hsBz~(rdZ`n=H6DH$FWrRR>XfdQ zT>h|li#34O4t=9=ybFJ-WYmc<?&O0OoNd@tNATUl$EkI$cyTTEn)-Y_&&?X8guSEu z9k(l#u9S{^Cw=Lic}{+co^L}}rQHax(pQOXvG-3ScUr|ykPG{K{n!EIy(2s0(Sz)a zx5w=n+au}EiQ2W?Ym7}Rc#n(AS%0I<o8mGZ?t$@bJsi7_F<SVm6@NGs{OI@fyGQm# zwk0~1deXzh2aO#sInoH<;NZ4ej(T|qe7ODLTYnV!CWKeqYRJuXA+p=}67rt%aMy(| za<-;yxDMe8y{@~XjLqlwgumvU<a?sCCF7r@{U+>TY}@FpSJoL1fAry+Y!;1I^Kva^ z8uh~U(7#}yj)8Hq)gOL?XPO^;hGxyLHKtip4$8;z-T--c_Xz!)Gam2_$iEW#5H^JO zP`CKScFXMXA*V*NHsv#)v~M%_%GX^{A-ASwa-i?l0I?kIz;NxuUYNRa5P#%pq;o5$ z&FaFRflp>xt%Y*U7QQ9tp0EiTQ4XZ`quBUp@rN26!MShPBkN3#L=Im}ZpPfI+ExF0 zM~)DADeUWpE)}EGcjZ$&^UINa<WZUU>$|zX)x=+m?1lCtUq?p~{zCUKp8a>U_TrEE zd+%tSM4iM(G?DMg9j$NRd%4_S|Lg!~(+z?raG9%ou)4R{U-!z)*+6vn>TKq&jdAF1 z*2R2cTVdNj6DEG3b=bzXyS|>vM>==3kEk`iceMarFLsz)><epfjj=DX@(&f(u=i%o z6N??%cKgF)@ee7FEKBS~`ErSWXbt^njPudA;#c{F?7?1Q*3}@z98aXKjZN=jV=q%| zgLC2TWgcJtIQOJ}Ec$=3;d}Bd`7BbV8o%Gb_j#X)>dfLZ_Zt3_c3$n%x%9wzUajoB zc-*7QWg4FQe*>n`^=4nreX^tazwNSvpY`%v^#=J|z~`^{+#5gZh(B`;{cq>H!+m-# zXTi^Btu+I>k}ciLd0A%tHqcX_Jiyvd>o;g5U5I6@wX6P#G<#N^jkWos)^FOcRW3bz zt3II@<5&1)>{qBm2l6XC%%|4h8E7O2ZQh1&;dXortL0lL>K>9zRp$d4-va$+OB-L& zw~&F>x;<!z@#l)0!zqkk{sn>$=8OyZ7ql*Gt3>_<`A~ntx;=sUdCCc1>45#~-GNmR z%=xXgY=wRs{3i3!ArHa#ratG=KNi;)ZL7Xyg4&xrfW0U`n<H7GGsybG|4LbRPSiUG zzQE6>XPo1V9)HI81SE4b2b?|KVwe438N9L#{#M)CQ<URh{L{^Rd=TEyoN0}zI!0F0 z-aW`0_1)}Vwcj5kKif`V5sn^YEiIU&yA!yyA53FLeg>*LKmTYn_QF+lo$)Mx;9=l3 z+K0!wfO%IOQ9k-x|2xw0NAO-}P)sfWoAtq}Xd*`p)SSVa?|+c7KX@f;HYeX7eiHl( z=2qG;Ys$g(DeiP+P5F2hypI1Px*#9pg}bK=oPsehet-$VknwR$2=>Ofm%K^zoM6?R z1Kbflq<bRO&tASy_JFStt;th7&p_A7nq2Du(f9&zYu4kUH`e2)^ILe54Iusb8R3a` z><Z<}v<Gczelol>{vL7%HO|T9$XBm<(j03391mSko=|srml@zL*@3IZWd`~?dn*&_ zI#cJ<=&gyg$va{hA2e&SE8;cTHqMrl{9Rb+ub1NZz^oGf&jDn92|uMny)t^oW893r zqY$stI0Msx2VubIe1GgM&N0Rpu(DoGHN7BRAh|7{XV$`|WIi&kUy}}*9Qz^<$4}tU zj`~nr1uyb>=IE!nObool+L=1i3)+8S*8Al(A?F?+q!;Eh2CakC$3hpJ#qBrKzS>rw zf|0emneWUEF<p}<r1OPNM-S^>O#G4fEhYq~C45(i{bKp$HO>8L%#r4N8gug@=AHct zh6XO;d*rWv#`vqx=Xa}xEOYSdkOPcAV~^dwvg+mK*I68_bT(A+4;jCX;y5}_r5v{< zpOEURj{Hj>WGwOxjX`fwXQfs4dlt&SREBma6Wx(a+Xu=R|B~)VCKqx@@C)|&qx>iH zy~KY)ZeZ*`(R^`+vB9nM?R(@uDMO3QjqDxG!-9r-iT`ADy(QF>9acs*vCwUC2B15B zk11aQ?JWyVFtoQUcyYna;S|1$_MB2gbD7frEUm4K{U*Kez$?*Oa~_{f1D%mGWa!MX z*X$KsvOk0i`A8aRjJ3%=*~uTF-9{P{j&k5k@=Elo_EbLu-C6?&==LkdS27_W_S~X- zNHWxEE?f+L&IyQjvUWcwK&Tqt6kjgPbEjiD@|kqdw)hcQ5&4zKu~vEGGm)Pp;YIB8 zT)7E7&}3}0#n5o#Gil^Ud>96nlZ7MNTFhLjJ@KRQnYhaTiullWRv+L)>@(p=@SV+^ zw-tc{SR`xA{l&#KK4USyleVIXCm6dpu@l9YiLH1!cStCvd=+aJ=_=xO_){hXJHgLv z#v?iUS>&B`tk#s$8%|lWkg+mO<t3zbS28{i$xLz$$MM<uZ{h*otIafRHO}GhS$~iA ztJsvWxZ_>+CHb`Bi#y4A<&Jmlx1TrweDs&l@dD#xVgL9$4$!ggK#=VGpQhu-Vqd`% zl2xxDGeyTPxKHHeU!&tmjJXj9{~ouyg?1b1SnKJ=a^Hx{eY2q)`xXu=BYnj^6NZ+0 z@uPf&_c{wK=MtM`POfbz|3jV24*#%bvDuH_m8?Cg+*5I1VRtPxrZe~{-`{;T_ilZd z`{&VrBOg68n9O=FMb2FJz^3qD_Kgj`UFoZh{MVVmiVFL^pi_-m_isp-?kzEQXK*$R zecxB;t0^vc(;)WXKz~?fo(A~u%X3dH|2I<R%kkLTEcrsLdy}@_`}2`~qHVJ-E>_2j zmf!su#>Kg<$_LQdt#^Aj)bixIBzZs3ReRp-HQmv!SVki*m&g6QAGpN>-)H^X_<kAB z7R6<jG~iouT<0hrR2G~k{;e}cmEBC)=HZcjSJ1wh2QQijkMZQ~{ugFC#ASiY0Uu-0 zCpqlmZsS{8Q_bRAI&v#IEb%QtU$U9A0~>3Nz9qGrw>Q5a8(6k*B<ndFmOdoQ(0A#j z_?X1AnL)`@_-YVaz@jZ=O5$rGpI~2W@xXK0HTK{c4Zfy_!go;yJF;eL9M(qTYwD)G z%pf!d93FEnziryPq?!ZP-vGbkPSD;B;u;gQ@5<QYlAVM3XKTzcxr!5lQ}mus?ctTJ zDtle;Wz(r2*?-diR&1+}M@FgMsd2r$>J0!NYx`g2-&2#l_rUujdq+84nqRep&DV*2 zxZl@>O}O9J^=Hb+wvheK+#fW@+-G8Vg?vN9qqhN<@Xk5FRmnr$M`L6pK8Vj^UpLA~ z`992g0a!G?jB^<42f>05O1Q-S{2BeJjNlf`f34h);&S`TxKUeLyJ`HwU8AkM4ID@w zrFkzr7#oST9lpFft^DP6s}LIhS=QA$?_mEK_hAi9E&-!Uo65QICWP{NO)hEdk<W__ zDnqiB+k|`MgYN#4eQXW%gwN_-fpa49X+`S==z%ub2NE=uxpRoMjqYNXot}diR8}(T z80J>`R<cn1CY`Hu4)rYgJsX^=P1Vu5NoP<mkMV3XhqCRoHq%^M<u4#NI76H}Vt&e) z%J`vP>pd^z)0$k-6?3fM(L6D}0`p~|^PLE<;t`z}QA$OAC-(bJR35N&o#n0W)c)T+ z-zTR57++HUXpuR{-(>bcF1TOimIsR->rE}Vzc<VN<?wL$m3@J`%lEf&Mi2e*9(~wl zk*72fUODU#_OJny<hk;JkJyP^1W!55k%xR_j|}!j%Yw7iHgsfdU|qB!r2VkZ=57W4 zmA{!`49aOs>AW(^nf=3g&H-xQ@VwdQ$GABMFUXv?q1tyT`->@)o3SQzGJb8tjGM9+ zXHYbOi@r<MUXR`9u2I`rY!&?G$G&h)%C0ssHY;DKx5Aqlw*$SnHOR2vTshFdXmas0 z<a1~F4qvlgg{Jsd4!2~J@+y^2EgPOQ)ULH0orBgZ`|1C-cQ^2w+;w5-=j`Tfmw=l9 zHY$`kNF*r4IS}4bkU4A!iM-7TF9xd3JlWkOE6MJh-HjyJ;v51RL9TN^B~WbVs7MrS z=d{{#MeCeeD;2GCd~2-L&PfPj(tDZHs)b_B{r;cxESo?Q=>3r1dwb`6_PhUQUVi_X z`OVCK=6Rl(d3+bU^P4zl>-NkK*BighwbQQ4SGs27o)B}u?+Tu*CtUCQ#q03oy8Do4 zdCd9D@WIyI^qODyUxf93T3*k&)^YE>|0%Quuf1!R*C(&3eVW&QmH(do>vhxX?M^rU z;XU-v-Fx4?Pd~XmSoh&t)G#bOqb6MYIy;{I)9JGv?sx18*DWT-3Ez2HPY-w&V2J-Z z$HOrHiEZza*?8gHDhxY!HtZ6^!Z_g>3cq5W!*>X-@%?ld=W5+2=l6FVvwU89Pv{@+ z^VucdJ$GNY?pZF)=X>t{n0~*M{Lb`V^w8ey`sUp`pNkguiM)1Qi03C-FS{<jWw&Y0 z9gKhE^j#Ofb+_m5o&LnnglCdvcRk-c`mDqI)Sd63zti@2minD^PuD?Iy9U}gAurye z?3MR$FTQp;Jk#!uKMmKMgx9Xi_qmB@S-H+<ulriQ*}XR5`ugyUy70Wcu>ZL><!8@x zzed=;!?Ox}2LFp+QctX&eZPD6-tgWoe%s^CmrH+lrvIn*qp;su&(r5rIG32_^6bvJ zsQbH5-*?BKhUGXduD9NBa{eRVp+xoW@Hx?3a_OCaZ9e{``--$tcZOv<Ex+#Wa4kz% z7vX-auzlVB68Fo5wk6*=u7>9eh2;<1%E{*ehBn|YY)fHSxSr*7(+t;Xzh4~>wrz*@ z>E!nPpJ(&-VB7bD#h#42=YKFROmnySIvKBFdC2|h!KVAg@eeos>3$hLkI!s}>GVC= z7e0p%_lbu6={&hQ`E1g&JmVy6n@=@t`kPZ;KgH`^p2>M*_L)zeyl(Rg+pc>Sc3r$N z-FCw^;~oa>*VXPjx?;=w%YX7j_pFC|gTi@OcqY?a_N$)^<AiN8+`AI?*`4df!@c{_ zUfbxj4EtEv2gCXg?ZXG}3F|Zq&rr0j_u+es>9!Gued?2^o++jco&Khm_a0vu{$sOP z^LP53^CH){?)BZ@J#Vy~gnK~3_8RI8`@icF9FM;L?myB0<oyiJ#VyOuz8&6M{)}Ne z&njBF^Sp4sSt_rEb((1xEW^QnYda0cr1ArIf0J|C$gwwUi)V&9lF+vKyhxiC+EU%S z9sf>$$F$TohkeE~i4K0-&a-&jOK|t&XLUH9-Fe3S>Ugd?!g37Zxkc7-*grzt6U<ZC zPr|c&=FHcw*?dK{yqA6(>_O&f?*r!PM^1N~*&W5^Yg*oN`V(gRa#X6rJPo1kv|RU} zr?b>?a-Kqa9F{e#-}`JsQM~b^+K5}!cZ=iK+wJ@B3D?gnr}xaB%vs3mS>`|Fa=M?F zJGl+#0>3+(W@rab<}z#_7pdp0S>8e$7V7<LdD(Tbb*cL__wUT6H63P})AB5B$`Aju z`|f?>be)&B``&xEU;cFH|AP<Ge`jC1V!AKc&i=jiK5g^DIl&p>K1$2_a{ICk^sYxo z*<(+Oe(g_P59PCgx7``G<uKh)ekJu>{1w#m^Reeq#_3(fInKHE+1?WOd1*)IlG?6x zi$lfE_jF;|PfqhO=6f!+UNXNyroF!LH^Y5AuL<`XxZd&iJ{jgcToe6h^LoUvx#%@_ zUq2fsd{-Fqeg9?n;`$~JQ{NkA^<DWO_08=K>*|$v{qVop`AkI{v|B!%&)JS5SG?}) zeSF(LcI!9Y7Z>)q{271dICbx7y>mM2{_JSyc|4!BFYL0-?5=0qPci+?pnJo$Rkx*Y z?{AwstFPYiWcT5P-;jNs^4I$z{nhDx)YE4*h@EbC;=(rgT<1L1>AU;tGO-I6^yjJP z^z7CL#D@Jf%;)abccS6Bj79yE;d{{cgyX35(szZjeYNikwIk+hS4C<%>YvN&t?-^N zw3jdQ-t*iS9o-7+@ay*1=lD&VbCV}~2E?oDbIv*N)^nb6tLHw{_kAjC|6x6RgFJ@U zk@`aSyLG>RPvluP>OIeWhQ4<=Q=Oi>(1+h**zMRK`t7PNf2+@^%gFg;n3uW6a~stY zo`3Tw^_+gPUh@{Z|8A)FjJ^Hbd2d(e8%!(Q!>>-qZQIZ{pQhig{L;6E`gV)ibJq87 zMP*o@-(kNG&w?-w+gB7Hb1rh17`ZjQ>G^@rs>1W3jDL&vW5v11JD%{Wkb~FU^_FQ~ zzSBHhF&~D{mGyh<L+?4QtXIRh;kgyzSY^57&%UV6Klp@pDfQXPERWAI?2P<i|CHP1 z&NB<taaZ^}G34tL#tpB-dI{Yxww&*K)C2Q3UDlAl<Yjk$<YfMumre6`yFAP#c|Wbg zdyMJxgVgg2VIFKJ)Bd?-)$dzE-Dm8X<?!_nlEc?OAcv2V!+#W(Z<ez&i$2_+Xn70g zVOy@}=<m8#_v7~aEUh_k=X2iaSxFyr&yMB%+JE{^`?LFvU%m5PMp*9Z<gzB=9$?FC ze$OyZVLrd*f_m$HyCd`VR_iI-nYZaSv;WQ;PcCz^f4a=eVVUz&%ly5~eV+=syXj>8 z<xVa?qx*elo#7dQ-mClV!EoR7scrGH*|zw)tzG41r?y40bGc_s-g@iSk6N}kK6vNX zUF5e!-tCxaexL9oKe)BvGoQcZ9<VU~Py486Mg5fftxW&s(za_|zHXNL@H)zOa{rt9 z-F8OQfAjtJi?CkzOxNqBcWP^Q_6ysv>(ooz%=_njMl`L%`|LN{=fZuZFA8<Hu3HOr z%VX#l=HusQ)4Xl>S#lVj_jlzqhtv99ZyQhRzjAAr9ESScpY#6k`*LTT<^HwWv*ypM zx2E&<@pfzXb-%IofirgXt7n|izvt|;`_<jM`?K30>*t<#%ahN(;NAVxpZAk}_+35o zf3bbyv9{;kk3a2-u>ZVgt~|>=c;#KO^P9PF-MMW&Tt~FK@!eS1cFeQiC%q@^qv5;T z@Y#~<tZh@TzH8cU=^xsyljn-su`Ts)g?%WrPy5aH$@VF<O}4#rrtQ;l?b9vVrz>~% zvD5eMY-9iBHym5Mj_RH6@0O?c?Tz}U-fume+9tmJRQpta`>Ab0>|B}mp`JGt+P<jX z`s0)J<~#MiCe%CKx5D!tU%z#_`8?S^eO&ItZ%u~w>DTn%8``Ga_v-39)&6)cQeNL; zJ6>^q`HsiV+8>|6S?*WMwf4twZS_w3lh><Z+;Hyo#qG~OGjI2Ae~zo;^i2B`+V0T) zn09DuPq!Q&Htw|jwv3_s$q$mBQ|-^U-}&B?+vzMnjxX;&*>;EAgtq#}PS%<2wB3&m zb)FvDoiEPKOYVI8$=qZwd8-XaZr;B2QOgwXJ9y{0KEHUTdoG{7?l~xLd+XM7T$gZ~ z&yF7dnw6~!v@u~?H(8$0#@%e1)3&bI=|AXx-<jIck6U-1=@Qx$ZM0_ugyYal@AN&? z#k-6f_OWT4eJr${VSl<tY}m)9{hOVA>_3G19(AhiJXP1r?tERS%Xo9u;r`6C-nr#o z!s-4rJqCvT>84-X`oNj?r!&vI-~RO8FWR4`?eWF-kH<Q9+Woa*e+uh5-z_b#3%`@N zvp-pPh5St0-1@+s&;Dln#?NYVt=q@{<U6)@ng6dnZkya^oA<fXv%<2(&QElQbsvs1 zVVv8i%k!n}(eya&IP)zh*YoT+^VG1Ovz=pfXp6$O@&t8Er<3n&JMRf~o^krD{dw)F zw$?FPzO-+zo$doCkNcqwn9Ka;>UH10^#;onx}O`$y52e*%B<dcvoh>YyUd60Xvz=T zH-2*3&pAZ#(rLeU=@;6N(8m0}a(WK+NAAlE=V<%<rd{gVtPAVAp7dSexqEWsIRd}_ zZ#`$=+q}=$cD`O2o@w{u3w;-^`z_!0HqRt_*WHhOq5hfA?!<)ew=VPEC;S##828c- z%B%BK%eD6s&o=*o-wxgVUCy8Gx%;Q?yZ0jf-m2d(-tKcPxxXxW*PU-U^0qtA|JnQQ zolZx;P*>=G@rQQ$h3SQHPfjBY`!2)6{5|#=JM(yQ`0dfVJ{^XKWjH(a+2We#dc=-< z$<BM#Fzj!CVCT1U!t48f+I{KDKmD1V@*kV8JANR1M{}k334Yr(|A%*n;V%oz<@bnp zKC}6LpSA2fW9%Itx$j=fdQW&Bk@Kj3|6bjZ?`ZFMu4Aiy&bz+;-TH-Gb*2$=^DDO5 zH2U$ouQRP%K78N3Hyi#5^?RRp*Fo!LT8G!++<8~{&d@pR*M0Du=%rj1JvNFw7d`U+ zF&rDbfAIT9K4*>6yZ*)2efK=N_1vNV_>4b0t$F#K7j!SXb2$3rpAPRa9;*MVJ~lc1 z+K>G4i_Uw-C9nDX{GYw(@Bih>?>y@GXJ*}>d(oYTzV*r9_bqRJ!I|IrxMzLSPp`b- zmp?JQ`PMUwS@-G-K0p7t7kz$yPx^QN@Z9wC^Iw;~`MaOw^^?<&{rB^AKP|oZ(x>b9 zt?75ZbV2`TrXP6YMTR{){i7d#uHny5zv1UEHqHyuH{9_;<Gm<-`CC%sE~eM-d$I9f zoc_>H>=$!M`jLxXBJL&WC;s)NVqcoxd*x-~FHdjz+)qT8yz)r&S5JF<wD}!RjsEze zzlg5>qc(cM`+hW9toBC-mi{{W*q?kj`sb5hi!MI$l<0R}@#5%mr#^e`xiEUdyEmhI zpZM3&)7GC5efrxz6#d1s-x^)=u?wRQ{Mp;0pZ}&JT71h@(I2e(wX|EFAAR7@pC7&R zs<%ZKeD0T{&pzpIMSpVNd!w(p?eyrJZ~aWP_YLoiZg|oS(Qm)yInka^JT<!XRsTHt z2iLqPdd59hMZfse8>74L{q^XD-@6_C*XN%Zz59xHM4x}-J<*fauZqt4u6ISr?$<@% z`&XAn!-wA(#lQ61(R2R%{n1@N^Tg=yOje__zTs2R+uwI6svmb%^se-}sJ!F8=&8qF z5uI_yLi8K2dwle7Za*G<@11${#vf{<T{bk^VdQ;T<hT_6<mYp~l8T~dTynzOn5ew% z($6|<M)}fj-sCI#sJ!JH1|MZcX?*^hpBK8H{MNgiPDIfY|I6WL+m@$wg?dAsLCjhB z93?7eQe|Z1SdkKjg_tnjP90B~cJGRwGVPvIhH;|!<lhD1?_|fR^45J1{5$Onf3yCJ z)4#a~`P&)c#nZoC5Aqj=$6+4+AO34Tcy4rRfp=adU-b9ohC82%{5C}N_a3k;!*snz z(Nof$-ml*&(;wa`Z~fJs^1DAfEz7rExET5C&OI<K-}dj`J1r0W)^CL}zN+5!V&$j5 z=d$O9@+W@e>u*q|cYh%H31#&+|J5)3f%2kn`inQ7z2Em!&%OCq7xzc?9dG}Ri@s-n z^zm0-d&9<u_eU>W%|ChN*8cQ|e&MDk{^Q4Al6~gRKltR=zwDBC|Nbk^`0b&*<S)N{ z>(_TZ;}<UZ`5*tooA=*z&n3U~gLl05pZv}TUhu3B-TwRE_?MSI|Aim=^Gp8w*L?7q zKmOhy`t7rR@o%5M|L8{!UU0_8_nw^I-#BvmFZ{ws-*f3-eC|bmw)<7jd&M)Kn0)TC zH@)=@FZh+?-}lF_di;%FE{|Vs_%$~kIdJ0e(IfFSM~}sm0|yRWf9%k5^nktx4_$rZ zwb5&?JA6F$@5FV7;$w%77e|jAKXh??{_(xh%a2}r?cpQW?sPmL^2Bw=j-EJi{h@<~ zUE|1dqxz2@zvjm4ufI7ye&|Fzx&B1_vV-x7qw)C{KJ%JK?|tBOPevbpxah-QF1mQQ z=;F&oo6CoYKX~Z);bVsmhGjT>;>LrAPSzCPaOlLLW5>UEVT!{i4qW$8c{o|u&678s ztmZ-EA8J{qmB%l8$fcPM|MH8nQ_XB`#K$HF4^NJK$$}g^dj0hewH#sC!>rIS_@NeI zC-fngAPoNU3oxzZ%gnzVKh*4p^gs0GXy`-D{50_X^Zq4U`h%?D`z82%bCle4{!M%B zWryNx4j(&yA}%He-e?!O`sNdd!ftou=!xmBcl9CrT72NT$*~Kg{ns5j@W$ge-f%oV zc=+ISj2kAlviO3f8z%>^KYH!crnM%|ylIch6+UM@b~NmP@&2PX+%P$E@WLqDnaXSe z-!r-Xu%4GpPE6wK4;{Jo#C2iP*N2D`*G-PZiD_o9y=vj6lXDbyV)?%OnfsFqFMRc( z6DPC-X5>w_-j`f)#jCD}FF1VU@QE<kyj<?(VN-Z>7%B97^cO}td?5LbV~0;1dRlyO zynk{eEbN;?cc}cBB|dJKiYEsTYIu%6eVVF^<D)m8h>u<qUw!n(BL~A)dUAs5y5i8} zpb5@uI;QJ?w3g#1CdW>^B75!g7oHtv{m`*vn#ZFD4%`@a`8Qp6`1(WfwX?;2>EbKm zgEIE$>B?J{`jDM4(VKT>|G=Tc-*YH_-4)p@r{i5{UeCYqS=a12|H6yHf74h0Z~E_< zVXhwd-@!fS&;IR=zA=8q;RDBx?q9s(HSw#CJmc!4lVb<tu*Jm=1drbPjq$4|Hx%-7 z{P3H@0peg--1A>^_=ZD!UVijwksUgA_~^ksS6;RM#$(409XWATcJ#Q-;^>h*um93s zZ}`$)`zJSC^@>B2<5yjwMcDI&t}HaKr#fFhdDEUSOZOY~ROimPp{=;;dk$TH^uXa0 zH}9D?eWyC@(5E`Cyvk-?96fyGgn9hJ%Qu{Q8D`~F*R=Xmoo3}!$8<~+J=JGt><9D; z5fA8*U4F?`H|+`k-#q>Q&C~zG0!&{_=Y40e#SWvLT((n#Lxm?tnZBOR$%$i!Z`iXl z2h*2f%F`FGnH{)yx?XYg#L;6{C3|+tg<1K`S^2EJ(Kj7GbYM@gbL{(~Vs;?e^A(og z`mLd+*~kyl@qcF;4^qv8P2l8IzqtHz;YW@hIke}0_&@u_PP;#CnrF?|4U@x1G&maS ztFJ$FLmZmVlWpdO7hd?%qel;3ee<FFH8t1Ur*>N7H^tLq!x63Pg;5;s>}aPdm`u;| zrtO+Bd{sEz5x->k7f#XaxsDe%I_iFzaV|d+-xMD>dgPkJ*Ty#-J$NYE|HAVRJl$S@ z!{M6_9lJPw^7+S~96#gR)OY`XhVOSsIdbTFeJ_ruQ#=1)<a9Mm*SMkS*t2I(^s>Xw zDUQD>?BDU5CJsbLZ#;0_p@UD4k6(A=&hh5xHP=iJjW>kN^my#J79TotFdSsUxoUCj z=(WctH|&k3TW@^z;mPr*9*_6zNx}r;h3Ws#oc{l;>HlHIu8hxrwiYmcX%@fqN_|7e z-bY6caMNZ$pNlSB2z~ZnnmLvpy5^c$ulSOkK_T+~{f+AH`0}w6p-dK@`K*hc{ha4M z@A-=_-hatUE)D%|I&s6X11FAMcp$vKwm5vWIDY@vS808w18+Kf_`qyXwDbC^8z$lK zXzW?{(ITwso$%<U8y(0_*0uBcs{4<y-}Lr!`71At4j;KDdgbCPqa%|e_nXJb)dvn9 zy2dEc1xK8@yO=5o<6Gah&6`92S596TWv_bm<yU%rVd!!Hznymv_wV!7f4$2maeJok zzQ6i)k2Q`N7&9<tV9danfiVMP2F47G85lD#W?;;~n1L|^V+O_yj2Rd+FlJ!Pz?gwC z17ilp42&5VGcaag%)pp|F#}@;#te)Z7&9<tV9danfiVMP2F46LYzF4SP#4*|0{>yh z`)UmQsmJe&=60r4d^PHOxH@is+`een&a@6b+<0G&VIO(yzG$~;h1&qW8udL~9lvz$ zzUZ{sv>xdse*Bz$(dn~kJ<>`1y?y(lGfZoGbH&3Y;Hxm~lV7thI`ibT9^oVokJ%TU zb#hvda1#IO(fcB|g`7BfBj;BkRS#Lk*`~Gke$#p+(|F$5`=UqPZ(4p2<PrOO%A@v0 zXWwsHkK`&#_U?PcmSe1V%)pp|F#}@;#te)Z7&9<tV9danfiVMP2F47G85lD#W?;;~ zn1L|^V+O_yj2Rd+FlJ!Pz?gwC17ilp42&5VGcaag%)pp|F#`{l0gwNTqA&b*!Gn$Q z)$7-I&gk5=H+vkopGkOx|1#6sWjfPq5GO~jz5dW6H^Jwb)^5`Z*Ni^GlZxW;S*?%U ziX3YmGcaag%)pp|F#}@;#te)Z7&9<tV9danfiVMP2F47G85lD#W?;;~n1L|^V+O_y zj2Rd+FlJ!Pz?gwC17ilp42&5VGcaag%)pp|F$4b#XJB_&wqu8m7t`xTAK3*xD_k=g zrWLLmePkyU-L`Yh=<(uz!bPLy&NZXQi~k81jb1liGx`W`Ib-!>2F47G85lD#W?;;~ zn1L|^V+O_yj2Rd+FlJ!Pz?gwC17ilp42&5VGcaag%)pp|F#}@;#te)Z7&9<tV9dan zfiVMP2F47G85lD#X5fF#44f7g>&D{X<isQRAkHui4>bLFxMuX~L)RWY@(52bJUn&0 zwlZXW{2MbcW?;;~n1L|^V+O_yj2Rd+FlJ!Pz?gwC17ilp42&5VGcaag%)pp|F#}@; z#te)Z7&9<tV9danfiVMP2F47G85lD#W?;;~n1L|^V+O_yOfztL`2YH&*FNIua2@C4 z_RgL&di2QgNAwC+)B5aq&FCY(O2-L|85lD#W?;;~n1L|^V+O_yj2Rd+FlJ!Pz?gwC z17ilp42&5VGcaag%)pp|F#}@;#te)Z7&9<tV9danfiVMP2F47G85lD#W?;;~n1L|^ z|KG{LoLT*ETyV#I_dV~v`|f+qAKrK0&fE{b677qk`updiFwT>BHm~JILcg8A^2K4i z>0cf7(=v_v^Y+|$#!k<uFNgmYp8UBJv+q=Qf7?0JQJN2)I~z5MK5+ZF(P=+(Zgf3g z$zS!MojSgfalcyQoLu(DJnOeUe9^f#eCj{_$?4IfzFL)!^^6%9Gw>B<;0|p>(9e8Y z84NR@RR+<|?l?;s?3+1H8N@ReD1&6?dCDN2xl9>kGgm5ueC9f3P|Vz<49b~Xl|eOg zn=+_pZdV4)%tw_$JM(d6(9PVT4EmW*D}!O?v&ta)@Q$;T!M>UEltDamfig&Do~I1b znah+xHglyi$Y-uo2F1)x%AlONRT)$>w<&{q=5}S!%zRWCv@;)92HngZ%AlY5v@#fG zKC29(kL);08SI-mPZ`8B7bt^d=6T8>ow-aIWHVPPgM8*XWl+rAqzuZLTa`gIbDJ`# zXKq&p&CExYK|AwtWzfysp$z(&Pb-6A=CjHm`nervDT948=P84D<^pAq%sfvSq%)T( zgKXwXWsuKYrwodjo0LI0bE`6_W^Pjk^~~+cpqcroGH7Q$t_->vrz_4?c14S?-hcV! z57T0V<Mo#tr*|IlxUWE%=Bd9Z`p#Sb=bwK(%%YBi#te)Z7&9<tV9danfiVMP2F47G z85lD#W?;;~n1L|^|G&z>r@m`0`qX!w!#oQtvc!aCR#;_?bvD>!i*4rS#52zVi!3o= znH5%9W1S5)*<zcyUE-N%fkl>>u*?dptg+4pn{2Vo+-~vAv%n%tOju@xRn}N%gH5*B zX6`ic%(K8EOH5d1g;myAXM;_)*k<l@@yxTpB1=qIW`$MOSZ9Mxw%BIw4Drmfz#>ab zSZ0M))>vnQO}5x(?o9E_v%n%tOju@xRn}N%gH5*BX6`KU%(K8EOH5d1g;myAXM;_) z*k*2zc;;DPktHT9v%)HCth2!;TWmA8S3L79u*eb<mRVtyHP+c+lP$KHdz5(QSzwVR zCM>hUDr>B>!6sX5Gk3Ol=2>8oB_=Gh!YXU5v%w}?Y%}+0@yxTpB1=qIW`$MOSZ9Mx zw%BIwG2)qLfkl>>u*?dptg+4pn{2Vo+}DU_o&^?JV!|>jtg^;B8*H-0Hgo&LGtUBx zEHPo36;@eeoeehGVw<^h#52zVi!3o=nH5%9W1S5)*<zcybHy{y0*fp$VVM<HS!10I zHrZmExyOoUo&^?JV!|>jtg^;B8*H-0Hgk^?&pZn(vc!aCR#;_?bvD>!i*4o}FP?c8 zSY(L_%dD`<8tZJZ$rjtpeXV%rSzwVRCM>hUDr>B>!6sX5Gxs;dGtUBxEHPo36;@ee zoeehGVw<`1#52zVi!3o=nH5%9W1S5)*<zcyuM^Ka3oNq4gk@G(WsP+<*kp@s=DuD$ z^DMB)5)+nLVU;!3*<h0`wwe0|@yxTpB1=qIW`$MOSZ9Mxw%BIw3F4V&fkl>>u*?dp ztg+4pn{2Vo+!Mt!&jO1qF=3e%R#{`64K~?go4LO!o_Q8nWQhsOtgy-&>uj*e7Te4{ zNj&o`u*eb<mRVtyHP+c+lP$KHi^Vg~0*fp$VVM<HS!10IHrZmExq0!-v%n%tOju@x zRn}N%gH5*BX70)2nP-7TmYA^23ahNK&IX%ovCZ5!if5h$7FlA#GApdI#yT5pvc)!Y zPZ7^N3oNq4gk@G(WsP+<*kp@s=FS(-JPRzc#Dry5SY?fMHrQl~ZRWm7Jo7BD$PyEl zSz(nm*4bc_Ew-6^s(9vEV38#zEVIHYYpk=uCR=PXcY%23SzwVRCM>hUDr>B>!6sX5 zGxs#{%(K8EOH5d1g;myAXM;_)*k<mV#WT+Wi!3o=nH5%9W1S5)*<zcyZxPQt3oNq4 zgk@G(WsP+<*kp@s=AJH|c@|h?i3!WBu*w?iY_Q1|+sr*fJo7BD$PyElSz(nm*4bc_ zEw-7vP(1T2u*eb<mRVtyHP+c+lP$KH`&RMHv%n%tOju@xRn}N%gH5*BW-bxWJPRzc z#Dry5SY?fMHrQl~ZRQrlGtUBxEHPo36;@eeoeehGVw<^Vif5h$7FlA#GApdI#yT5p zvc)!Y&l1l(3oNq4gk@G(WsP+<*kp@s<}MP?JPRzc#Dry5SY?fMHrQl~ZRVaWo_Q8n zWQhsOtgy-&>uj*e7Te4{M?CW^u*eb<mRVtyHP+c+lP$KHd#-rqSzwVRCM>hUDr>B> z!6sX5Gxt34%(K8EOH5d1g;myAXM;_)*k<ne;+bcGMV6Sb%nGZlvCamYY_ZMU#p0P~ zfkl>>u*?dptg+4pn{2Vo+}{$<JPRzc#Dry5SY?fMHrQl~ZRTDeo_Q8nWQhsOtgy-& z>uj*e7Te6dP(1T2u*eb<mRVtyHP+c+lP$KH`!?~+v%n%tOju@xRn}N%gH5*BX6{Ae znP-7TmYA^23ahNK&IX%ovHhZ5XGiI-v-c5`kdl#8P*PFT(9+Q}5G{%)CLtvwr=X;w zrlF;yXCQj9cw!P#GI9z^Dry>9I(i18{o;v9NXf`4D5<DvXzAz~h%OONOhQUVPC-dU zO+!mZ&p`AN@x&ygWaJc-RMa%Ibo2~Fmx?DQAtfWHproRvp{1i|AbP2IViHm^atcZ+ zY8qNPdIqA)#1oT{l95wTQc=^;($O;zT`r!Ogp`b&f|81whL(<=f#}=C6O)jVkyB7o zQPa@U(K8UeOgu3ODH%BhB^5OdEgd}r(aXgXlaP{;Q&3V-)6mk<GZ4K(JTVC=894<d z6*Ubl9X$ilE5#F&kdl#8P*PFT(9+Q}5WPw~F$pOdIRzyZH4QBtJp)lDo|uG`jGTg! zikgO&j-G*NNjxzLDH%BhB^5OdEgd}r(G}u}Nl3}aDJZF^X=v%_8Hipjo|uG`jGTg! zikgO&j-G+&HR6d$NXf`4D5<DvXzAz~h+Zq6n1qy!oPv^ynueB+o`L9f;)zK}$;c@v zsi<ja>F61VzC%1Q2`L#l1tk?V4J{o#1JRY@iAhMw$SEkPsA*{F=oyG!FP@l$l#HB$ zl8Ty!mX4l*=ndkDNl3}aDJZF^X=v%_8HoP2cw!P#GI9z^Dry>9I(i18?-Wl=LP|zX zK}khTLrX``K=fVWiAhMw$SEkPsA*{F=oyIqj(B1cQZjN1N-Am^S~_|LqN~IclaP{; zQ&3V-)6mk<GZ5wCiAhMw$SEkPsA*{F=oyG6;)zK}$;c@vsi<ja>F61Vt`<*BLP|zX zK}khTLrX``Ky*MnF$pOdIRzyZH4QBtJp<7}@x&ygWaJc-RMa%Ibo2~Fhr|<;kdl#8 zP*PFT(9+Q}5M3jln1qy!oPv^ynueB+o`L9E@x&ygWaJc-RMa%Ibo2~F*NG=4AtfWH zproRvp{1i|AUZ6bn1qy!oPv^ynueB+o`LAQ#S@c|l95wTQc=^;($O;zy-_?d2`L#l z1tk?V4J{o#1JU*3iAhMw$SEkPsA*{F=oyG^5Kl}(N=8mWNkvUVOGnQ@bVNKc2`L#l z1tk?V4J{o#1JP0O#3ZC-<P?-t)HJko^bACWcw!P#GI9z^Dry>9I(i18W%0x$q-5k2 zlvLC-v~=_gM90JvlaP{;Q&3V-)6mk<GY}mYPfS8eMovLVMNLCXN6$cXLOd}EDH%Bh zB^5OdEgd}r(T(DXNl3}aDJZF^X=v%_8Hm0|JTVC=894<d6*Ubl9X$ilo5T~7kdl#8 zP*PFT(9+Q}5Zxr6n1qy!oPv^ynueB+o`L9Q@x&ygWaJc-RMa%Ibo2~FZx&BXLP|zX zK}khTLrX``K=i%hiAhMw$SEkPsA*{F=oyIqu6SY+QZjN1N-Am^S~_|LqQ57en1qy! zoPv^ynueB+o`L8s;)zK}$;c@vsi<ja>F61VzE3<c2`L#l1tk?V4J{o#15qiSn1qy! zoPv^ynueB+o`GmZJTVC=894<d6*Ubl9X$ilTg4NTkdl#8P*PFT(9+Q}5Zxl4n1qy! zoPv^ynueB+o`L9X;)zK}$;c@vsi<ja>F61V-Y%Y)gp`b&f|81whL(<=f$00i6O)jV zkyB7oQPa@U(K8VJfOujOQZjN1N-Am^S~_|LqFcoilaP{;Q&3V-)6mk<GZ6itcw!P# zGI9z^Dry>9I(i18cZeq@AtfWHproRvp{1i|AbO{GViHm^atcZ+Y8qNPdIq8&5>HG* zN=8mWNkvUVOGnQ@^e*wlB&1~I6qHodG_-W|3`GB%cw!P#GI9z^Dry>9I(i189~Mtc zLP|zXK}khTLrX``Kvan*CLtvwr=X;wrlF;yXCPV?PfS8eMovLVMNLCXN6$d?Zt=t< zq-5k2lvLC-v~=_gMDGz#OhQUVPC-dUO+!mZ&p`Ae;)zK}$;c@vsi<ja>F61VepEa$ z2`L#l1tk?V4J{o#1JRF(Cng~!Bd4IGqNbsxqh}y`uXth-QZjN1N-Am^S~_|LqT9q1 zlaP{;Q&3V-)6mk<GZ4K`JTVC=894<d6*Ubl9X$il`^6KJkdl#8P*PFT(9+Q}5dD4e z#3ZC-<P?-t)HJko^bABF5Kl}(N=8mWNkvUVOGnQ@^yA`*Nl3}aDJZF^X=v%_8HoOY zcw!P#GI9z^Dry>9I(i18e<+@qgp`b&f|81whL(<=fv6TwOhQUVPC-dUO+!mZ&p@;$ zo|uG`jGTg!ikgO&j-G+&C&Uwzkdl#8P*PFT(9+Q}5dEZhViHm^atcZ+Y8qNPdIqAO z5>HG*N=8mWNkvUVOGnQ@^g;2&B&1~I6qHodG_-W|3`9RIo|uG`jGTg!ikgO&j-G+& zL*j`^NXf`4D5<DvXzAz~h;A28OhQUVPC-dUO+!mZ&p`Au;)zK}$;c@vsi<ja>F61V zepWm&2`L#l1tk?V4J{o#1JQ@Y6O)jVkyB7oQPa@U(K8TzL_9GGDH%BhB^5OdEgd}r z(a(t|CLtvwr=X;wrlF;yXCV4V;)zK}$;c@vsi<ja>F61V{;_ys5>hg93Q8(!8d^Gf z2BJnhF$pOdIRzyZH4QBtJp<9Ycw!P#GI9z^Dry>9I(i18e<Gfkgp`b&f|81whL(<= zf#{!#Cng~!Bd4IGqNbsxqh}!cdGW*~q-5k2lvLC-v~=_gM86=On1qy!oPv^ynueB+ zo`L9}i6<r@B_pSxq@t#wrK4vc`sd<_Nl3}aDJZF^X=v%_8HheAo|uG`jGTg!ikgO& zj-G+&e-}?oLP|zXK}khTLrX``K=g~^iAhMw$SEkPsA*{F=oyGUCZ3ptl#HB$l8Ty! zmX4l*=$FJ3laP{;Q&3V-)6mk<GZ6i<cw!P#GI9z^Dry>9I(i18e<7Zjgp`b&f|81w zhL(<=f#_Gn6O)jVkyB7oQPa@U(c}45QPf7!K4KD5GI9z^Dry>9I(i184e`Vzq-5k2 zlvLC-v~=_gME_DeF$pOdIRzyZH4QBtJp<9NiYF!^B_pSxq@t#wrK4vc`d8wKNl3}a zDJZF^X=v%_8Hj#OJTVC=894<d6*Ubl9X$ilzZOqSLP|zXK}khTLrX``K=kY4iAhMw z$SEkPsA*{F=oyGUE}oc#l#HB$l8Ty!mX4l*=--GZCLtvwr=X;wrlF;yXCV3w@x&yg zWaJc-RMa%Ibo2~FpAb(>LP|zXK}khTLrX``K=hm9iAhMw$SEkPsA*{F=oyH9OFS_N zDH%BhB^5OdEgd}r(Z3Z>OhQUVPC-dUO+!mZ&p`Cs;)zK}$;c@vsi<ja>F61VI`PCL zq-5k2lvLC-v~=_gM4RG?Nl3}aDJZF^X=v%_8Hj#IJTVC=894<d6*Ubl9X$il?}{fT zAtfWHproRvp{1i|Ao@M=#3ZC-<P?-t)HJko^bAD5FP@l$l#HB$l8Ty!mX4l*=nupb zlaP{;Q&3V-)6mk<GZ6hd@x&ygWaJc-RMa%Ibo2~FcZeq@AtfWHproRvp{1i|Ao@e` z#3ZC-<P?-t)HJko^bAD*UOX`gDH%BhB^5OdEgd}r(I1H?CLtvwr=X;wrlF;yXCV3y z;)zK}$;c@vsi<ja>F61V{#ZOQ2`L#l1tk?V4J{o#1JR#|Cng~!Bd4IGqNbsxqh}!c zkK&0*NXf`4D5<DvXzAz~{^J>ENBtRR?;|E5B_pSxq@t#wrK4vc+7eGpLP|zXK}khT zLrX``Ky;^gViHm^atcZ+Y8qNPdIqAq#1oT{l95wTQc=^;($O>A^_a7xPd?`CeZ(ZB zWaJc-RMa%Ibo2~FcZ(+`AtfWHproRvp{1i|xZC>sl=VkULP|zXK}khTLrX``K=h~L ziAhMw$SEkPsA*{F=oyGUEuNT!l#HB$l8Ty!mX4l*=+DFxlaP{;Q&3V-)6mk<GZ5V) zo|uG`jGTg!ikgO&j-G+&Uh%{vq-5k2lvLC-v~=_gME^-VF$pOdIRzyZH4QBtJp<AI zA)c6ol#HB$l8Ty!mX4l*=>HT?OhQUVPC-dUO+!mZ&p`AU@x&ygWaJc-RMa%Ibo2~F zgLq;RQZjN1N-Am^S~_|LqHXcSB&1~I6qHodG_-W|3`GA~JTVC=894<d6*Ubl9X$il ze-TeiLP|zXK}khTLrX``K=kM0iAhMw$SEkPsA*{F=oyIqLOd}EDH%BhB^5OdEgd}r z(O-%uCLtvwr=X;wrlF;yXCV5o;)zK}$;c@vsi<ja>F62$tM>D=+D~E<QZjN1N-Am^ zS~_}$&zk<{OrMy9l#HB$l8Ty!mX4l*@Mz_I#3ZC-<P?-t)HJko^bACw7f(z=N=8mW zNkvUVOGnS}`MqaHf3^4QeZ(ZBWaJc-RMa%Ibo2~F|6M#W2`L#l1tk?V4J{o#1JPfL zCng~!Bd4IGqNbsxqh}zxPdqURDH%BhB^5OdEgk)Rk9qlU-^<_m*WWiMiBI^kbD}># JZC}*ze*tYpKpg-8 diff --git a/quad/sw/comm_dev/src/circ_buffer.c b/quad/sw/comm_dev/src/circ_buffer.c deleted file mode 100644 index 36d90a4cb..000000000 --- a/quad/sw/comm_dev/src/circ_buffer.c +++ /dev/null @@ -1,79 +0,0 @@ -// -// Created by dawehr on 10/24/2016. -// - -#include "circ_buffer.h" - -#define circ_buf_min(a,b) \ - ({ __typeof__ (a) _a = (a); \ - __typeof__ (b) _b = (b); \ - _a < _b ? _a : _b; }) - - -static unsigned char buffer[CIRC_BUFFER_SIZE]; -static size_t buf_start = 0; -static size_t buf_end = 0; -static size_t size = 0; - - -struct data_chunk getChunk(size_t amount) { - size_t chunk_end = buf_end; - if (buf_end < buf_start) { - chunk_end = CIRC_BUFFER_SIZE; - } - size_t ret_size = circ_buf_min(amount, chunk_end - buf_start); - struct data_chunk c = { - ret_size, - &buffer[buf_start] - }; - return c; -} - - -void markConsumed(size_t n_consumed) { - size_t chunk_end = buf_start + n_consumed; - buf_start = chunk_end; - size -= n_consumed; - if (buf_start == CIRC_BUFFER_SIZE) { - buf_start = 0; - } - -} - -size_t putChunk(struct data_chunk c) { - // The amount that will be placed into the buffer - size_t will_place = circ_buf_min(CIRC_BUFFER_SIZE - size, c.length); - // Actual amount placed so far - size_t placed = 0; - int loops = 0; // Limit on number of iterations, just in case - while (placed < will_place && loops < 2) { - // Available room without wrapping - size_t to_copy; - if (buf_end >= buf_start) { - // If buffer is not wrapped, we can copy until the end of the buffer - to_copy = circ_buf_min(will_place, CIRC_BUFFER_SIZE - buf_end); - } else { - // Otherwise, remaining space in buffer is contiguous - to_copy = will_place - placed; - } - memcpy(buffer + buf_end, c.data + placed, to_copy); - // Update buffer endpoint - buf_end += to_copy; - // If we copied to the end - if (buf_end >= CIRC_BUFFER_SIZE) { - buf_end = 0; - } - placed += to_copy; - loops += 1; - } - size += placed; - return placed; -} - -size_t circ_buf_size(){ - return size; -} - -size_t circ_buf_available() { - return CIRC_BUFFER_SIZE - size; -} diff --git a/quad/sw/comm_dev/src/circ_buffer.h b/quad/sw/comm_dev/src/circ_buffer.h deleted file mode 100644 index cad546a7b..000000000 --- a/quad/sw/comm_dev/src/circ_buffer.h +++ /dev/null @@ -1,46 +0,0 @@ -// -// Created by dawehr on 10/24/2016. -// - -#ifndef CIRC_BUFFER_H -#define CIRC_BUFFER_H - -#define CIRC_BUFFER_SIZE 2048 -#include <string.h> - -struct data_chunk { - size_t length; - unsigned char* data; -}; - -/* - * Returns the largest contiguous chunk from the buffer - * Does not move the buffer forward. You must call markConsumed to - * mark the area as free. - */ -struct data_chunk getChunk(size_t amount); - -/* - * Marks the n_consumed bytes as used, and that - * area of the buffer can be used for new data now - */ -void markConsumed(size_t n_consumed); - -/* - * Places data into the circular buffer. Returns the number of bytes stored. - * Will store the entire chunk, unless there is not enough remaining size in the buffer - */ -size_t putChunk(struct data_chunk); - -/* - * Returns the remaining size in the buffer - */ -size_t circ_buf_available(); - -/* - * Returns the amount of data in the circular buffer - */ -size_t circ_buf_size(); - - -#endif //CIRC_BUFFER_H diff --git a/quad/sw/comm_dev/src/commands.h b/quad/sw/comm_dev/src/commands.h deleted file mode 100644 index 810414469..000000000 --- a/quad/sw/comm_dev/src/commands.h +++ /dev/null @@ -1,87 +0,0 @@ -#ifndef _COMMANDS_H -#define _COMMANDS_H - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "type_def.h" - -// ---------------------- -// Helper stuff - -#define MAX_TYPE 6 -#define MAX_SUBTYPE 100 - -enum Message{ - BEGIN_CHAR = 0xBE, - END_CHAR = 0xED -}; - -// This should also have double to avoid confusion with float values. -enum DataType -{ - floatType, - intType, - stringType -}; - -// MESSAGE SUBTYPES -struct MessageSubtype{ - char ID; - char cmdText[100]; - char cmdDataType; - int (*functionPtr)(unsigned char *command, int dataLen, modular_structs_t *structs); -}; - -// MESSAGE TYPES -struct MessageType{ - char ID; - struct MessageSubtype subtypes[MAX_SUBTYPE]; -}; - -int debug(unsigned char *c, int dataLen, modular_structs_t *structs); -int update(unsigned char *c, int dataLen, modular_structs_t *structs); -int beginupdate(unsigned char *c, int dataLen, modular_structs_t *structs); -int logdata(unsigned char *c, int dataLen, modular_structs_t *structs); -int response(unsigned char *packet, int dataLen, modular_structs_t *structs); -int throttleset(unsigned char *c, int dataLen, modular_structs_t *structs); -int setheightp(unsigned char *c, int dataLen, modular_structs_t *structs); -int setheighti(unsigned char *c, int dataLen, modular_structs_t *structs); -int setheightd(unsigned char *c, int dataLen, modular_structs_t *structs); -int setlatp(unsigned char *c, int dataLen, modular_structs_t *structs); -int setlati(unsigned char *c, int dataLen, modular_structs_t *structs); -int setlatd(unsigned char *c, int dataLen, modular_structs_t *structs); -int setlongp(unsigned char *c, int dataLen, modular_structs_t *structs); -int setlongi(unsigned char *c, int dataLen, modular_structs_t *structs); -int setlongd(unsigned char *c, int dataLen, modular_structs_t *structs); -int setpitchp(unsigned char *c, int dataLen, modular_structs_t *structs); -int setpitchi(unsigned char *c, int dataLen, modular_structs_t *structs); -int setpitchd(unsigned char *c, int dataLen, modular_structs_t *structs); -int setrollp(unsigned char *c, int dataLen, modular_structs_t *structs); -int setrolli(unsigned char *c, int dataLen, modular_structs_t *structs); -int setrolld(unsigned char *c, int dataLen, modular_structs_t *structs); -int setyawp(unsigned char *c, int dataLen, modular_structs_t *structs); -int setyawi(unsigned char *c, int dataLen, modular_structs_t *structs); -int setyawd(unsigned char *c, int dataLen, modular_structs_t *structs); -int setpitchratep(unsigned char *c, int dataLen, modular_structs_t *structs); -int setpitchratei(unsigned char *c, int dataLen, modular_structs_t *structs); -int setpitchrated(unsigned char *c, int dataLen, modular_structs_t *structs); -int setrollratep(unsigned char *c, int dataLen, modular_structs_t *structs); -int setrollratei(unsigned char *c, int dataLen, modular_structs_t *structs); -int setrollrated(unsigned char *c, int dataLen, modular_structs_t *structs); -int setyawratep(unsigned char *c, int dataLen, modular_structs_t *structs); -int setyawratei(unsigned char *c, int dataLen, modular_structs_t *structs); -int setyawrated(unsigned char *c, int dataLen, modular_structs_t *structs); -int accelreq(unsigned char *c, int dataLen, modular_structs_t *structs); -int gyroresp(unsigned char *c, int dataLen, modular_structs_t *structs); -int pitchangleresp(unsigned char *c, int dataLen, modular_structs_t *structs); -int rollangleresp(unsigned char *c, int dataLen, modular_structs_t *structs); -int gyroreq(unsigned char *c, int dataLen, modular_structs_t *structs); -int pitchanglereq(unsigned char *c, int dataLen, modular_structs_t *structs); -int rollanglereq(unsigned char *c, int dataLen, modular_structs_t *structs); -int accelresp(unsigned char *c, int dataLen, modular_structs_t *structs); - -// TODO add in string to be read from the command line when sending a subtype of message -extern struct MessageType MessageTypes[MAX_TYPE]; - -#endif diff --git a/quad/sw/comm_dev/src/main.c b/quad/sw/comm_dev/src/main.c deleted file mode 100644 index e5ab6dec0..000000000 --- a/quad/sw/comm_dev/src/main.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * main.c - * - * Created on: Nov 11, 2015 - * Author: ucart - */ -#include <stdio.h> -#include "timer.h" -#include "log_data.h" -#include "initialize_components.h" -#include "user_input.h" -#include "sensor.h" -#include "sensor_processing.h" -#include "control_algorithm.h" -#include "actuator_command_processing.h" -#include "send_actuator_commands.h" -#include "update_gui.h" -#include "new_comm.h" - -int main() -{ - // Structures to be used throughout - modular_structs_t structs = { }; - - - // Initialize all required components and structs: - // Uart, PWM receiver/generator, I2C, Sensor Board - // Xilinx Platform, Loop Timer, Control Algorithm - int init_error = initializeAllComponents(&(structs.user_input_struct), &(structs.log_struct), - &(structs.raw_sensor_struct), &(structs.sensor_struct), &(structs.setpoint_struct), &(structs.parameter_struct), - &(structs.user_defined_struct), &(structs.raw_actuator_struct), &(structs.actuator_command_struct)); - - if (init_error != 0) { - printf("ERROR (main): Problem initializing...Goodbye\r\n"); - return -1; - } - - while(1) { - timer_start_loop(); - process_received(&structs); - timer_end_loop(&(structs.log_struct)); - } - - // Loops to make sure the quad is responding correctly before starting the control loop - protection_loops(); - - printf("The quad loop is now beginning.\n"); - - // Main control loop - do - { - // Processing of loop timer at the beginning of the control loop - timer_start_loop(); - -// // Get the user input and put it into user_input_struct -// get_user_input(&(structs.log_struct), &(structs.user_input_struct)); -// -// // Get data from the sensors and put it into raw_sensor_struct -// get_sensors(&(structs.log_struct), &(structs.user_input_struct), &(structs.raw_sensor_struct)); -// -// // Process the sensor data and put it into sensor_struct -// sensor_processing(&(structs.log_struct), &(structs.user_input_struct), &(structs.raw_sensor_struct), &(structs.sensor_struct)); -// -// // Run the control algorithm -// control_algorithm(&(structs.log_struct), &(structs.user_input_struct), &(structs.sensor_struct), &(structs.setpoint_struct), -// &(structs.parameter_struct), &(structs.user_defined_struct), &(structs.raw_actuator_struct), &structs); -// -// // Process the commands going to the actuators -// actuator_command_processing(&(structs.log_struct), &(structs.user_input_struct), &(structs.raw_actuator_struct), &(structs.actuator_command_struct)); -// -// // send the 004\000\002actuator commands -// send_actuator_commands(&(structs.log_struct), &(structs.actuator_command_struct)); -// -// // update the GUI -// update_GUI(&(structs.log_struct)); -// -// // Processing of loop timer at the end of the control loop -// timer_end_loop(&(structs.log_struct)); -// -// if(structs.user_defined_struct.flight_mode == AUTO_FLIGHT_MODE) -// { -// // Log the data collected in this loop -// log_data(&(structs.log_struct)); -// -// static int loop_counter = 0; -// loop_counter++; -// -// // toggle the MIO7 on and off to show that the quad is in AUTO_FLIGHT_MODE -// if(loop_counter == 10) -// { -// MIO7_led_off(); -// } -// else if(loop_counter >= 20) -// { -// -// MIO7_led_on(); -// loop_counter = 0; -// } -// -// } - if(structs.user_defined_struct.flight_mode == MANUAL_FLIGHT_MODE) - MIO7_led_on(); - - } while(!kill_condition(&(structs.user_input_struct))); - - - stringBuilder_free((structs.user_input_struct).sb); - - pwm_kill(); - - MIO7_led_off(); - - printLogging(); - - flash_MIO_7_led(10, 100); - - return 0; -} - - diff --git a/quad/sw/comm_dev/src/new_comm.c b/quad/sw/comm_dev/src/new_comm.c deleted file mode 100644 index 8559b7d88..000000000 --- a/quad/sw/comm_dev/src/new_comm.c +++ /dev/null @@ -1,204 +0,0 @@ -/* - * new_comm.c - * - * Created on: Jan 2, 2017 - * Author: dawehr - */ -#include "new_comm.h" - -#define INTC XScuGic -#define COMM_UART_DEVICE_ID XPAR_PS7_UART_0_DEVICE_ID -#define COMM_INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID -#define COMM_UART_INT_IRQ_ID XPAR_PS7_UART_0_INTR//XPAR_XUARTPS_0_INTR - -#define BAUD_RATE 921600 -// Maximum number of bytes to be received within our loop time, -// plus the maximum packet size that might be carried over from the last call, -// plus 128 for a little buffer -// (bit/s) * (seconds) / (10 bits / byte for UART) -#define MAX_PACKET_SIZE 256 -#define UART_BUF_SIZE (((BAUD_RATE * (DESIRED_USEC_PER_LOOP / 1000) / 1000) / 10) + MAX_PACKET_SIZE + 128) - -// Declaration of interrupt handler -void Handler(void *CallBackRef, u32 Event, unsigned int EventData); - -// Pointer to the UART driver instance -static XUartPs* uartInstPtr; - -static u8 recvBuf[UART_BUF_SIZE]; -static volatile size_t recv_buf_begin = 0; // Index of start of valid packets in buffer -static volatile size_t recv_buf_end = 0; // One past end of valid packets in buffer - - -int initUartComms() { - uartInstPtr = uart0_init(COMM_UART_DEVICE_ID, BAUD_RATE); - // Initialize UART0 (Bluetooth/WiFi) - if(!uartInstPtr) { - return -1; - } - - uart0_clearFIFOs(); - - if (uart0_int_init(COMM_UART_INT_IRQ_ID, (Xil_ExceptionHandler) uart_interrupt_handler) != XST_SUCCESS) { - return -1; - } - - - /* - * Setup the handlers for the UART that will be called from the - * interrupt context when data has been sent and received, specify - * a pointer to the UART driver instance as the callback reference - * so the handlers are able to access the instance data - */ - //XUartPs_SetHandler(uartInstPtr, (XUartPs_Handler)Handler, uartInstPtr); - - u32 IntrMask = XUARTPS_IXR_RXFULL | XUARTPS_IXR_RXOVR | XUARTPS_IXR_TOUT; - - XUartPs_SetInterruptMask(uartInstPtr, IntrMask); - - - /* - * Set the receiver timeout. If it is not set, and the last few bytes - * of data do not trigger the over-water or full interrupt, the bytes - * will not be received. By default it is disabled. - * Timeout duration = RecvTimeout x 4 x Bit Period. 0 disables the - * timeout function. - * - * The setting of 8 will timeout after 8 x 4 = 32 character times. - * Increase the time out value if baud rate is high, decrease it if - * baud rate is low. - */ - XUartPs_SetRecvTimeout(uartInstPtr, 4); - - // Second argument is the number of bytes to trigger an interrupt at - XUartPs_SetFifoThreshold(uartInstPtr, 48); - - return 0; -} - -int process_packet(unsigned char* packet, modular_structs_t *structs) { - metadata_t meta_data; - // parse metadata - meta_data.begin_char = packet[0]; - meta_data.msg_type = packet[1]; - meta_data.msg_subtype = packet[2]; - meta_data.msg_id = (packet[4] << 8) | (packet[3]); - meta_data.data_len = (packet[6] << 8) | (packet[5]); - unsigned char packet_checksum = packet[7+meta_data.data_len]; - unsigned char* packet_data = packet + sizeof(metadata_t); - - // Compute checksum - int i; - unsigned char calculated_checksum = 0; - for(i = 0; i < meta_data.data_len + 7; i++){ - calculated_checksum ^= packet[i]; - } - // Discard if checksum didn't match - if(packet_checksum != calculated_checksum) { - printf("Checksums did not match: 0x%02x\t0x%02x\n", packet_checksum, calculated_checksum); - return -1; - } - - // Call appropriate function for packet - (* (MessageTypes[meta_data.msg_type].subtypes[meta_data.msg_subtype].functionPtr))(packet_data, meta_data.data_len, structs); - - return 0; - -} - -void parse_available(modular_structs_t *structs) { - // Minimum size of a packet (header + checksum) - int min_packet_size = 8; - // TODO: Loop limits? - while (recv_buf_end - recv_buf_begin >= min_packet_size) { - // Discard all data before packet begin character - while (recv_buf_begin < recv_buf_end && recvBuf[recv_buf_begin] != BEGIN_CHAR) { - recv_buf_begin++; - } - // If, after discarding everything before header, not enough is left, don't parse - if (recv_buf_end - recv_buf_begin < min_packet_size) { - break; - } - unsigned char* packet_header = recvBuf + recv_buf_begin; - - // Read out the payload size information from the header - size_t packet_len = (packet_header[6] << 8) | (packet_header[5]); - // Determine if we have received the entire packet. If so, process it. - if (recv_buf_end - recv_buf_begin >= min_packet_size + packet_len) { - process_packet(recvBuf + recv_buf_begin, structs); - recv_buf_begin += min_packet_size + packet_len; - } - else { - // Not enough data for a packet - break; - } - } -} - -/* - * Temporarily disables interrupts and returns the interrupt state, for restoring them - */ -u32 disable_interrupts() { - u32 ImrRegister; - ImrRegister = XUartPs_ReadReg(uartInstPtr->Config.BaseAddress, XUARTPS_IMR_OFFSET); - XUartPs_WriteReg(uartInstPtr->Config.BaseAddress, XUARTPS_IDR_OFFSET, XUARTPS_IXR_MASK); - return ImrRegister; -} - -/* - * Restores the interrupt state, saved from disable_interrupts - */ -void restore_interrupts(u32 intr_state) { - XUartPs_WriteReg(uartInstPtr->Config.BaseAddress, XUARTPS_IER_OFFSET, intr_state); -} - -void process_received(modular_structs_t *structs) { - // Parse as many packets as possible - parse_available(structs); - - // Disable interrupts while moving data around - u32 intr_state = disable_interrupts(); - - // Move unprocessed bytes to front of secondary buffer - size_t unprocessed_size = recv_buf_end - recv_buf_begin; - memmove(recvBuf, recvBuf + recv_buf_begin, unprocessed_size); - recv_buf_begin = 0; - recv_buf_end = unprocessed_size; - - restore_interrupts(intr_state); - //unsigned char in_fifo = XUartPs_ReadReg(uartInstPtr->Config.BaseAddress, XUARTPS_FIFO_OFFSET); - return; -} - -void uart_interrupt_handler(XUartPs *InstancePtr) { - u32 IsrStatus; - - /* - * Read the interrupt ID register to determine which - * interrupt is active - */ - IsrStatus = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, - XUARTPS_IMR_OFFSET); - - IsrStatus &= XUartPs_ReadReg(InstancePtr->Config.BaseAddress, - XUARTPS_ISR_OFFSET); - - /* - * Read the Channel Status Register to determine if there is any data in - * the RX FIFO - */ - - u32 CsrRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, - XUARTPS_SR_OFFSET); - - while (0 == (CsrRegister & XUARTPS_SR_RXEMPTY) && recv_buf_end <= UART_BUF_SIZE) { - recvBuf[recv_buf_end] = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, XUARTPS_FIFO_OFFSET); - recv_buf_end += 1; - CsrRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, XUARTPS_SR_OFFSET); - } - - // Clear the interrupt status. - XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET, - IsrStatus); -} - diff --git a/quad/sw/comm_dev/src/new_comm.h b/quad/sw/comm_dev/src/new_comm.h deleted file mode 100644 index 5ee760331..000000000 --- a/quad/sw/comm_dev/src/new_comm.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * new_comm.h - * - * Created on: Jan 2, 2017 - * Author: dawehr - */ - -#ifndef NEW_COMM_H_ -#define NEW_COMM_H_ - -#include <xuartps.h> -#include "xparameters.h" -#include "xscugic.h" -#include "xil_exception.h" - -#include "type_def.h" -#include "uart.h" -#include "mio7_led.h" -#include "timer.h" -#include "commands.h" - -int initUartComms(); -void process_received(modular_structs_t *structs); -void uart_interrupt_handler(XUartPs *InstancePtr); - -#endif /* NEW_COMM_H_ */ diff --git a/quad/sw/comm_dev/.cproject b/quad/sw/imu_logger/.cproject similarity index 100% rename from quad/sw/comm_dev/.cproject rename to quad/sw/imu_logger/.cproject diff --git a/quad/sw/imu_logger/.gitignore b/quad/sw/imu_logger/.gitignore new file mode 100644 index 000000000..06a1484bb --- /dev/null +++ b/quad/sw/imu_logger/.gitignore @@ -0,0 +1,2 @@ +Debug/ +bootimage/ diff --git a/quad/sw/comm_dev/.project b/quad/sw/imu_logger/.project similarity index 96% rename from quad/sw/comm_dev/.project rename to quad/sw/imu_logger/.project index bb5f1cfda..7fb0307b7 100644 --- a/quad/sw/comm_dev/.project +++ b/quad/sw/imu_logger/.project @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <projectDescription> - <name>modular_quad_pid</name> + <name>imu_logger</name> <comment></comment> <projects> <project>system_bsp_new</project> diff --git a/quad/sw/comm_dev/src/Copy of original lscript.ld b/quad/sw/imu_logger/src/Copy of original lscript.ld similarity index 100% rename from quad/sw/comm_dev/src/Copy of original lscript.ld rename to quad/sw/imu_logger/src/Copy of original lscript.ld diff --git a/quad/sw/comm_dev/src/PID.c b/quad/sw/imu_logger/src/PID.c similarity index 100% rename from quad/sw/comm_dev/src/PID.c rename to quad/sw/imu_logger/src/PID.c diff --git a/quad/sw/comm_dev/src/PID.h b/quad/sw/imu_logger/src/PID.h similarity index 100% rename from quad/sw/comm_dev/src/PID.h rename to quad/sw/imu_logger/src/PID.h diff --git a/quad/sw/comm_dev/src/README.txt b/quad/sw/imu_logger/src/README.txt similarity index 100% rename from quad/sw/comm_dev/src/README.txt rename to quad/sw/imu_logger/src/README.txt diff --git a/quad/sw/comm_dev/src/actuator_command_processing.c b/quad/sw/imu_logger/src/actuator_command_processing.c similarity index 100% rename from quad/sw/comm_dev/src/actuator_command_processing.c rename to quad/sw/imu_logger/src/actuator_command_processing.c diff --git a/quad/sw/comm_dev/src/actuator_command_processing.h b/quad/sw/imu_logger/src/actuator_command_processing.h similarity index 100% rename from quad/sw/comm_dev/src/actuator_command_processing.h rename to quad/sw/imu_logger/src/actuator_command_processing.h diff --git a/quad/sw/comm_dev/src/commands.c b/quad/sw/imu_logger/src/commands.c similarity index 75% rename from quad/sw/comm_dev/src/commands.c rename to quad/sw/imu_logger/src/commands.c index 4044ce995..97ed7720a 100644 --- a/quad/sw/comm_dev/src/commands.c +++ b/quad/sw/imu_logger/src/commands.c @@ -2,7 +2,6 @@ #include "commands.h" #include "type_def.h" #include "uart.h" -#include "packet_processing.h" struct MessageType MessageTypes[MAX_TYPE] = { @@ -38,34 +37,35 @@ struct MessageType MessageTypes[MAX_TYPE] = } } }, + // CALIBRATION { // Message Type ID 0x01, - // Calibration Subtypes (PID coefficients) + // Calibration Subtypes { - // yaw p constant subtype + // yaw setpoint subtype { // ID 0x00, // Command text - "setyawp", + "setyaw", // Type of the command data floatType, // Function pointer - setyawp + &yawset }, - // yaw i constant subtype + // yaw p constant subtype { // ID 0x01, // Command text - "setyawi", + "setyawp", // Type of the command data floatType, // Function pointer - setyawi + &yawp }, // yaw d constant subtype { @@ -76,29 +76,29 @@ struct MessageType MessageTypes[MAX_TYPE] = // Type of the command data floatType, // Function pointer - setyawd + &yawd }, - // roll p constant subtype + // roll setpoint subtype { // ID 0x03, // Command text - "setrollp", + "setroll", // Type of the command data floatType, // Function pointer - setrollp + &rollset }, - // roll i constant subtype + // roll p constant subtype { // ID 0x04, // Command text - "setrolli", + "setrollp", // Type of the command data floatType, // Function pointer - setrolli + &rollp }, // roll d constant subtype { @@ -109,29 +109,29 @@ struct MessageType MessageTypes[MAX_TYPE] = // Type of the command data floatType, // Function pointer - setrolld + &rolld }, - // pitch p constant subtype + // pitch setpoint subtype { // ID 0x06, // Command text - "setpitchp", + "setpitch", // Type of the command data floatType, // Function pointer - setpitchp + &pitchset }, - // pitch i constant subtype + // pitch p constant subtype { // ID 0x07, // Command text - "setpitchi", + "setpitchp", // Type of the command data floatType, // Function pointer - setpitchi + &pitchp }, // pitch d constant subtype { @@ -142,213 +142,109 @@ struct MessageType MessageTypes[MAX_TYPE] = // Type of the command data floatType, // Function pointer - setpitchd + &pitchd }, - // yawrate p constant subtype + // throttle setpoint subtype { // ID 0x09, // Command text - "setyawratep", + "setthrottle", // Type of the command data floatType, // Function pointer - NULL + &throttleset }, - // yawrate i constant subtype + // throttle p constant subtype { // ID 0x0A, // Command text - "setyawratei", + "setthrottlep", // Type of the command data floatType, // Function pointer - setyawratei + &throttlep }, - // yawrate d constant subtype + // throttle i constant subtype { // ID 0x0B, // Command text - "setyawrated", + "setthrottlei", // Type of the command data floatType, // Function pointer - setyawrated + &throttlei }, - // rollrate p constant subtype + // throttle d constant subtype { // ID 0x0C, // Command text - "setrollratep", - // Type of the command data - floatType, - // Function pointer - setrollratep - }, - // rollrate i constant subtype - { - // ID - 0x0D, - // Command text - "setrollratei", - // Type of the command data - floatType, - // Function pointer - setrollratei - }, - // rollrate d constant subtype - { - // ID - 0x0E, - // Command text - "setrollrated", - // Type of the command data - floatType, - // Function pointer - setrollrated - }, - // pitchrate p constant subtype - { - // ID - 0x0F, - // Command text - "setpitchratep", - // Type of the command data - floatType, - // Function pointer - setpitchratep - }, - // pitchrate i constant subtype - { - // ID - 0x10, - // Command text - "setpitchratei", - // Type of the command data - floatType, - // Function pointer - setpitchratei - }, - // pitchrate d constant subtype - { - // ID - 0x11, - // Command text - "setpitchrated", - // Type of the command data - floatType, - // Function pointer - setpitchrated - }, - // height p constant subtype - { - // ID - 0x12, - // Command text - "setheightp", - // Type of the command data - floatType, - // Function pointer - setheightp - }, - // height i constant subtype - { - // ID - 0x13, - // Command text - "setheighti", - // Type of the command data - floatType, - // Function pointer - setheighti - }, - // height d constant subtype - { - // ID - 0x14, - // Command text - "setheightd", - // Type of the command data - floatType, - // Function pointer - setheightd - }, - // lat p constant subtype - { - // ID - 0x15, - // Command text - "setlatp", + "setthrottled", // Type of the command data floatType, // Function pointer - setlatp - }, - // lat i constant subtype - { - // ID - 0x16, - // Command text - "setlati", - // Type of the command data - floatType, - // Function pointer - setlati - }, - // lat d constant subtype + &throttled + } + } + }, + + // REQUEST + { + // Message Type ID + 0x02, + + // Request Subtypes + { + // accelerometer subtype { - // ID - 0x17, + // ID + 0x00, // Command text - "setlatd", + "accelreq", // Type of the command data floatType, // Function pointer - setlatd + &accelreq }, - // long p constant subtype + // gyroscope subtype { - // ID - 0x18, + // ID + 0x01, // Command text - "setlongp", + "gyroreq", // Type of the command data floatType, // Function pointer - setlongp + &gyroreq }, - // long i constant subtype + // pitch angle subtype { - // ID - 0x19, + // ID + 0x02, // Command text - "setlongi", + "reqpitchangle", // Type of the command data floatType, // Function pointer - setlongi + &pitchanglereq }, - // long d constant subtype + // roll angle subtype { - // ID - 0x1A, + // ID + 0x03, // Command text - "setlongd", + "reqrollangle", // Type of the command data floatType, // Function pointer - setlongd + &rollanglereq } } }, - // HERE FOR SPACING - { - 0x02, - {} - }, + // RESPONSE { // Message Type ID @@ -479,15 +375,7 @@ int debug(unsigned char *packet, int dataLen, modular_structs_t *structs) control algorithm in order to get this to work. */ int update(unsigned char *packet, int dataLen, modular_structs_t *structs) { - static int on = 0; - if (on) { - MIO7_led_off(); - on = 1 - on; - }else { - MIO7_led_on(); - on = 1 - on; - } - processUpdate(packet, &(structs->raw_sensor_struct.currentQuadPosition)); + printf("function for debug\n"); return 0; } @@ -514,84 +402,7 @@ int response(unsigned char *packet, int dataLen, modular_structs_t *structs) // TODO: Erase memory leaks - -int setlatp(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setlati(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setlatd(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setlongp(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setlongi(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setlongd(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setpitchratep(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setpitchratei(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setpitchrated(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setrollratep(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setrollratei(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setrollrated(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setyawratep(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setyawratei(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setyawrated(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - - -int setyaw(unsigned char *packet, int dataLen, modular_structs_t *structs) +int yawset(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -633,7 +444,7 @@ int setyaw(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setyawp(unsigned char *packet, int dataLen, modular_structs_t *structs) +int yawp(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {0}; @@ -671,12 +482,7 @@ int setyawp(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setyawi(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setyawd(unsigned char *packet, int dataLen, modular_structs_t *structs) +int yawd(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -714,7 +520,7 @@ int setyawd(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setroll(unsigned char *packet, int dataLen, modular_structs_t *structs) +int rollset(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -750,7 +556,7 @@ int setroll(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setrollp(unsigned char *packet, int dataLen, modular_structs_t *structs) +int rollp(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -786,12 +592,7 @@ int setrollp(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setrolli(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setrolld(unsigned char *packet, int dataLen, modular_structs_t *structs) +int rolld(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -827,7 +628,7 @@ int setrolld(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setpitch(unsigned char *packet, int dataLen, modular_structs_t *structs) +int pitchset(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -863,7 +664,7 @@ int setpitch(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setpitchp(unsigned char *packet, int dataLen, modular_structs_t *structs) +int pitchp(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -899,12 +700,7 @@ int setpitchp(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setpitchi(unsigned char *packet, int dataLen, modular_structs_t *structs) { - // TODO - return 0; -} - -int setpitchd(unsigned char *packet, int dataLen, modular_structs_t *structs) +int pitchd(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -942,7 +738,7 @@ int setpitchd(unsigned char *packet, int dataLen, modular_structs_t *structs) // ------------------------------------------------------------ // These should be renamed to altitude! -int setheight(unsigned char *packet, int dataLen, modular_structs_t *structs) +int throttleset(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -978,7 +774,7 @@ int setheight(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setheightp(unsigned char *packet, int dataLen, modular_structs_t *structs) +int throttlep(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -1014,7 +810,7 @@ int setheightp(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setheighti(unsigned char *packet, int dataLen, modular_structs_t *structs) +int throttlei(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; @@ -1050,7 +846,7 @@ int setheighti(unsigned char *packet, int dataLen, modular_structs_t *structs) return 0; } -int setheightd(unsigned char *packet, int dataLen, modular_structs_t *structs) +int throttled(unsigned char *packet, int dataLen, modular_structs_t *structs) { float value; char buf[255] = {}; diff --git a/quad/sw/imu_logger/src/commands.h b/quad/sw/imu_logger/src/commands.h new file mode 100644 index 000000000..7861a84bd --- /dev/null +++ b/quad/sw/imu_logger/src/commands.h @@ -0,0 +1,72 @@ +#ifndef _COMMANDS_H +#define _COMMANDS_H + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "type_def.h" + +// ---------------------- +// Helper stuff + +#define MAX_TYPE 6 +#define MAX_SUBTYPE 100 + +enum Message{ + BEGIN_CHAR = 0xBE, + END_CHAR = 0xED +}; + +// This should also have double to avoid confusion with float values. +enum DataType +{ + floatType, + intType, + stringType +}; + +// MESSAGE SUBTYPES +struct MessageSubtype{ + char ID; + char cmdText[100]; + char cmdDataType; + int (*functionPtr)(unsigned char *command, int dataLen, modular_structs_t *structs); +}; + +// MESSAGE TYPES +struct MessageType{ + char ID; + struct MessageSubtype subtypes[MAX_SUBTYPE]; +}; + +int debug(unsigned char *c, int dataLen, modular_structs_t *structs); +int update(unsigned char *c, int dataLen, modular_structs_t *structs); +int beginupdate(unsigned char *c, int dataLen, modular_structs_t *structs); +int logdata(unsigned char *c, int dataLen, modular_structs_t *structs); +int response(unsigned char *packet, int dataLen, modular_structs_t *structs); +int yawset(unsigned char *c, int dataLen, modular_structs_t *structs); +int yawp(unsigned char *c, int dataLen, modular_structs_t *structs); +int yawd(unsigned char *c, int dataLen, modular_structs_t *structs); +int rollset(unsigned char *c, int dataLen, modular_structs_t *structs); +int rollp(unsigned char *c, int dataLen, modular_structs_t *structs); +int rolld(unsigned char *c, int dataLen, modular_structs_t *structs); +int pitchset(unsigned char *c, int dataLen, modular_structs_t *structs); +int pitchp(unsigned char *c, int dataLen, modular_structs_t *structs); +int pitchd(unsigned char *c, int dataLen, modular_structs_t *structs); +int throttleset(unsigned char *c, int dataLen, modular_structs_t *structs); +int throttlep(unsigned char *c, int dataLen, modular_structs_t *structs); +int throttlei(unsigned char *c, int dataLen, modular_structs_t *structs); +int throttled(unsigned char *c, int dataLen, modular_structs_t *structs); +int accelreq(unsigned char *c, int dataLen, modular_structs_t *structs); +int gyroresp(unsigned char *c, int dataLen, modular_structs_t *structs); +int pitchangleresp(unsigned char *c, int dataLen, modular_structs_t *structs); +int rollangleresp(unsigned char *c, int dataLen, modular_structs_t *structs); +int gyroreq(unsigned char *c, int dataLen, modular_structs_t *structs); +int pitchanglereq(unsigned char *c, int dataLen, modular_structs_t *structs); +int rollanglereq(unsigned char *c, int dataLen, modular_structs_t *structs); +int accelresp(unsigned char *c, int dataLen, modular_structs_t *structs); + +// TODO add in string to be read from the command line when sending a subtype of message +extern struct MessageType MessageTypes[MAX_TYPE]; + +#endif diff --git a/quad/sw/comm_dev/src/communication.c b/quad/sw/imu_logger/src/communication.c similarity index 100% rename from quad/sw/comm_dev/src/communication.c rename to quad/sw/imu_logger/src/communication.c diff --git a/quad/sw/comm_dev/src/communication.h b/quad/sw/imu_logger/src/communication.h similarity index 100% rename from quad/sw/comm_dev/src/communication.h rename to quad/sw/imu_logger/src/communication.h diff --git a/quad/sw/comm_dev/src/control_algorithm.c b/quad/sw/imu_logger/src/control_algorithm.c similarity index 100% rename from quad/sw/comm_dev/src/control_algorithm.c rename to quad/sw/imu_logger/src/control_algorithm.c diff --git a/quad/sw/comm_dev/src/control_algorithm.h b/quad/sw/imu_logger/src/control_algorithm.h similarity index 100% rename from quad/sw/comm_dev/src/control_algorithm.h rename to quad/sw/imu_logger/src/control_algorithm.h diff --git a/quad/sw/comm_dev/src/controllers.c b/quad/sw/imu_logger/src/controllers.c similarity index 100% rename from quad/sw/comm_dev/src/controllers.c rename to quad/sw/imu_logger/src/controllers.c diff --git a/quad/sw/comm_dev/src/controllers.h b/quad/sw/imu_logger/src/controllers.h similarity index 100% rename from quad/sw/comm_dev/src/controllers.h rename to quad/sw/imu_logger/src/controllers.h diff --git a/quad/sw/comm_dev/src/conversion.c b/quad/sw/imu_logger/src/conversion.c similarity index 100% rename from quad/sw/comm_dev/src/conversion.c rename to quad/sw/imu_logger/src/conversion.c diff --git a/quad/sw/comm_dev/src/conversion.h b/quad/sw/imu_logger/src/conversion.h similarity index 100% rename from quad/sw/comm_dev/src/conversion.h rename to quad/sw/imu_logger/src/conversion.h diff --git a/quad/sw/comm_dev/src/gam.h b/quad/sw/imu_logger/src/gam.h similarity index 100% rename from quad/sw/comm_dev/src/gam.h rename to quad/sw/imu_logger/src/gam.h diff --git a/quad/sw/comm_dev/src/iic_mpu9150_utils.c b/quad/sw/imu_logger/src/iic_mpu9150_utils.c similarity index 92% rename from quad/sw/comm_dev/src/iic_mpu9150_utils.c rename to quad/sw/imu_logger/src/iic_mpu9150_utils.c index a0611197e..e5915fa14 100644 --- a/quad/sw/comm_dev/src/iic_mpu9150_utils.c +++ b/quad/sw/imu_logger/src/iic_mpu9150_utils.c @@ -224,8 +224,8 @@ int get_gam_reading(gam_t* gam) { //Get X and Y angles // javey: this assigns accel_(pitch/roll) in units of radians - gam->accel_pitch = atan(gam->accel_x / sqrt(gam->accel_y*gam->accel_y + gam->accel_z*gam->accel_z)); - gam->accel_roll = -atan(gam->accel_y / sqrt(gam->accel_x*gam->accel_x + gam->accel_z*gam->accel_z)); // negative because sensor board is upside down + //gam->accel_pitch = atan(gam->accel_x / sqrt(gam->accel_y*gam->accel_y + gam->accel_z*gam->accel_z)); + //gam->accel_roll = -atan(gam->accel_y / sqrt(gam->accel_x*gam->accel_x + gam->accel_z*gam->accel_z)); // negative because sensor board is upside down //Convert gyro data to rate (we're only using the most 12 significant bits) gyro_x = (sensor_data[GYR_X_H] << 8) | (sensor_data[GYR_X_L]); //* G_GAIN; @@ -234,9 +234,9 @@ int get_gam_reading(gam_t* gam) { //Get the number of degrees //javey: converted to radians to following SI units - gam->gyro_xVel_p = ((gyro_x / GYRO_SENS) * DEG_TO_RAD) + GYRO_X_BIAS; - gam->gyro_yVel_q = ((gyro_y / GYRO_SENS) * DEG_TO_RAD) + GYRO_Y_BIAS; - gam->gyro_zVel_r = ((gyro_z / GYRO_SENS) * DEG_TO_RAD) + GYRO_Z_BIAS; + gam->gyro_xVel_p = ((gyro_x / GYRO_SENS) * DEG_TO_RAD);// + GYRO_X_BIAS; + gam->gyro_yVel_q = ((gyro_y / GYRO_SENS) * DEG_TO_RAD);// + GYRO_Y_BIAS; + gam->gyro_zVel_r = ((gyro_z / GYRO_SENS) * DEG_TO_RAD);// + GYRO_Z_BIAS; return 0; diff --git a/quad/sw/comm_dev/src/iic_mpu9150_utils.h b/quad/sw/imu_logger/src/iic_mpu9150_utils.h similarity index 100% rename from quad/sw/comm_dev/src/iic_mpu9150_utils.h rename to quad/sw/imu_logger/src/iic_mpu9150_utils.h diff --git a/quad/sw/comm_dev/src/initialize_components.c b/quad/sw/imu_logger/src/initialize_components.c similarity index 92% rename from quad/sw/comm_dev/src/initialize_components.c rename to quad/sw/imu_logger/src/initialize_components.c index 7ef4413b4..df1b3c86b 100644 --- a/quad/sw/comm_dev/src/initialize_components.c +++ b/quad/sw/imu_logger/src/initialize_components.c @@ -7,7 +7,6 @@ #include "initialize_components.h" #include "communication.h" -#include "new_comm.h" extern int Xil_AssertWait; @@ -92,20 +91,22 @@ int initializeAllComponents(user_input_t * user_input_struct, log_t * log_struct return -1; // Initialize the controller - control_algorithm_init(parameter_struct); + //control_algorithm_init(parameter_struct); // Xilinx given initialization init_platform(); - if (initUartComms()) { - return -1; - } - // Initialize loop timers - if (timer_init()) { + //disable blocking asserts + //Xil_AssertWait = FALSE; + + // Initialize UART0 (Bluetooth) + if(!uart0_init(XPAR_PS7_UART_0_DEVICE_ID, 115200)) return -1; - } - return 0; + uart0_clearFIFOs(); + + //Enable blocking asserts + //Xil_AssertWait = TRUE; // Initialize I2C controller and start the sensor board if (initI2C0() == -1) { diff --git a/quad/sw/comm_dev/src/initialize_components.h b/quad/sw/imu_logger/src/initialize_components.h similarity index 100% rename from quad/sw/comm_dev/src/initialize_components.h rename to quad/sw/imu_logger/src/initialize_components.h diff --git a/quad/sw/comm_dev/src/log_data.c b/quad/sw/imu_logger/src/log_data.c similarity index 100% rename from quad/sw/comm_dev/src/log_data.c rename to quad/sw/imu_logger/src/log_data.c diff --git a/quad/sw/comm_dev/src/log_data.h b/quad/sw/imu_logger/src/log_data.h similarity index 100% rename from quad/sw/comm_dev/src/log_data.h rename to quad/sw/imu_logger/src/log_data.h diff --git a/quad/sw/comm_dev/src/lscript.ld b/quad/sw/imu_logger/src/lscript.ld similarity index 100% rename from quad/sw/comm_dev/src/lscript.ld rename to quad/sw/imu_logger/src/lscript.ld diff --git a/quad/sw/imu_logger/src/main.c b/quad/sw/imu_logger/src/main.c new file mode 100644 index 000000000..1b3af90b9 --- /dev/null +++ b/quad/sw/imu_logger/src/main.c @@ -0,0 +1,90 @@ +/* + * main.c + * + * Created on: Nov 11, 2015 + * Author: ucart + */ +#include <stdio.h> +#include "timer.h" +#include "log_data.h" +#include "initialize_components.h" +#include "user_input.h" +#include "sensor.h" +#include "sensor_processing.h" +#include "control_algorithm.h" +#include "actuator_command_processing.h" +#include "send_actuator_commands.h" +#include "update_gui.h" + +int main() +{ + // Structures to be used throughout + modular_structs_t structs = { }; + + + // Initialize all required components and structs: + // Uart, PWM receiver/generator, I2C, Sensor Board + // Xilinx Platform, Loop Timer, Control Algorithm + int init_error = initializeAllComponents(&(structs.user_input_struct), &(structs.log_struct), + &(structs.raw_sensor_struct), &(structs.sensor_struct), &(structs.setpoint_struct), &(structs.parameter_struct), + &(structs.user_defined_struct), &(structs.raw_actuator_struct), &(structs.actuator_command_struct)); + + if (init_error != 0) { + printf("ERROR (main): Problem initializing...Goodbye\r\n"); + return -1; + } + + // Loops to make sure the quad is responding correctly before starting the control loop + //protection_loops(); + + printf("The quad loop is now beginning.\n"); + + char send_str[512]; + double timestamp = 0; + // Main control loop + do + { + // Processing of loop timer at the beginning of the control loop + timer_start_loop(); + + // Get data from the sensors and put it into raw_sensor_struct + get_sensors(&(structs.log_struct), &(structs.user_input_struct), &(structs.raw_sensor_struct)); + + + sprintf(send_str, "%f,%f,%f,%f,%f,%f,%f\n", timestamp, + structs.raw_sensor_struct.gam.accel_x, + structs.raw_sensor_struct.gam.accel_y, + structs.raw_sensor_struct.gam.accel_z, + structs.raw_sensor_struct.gam.gyro_xVel_p, + structs.raw_sensor_struct.gam.gyro_yVel_q, + structs.raw_sensor_struct.gam.gyro_zVel_r); + + uart0_sendStr(send_str); + + // Process the sensor data and put it into sensor_struct + //sensor_processing(&(structs.log_struct), &(structs.user_input_struct), &(structs.raw_sensor_struct), &(structs.sensor_struct)); + + + //if(structs.user_defined_struct.flight_mode == MANUAL_FLIGHT_MODE) + //MIO7_led_on(); + + // Processing of loop timer at the end of the control loop + timestamp = timer_end_loop(&(structs.log_struct)); + + } while(!kill_condition(&(structs.user_input_struct))); + + + stringBuilder_free((structs.user_input_struct).sb); + + pwm_kill(); + + MIO7_led_off(); + + printLogging(); + + flash_MIO_7_led(10, 100); + + return 0; +} + + diff --git a/quad/sw/comm_dev/src/mio7_led.c b/quad/sw/imu_logger/src/mio7_led.c similarity index 100% rename from quad/sw/comm_dev/src/mio7_led.c rename to quad/sw/imu_logger/src/mio7_led.c diff --git a/quad/sw/comm_dev/src/mio7_led.h b/quad/sw/imu_logger/src/mio7_led.h similarity index 100% rename from quad/sw/comm_dev/src/mio7_led.h rename to quad/sw/imu_logger/src/mio7_led.h diff --git a/quad/sw/comm_dev/src/new_PID.h b/quad/sw/imu_logger/src/new_PID.h similarity index 100% rename from quad/sw/comm_dev/src/new_PID.h rename to quad/sw/imu_logger/src/new_PID.h diff --git a/quad/sw/comm_dev/src/new_log_data.c b/quad/sw/imu_logger/src/new_log_data.c similarity index 100% rename from quad/sw/comm_dev/src/new_log_data.c rename to quad/sw/imu_logger/src/new_log_data.c diff --git a/quad/sw/comm_dev/src/new_log_data.h b/quad/sw/imu_logger/src/new_log_data.h similarity index 100% rename from quad/sw/comm_dev/src/new_log_data.h rename to quad/sw/imu_logger/src/new_log_data.h diff --git a/quad/sw/comm_dev/src/old_log_data.h b/quad/sw/imu_logger/src/old_log_data.h similarity index 100% rename from quad/sw/comm_dev/src/old_log_data.h rename to quad/sw/imu_logger/src/old_log_data.h diff --git a/quad/sw/comm_dev/src/packet_processing.c b/quad/sw/imu_logger/src/packet_processing.c similarity index 100% rename from quad/sw/comm_dev/src/packet_processing.c rename to quad/sw/imu_logger/src/packet_processing.c diff --git a/quad/sw/comm_dev/src/packet_processing.h b/quad/sw/imu_logger/src/packet_processing.h similarity index 100% rename from quad/sw/comm_dev/src/packet_processing.h rename to quad/sw/imu_logger/src/packet_processing.h diff --git a/quad/sw/comm_dev/src/platform.c b/quad/sw/imu_logger/src/platform.c similarity index 100% rename from quad/sw/comm_dev/src/platform.c rename to quad/sw/imu_logger/src/platform.c diff --git a/quad/sw/comm_dev/src/platform.h b/quad/sw/imu_logger/src/platform.h similarity index 100% rename from quad/sw/comm_dev/src/platform.h rename to quad/sw/imu_logger/src/platform.h diff --git a/quad/sw/comm_dev/src/platform_config.h b/quad/sw/imu_logger/src/platform_config.h similarity index 100% rename from quad/sw/comm_dev/src/platform_config.h rename to quad/sw/imu_logger/src/platform_config.h diff --git a/quad/sw/comm_dev/src/quadposition.h b/quad/sw/imu_logger/src/quadposition.h similarity index 100% rename from quad/sw/comm_dev/src/quadposition.h rename to quad/sw/imu_logger/src/quadposition.h diff --git a/quad/sw/comm_dev/src/send_actuator_commands.c b/quad/sw/imu_logger/src/send_actuator_commands.c similarity index 100% rename from quad/sw/comm_dev/src/send_actuator_commands.c rename to quad/sw/imu_logger/src/send_actuator_commands.c diff --git a/quad/sw/comm_dev/src/send_actuator_commands.h b/quad/sw/imu_logger/src/send_actuator_commands.h similarity index 100% rename from quad/sw/comm_dev/src/send_actuator_commands.h rename to quad/sw/imu_logger/src/send_actuator_commands.h diff --git a/quad/sw/comm_dev/src/sensor.c b/quad/sw/imu_logger/src/sensor.c similarity index 87% rename from quad/sw/comm_dev/src/sensor.c rename to quad/sw/imu_logger/src/sensor.c index b2f60c86d..26f1eba14 100644 --- a/quad/sw/comm_dev/src/sensor.c +++ b/quad/sw/imu_logger/src/sensor.c @@ -26,10 +26,6 @@ int sensor_init(raw_sensor_t * raw_sensor_struct, sensor_t * sensor_struct) int get_sensors(log_t* log_struct, user_input_t* user_input_struct, raw_sensor_t* raw_sensor_struct) { - // if there was a new update packet this loop then do the required processing - if (user_input_struct->hasPacket == 0x04) { - processUpdate((unsigned char *) user_input_struct->sb->buf, &(raw_sensor_struct->currentQuadPosition)); - } // ///////// for testing update period of vrpn data from the ground station to the quad // static int update_counter = 0; @@ -71,7 +67,7 @@ int get_sensors(log_t* log_struct, user_input_t* user_input_struct, raw_sensor_t // the the sensor board and fill in the readings into the GAM struct get_gam_reading(&(raw_sensor_struct->gam)); - log_struct->gam = raw_sensor_struct->gam; + //log_struct->gam = raw_sensor_struct->gam; return 0; } diff --git a/quad/sw/comm_dev/src/sensor.h b/quad/sw/imu_logger/src/sensor.h similarity index 100% rename from quad/sw/comm_dev/src/sensor.h rename to quad/sw/imu_logger/src/sensor.h diff --git a/quad/sw/comm_dev/src/sensor_processing.c b/quad/sw/imu_logger/src/sensor_processing.c similarity index 100% rename from quad/sw/comm_dev/src/sensor_processing.c rename to quad/sw/imu_logger/src/sensor_processing.c diff --git a/quad/sw/comm_dev/src/sensor_processing.h b/quad/sw/imu_logger/src/sensor_processing.h similarity index 100% rename from quad/sw/comm_dev/src/sensor_processing.h rename to quad/sw/imu_logger/src/sensor_processing.h diff --git a/quad/sw/comm_dev/src/stringBuilder.c b/quad/sw/imu_logger/src/stringBuilder.c similarity index 100% rename from quad/sw/comm_dev/src/stringBuilder.c rename to quad/sw/imu_logger/src/stringBuilder.c diff --git a/quad/sw/comm_dev/src/stringBuilder.h b/quad/sw/imu_logger/src/stringBuilder.h similarity index 100% rename from quad/sw/comm_dev/src/stringBuilder.h rename to quad/sw/imu_logger/src/stringBuilder.h diff --git a/quad/sw/comm_dev/src/timer.c b/quad/sw/imu_logger/src/timer.c similarity index 76% rename from quad/sw/comm_dev/src/timer.c rename to quad/sw/imu_logger/src/timer.c index 7d5f3b11b..6e18b825f 100644 --- a/quad/sw/comm_dev/src/timer.c +++ b/quad/sw/imu_logger/src/timer.c @@ -5,26 +5,24 @@ * Author: ucart */ - - #include "timer.h" XTime before = 0, after = 0; XTmrCtr axi_timer; -float LOOP_TIME; -float time_stamp = 0; +double LOOP_TIME; +double time_stamp = 0; -int timer_init() -{ +int timer_init() { // using a axi_timer core because we've had problems with the Global Timer - return XTmrCtr_Initialize(&axi_timer, XPAR_AXI_TIMER_0_DEVICE_ID); + XTmrCtr_Initialize(&axi_timer, XPAR_AXI_TIMER_0_DEVICE_ID); + + return 0; } -int timer_start_loop() -{ +int timer_start_loop() { //timing code - LOOP_TIME = ((float)(after - before)) / ((float) COUNTS_PER_SECOND); + LOOP_TIME = ((double) (after - before)) / ((double) COUNTS_PER_SECOND); XTime_GetTime(&before); XTmrCtr_Reset(&axi_timer, 0); XTmrCtr_Start(&axi_timer, 0); @@ -32,8 +30,7 @@ int timer_start_loop() return 0; } -int timer_end_loop(log_t *log_struct) -{ +double timer_end_loop(log_t *log_struct) { // get number of useconds its taken to run the loop thus far int usec_loop = XTmrCtr_GetValue(&axi_timer, 0) / (PL_CLK_CNTS_PER_USEC); @@ -57,10 +54,9 @@ int timer_end_loop(log_t *log_struct) // used this to compare to the PS clock to make sure the timing matched // float axi_timer_val = ((float)XTmrCtr_GetValue(&axi_timer, 0)) / ((float)100000000); - // Log the timing information - log_struct->time_stamp = time_stamp; - log_struct->time_slice = LOOP_TIME; + //log_struct->time_stamp = time_stamp; + //log_struct->time_slice = LOOP_TIME; - return 0; + return time_stamp; } diff --git a/quad/sw/comm_dev/src/timer.h b/quad/sw/imu_logger/src/timer.h similarity index 84% rename from quad/sw/comm_dev/src/timer.h rename to quad/sw/imu_logger/src/timer.h index dbd719027..48d15f7da 100644 --- a/quad/sw/comm_dev/src/timer.h +++ b/quad/sw/imu_logger/src/timer.h @@ -15,11 +15,11 @@ extern XTime before; extern XTime after; extern XTmrCtr axi_timer; -extern float LOOP_TIME; -extern float time_stamp; +extern double LOOP_TIME; +extern double time_stamp; // desired loop time is not guaranteed (its possible that the loop may take longer than desired) -#define DESIRED_USEC_PER_LOOP 5000 // gives 5ms loops +#define DESIRED_USEC_PER_LOOP 6000 // gives 5ms loops #define PL_CLK_CNTS_PER_USEC 100 @@ -51,6 +51,6 @@ int timer_start_loop(); * error message * */ -int timer_end_loop(log_t *log_struct); +double timer_end_loop(log_t *log_struct); #endif /* TIMER_H_ */ diff --git a/quad/sw/comm_dev/src/type_def.h b/quad/sw/imu_logger/src/type_def.h similarity index 98% rename from quad/sw/comm_dev/src/type_def.h rename to quad/sw/imu_logger/src/type_def.h index 15db8f9eb..55dca9e8f 100644 --- a/quad/sw/comm_dev/src/type_def.h +++ b/quad/sw/imu_logger/src/type_def.h @@ -8,8 +8,6 @@ #ifndef TYPE_DEF_H_ #define TYPE_DEF_H_ -#include <stdint.h> - /** * @brief * The modes for autonomous and manual flight. @@ -28,11 +26,11 @@ enum flight_mode{ // bytes|| 1 | 1 | 1 | 2 | 2 | var | 1 | //---------------------------------------------------------------------------------------------- typedef struct { - unsigned char begin_char; - unsigned char msg_type; - unsigned char msg_subtype; - uint16_t msg_id; - uint16_t data_len; + char begin_char; + char msg_type; + char msg_subtype; + int msg_id; + int data_len; } metadata_t; diff --git a/quad/sw/comm_dev/src/uart.c b/quad/sw/imu_logger/src/uart.c similarity index 81% rename from quad/sw/comm_dev/src/uart.c rename to quad/sw/imu_logger/src/uart.c index d4bf4ed44..c45aa1c97 100644 --- a/quad/sw/comm_dev/src/uart.c +++ b/quad/sw/imu_logger/src/uart.c @@ -16,7 +16,6 @@ // Global PS's XUartPs* _Uart0PS; XUartPs* _Uart1PS; -static INTC Intc; //This is copied from xuart driver /***************************************************/ @@ -195,71 +194,6 @@ char uart_recvByte(XUartPs* uartps_ptr) { // return buffer[0]; } - -/*****************************************************************************/ -/** -* -* This function sets up the interrupt system so interrupts can occur for the -* Uart. This function is application-specific. -* -* @param IntcInstancePtr is a pointer to the instance of the INTC. -* @param UartInstancePtr contains a pointer to the instance of the UART -* driver which is going to be connected to the interrupt -* controller. -* @param UartIntrId is the interrupt Id and is typically -* XPAR_<UARTPS_instance>_INTR value from xparameters.h. -* -* @return XST_SUCCESS if successful, otherwise XST_FAILURE. -* -* @note None. -* -****************************************************************************/ -int SetupInterruptSystem(XUartPs *UartInstancePtr, u16 UartIntrId, Xil_ExceptionHandler handler) -{ - int Status; - - XScuGic_Config *IntcConfig; /* Config for interrupt controller */ - - /* Initialize the interrupt controller driver */ - IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID); - if (NULL == IntcConfig) { - return XST_FAILURE; - } - - Status = XScuGic_CfgInitialize(&Intc, IntcConfig, - IntcConfig->CpuBaseAddress); - if (Status != XST_SUCCESS) { - return XST_FAILURE; - } - - /* - * Connect the interrupt controller interrupt handler to the - * hardware interrupt handling logic in the processor. - */ - Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, - (Xil_ExceptionHandler) XScuGic_InterruptHandler, - &Intc); - - /* - * Connect a device driver handler that will be called when an - * interrupt for the device occurs, the device driver handler - * performs the specific interrupt processing for the device - */ - Status = XScuGic_Connect(&Intc, UartIntrId, - handler, - (void *) UartInstancePtr); - if (Status != XST_SUCCESS) { - return XST_FAILURE; - } - - /* Enable the interrupt for the device */ - XScuGic_Enable(&Intc, UartIntrId); - - /* Enable interrupts */ - Xil_ExceptionEnable(); - - return XST_SUCCESS; -} /************************************************/ /************************************************/ @@ -278,11 +212,6 @@ XUartPs* uart0_init(u16 deviceID, int baudRate){ return uart_init(_Uart0PS, deviceID, baudRate); } -// Initializes the interrupt system for UART 0 -int uart0_int_init(u16 UartIntrId, Xil_ExceptionHandler handler) { - return SetupInterruptSystem(_Uart0PS, UartIntrId, handler); -} - void uart0_clearFIFOs(){ uart_clearFIFOs(_Uart0PS); } diff --git a/quad/sw/comm_dev/src/uart.h b/quad/sw/imu_logger/src/uart.h similarity index 91% rename from quad/sw/comm_dev/src/uart.h rename to quad/sw/imu_logger/src/uart.h index 838fb7635..50d468962 100644 --- a/quad/sw/comm_dev/src/uart.h +++ b/quad/sw/imu_logger/src/uart.h @@ -11,16 +11,11 @@ #include "xparameters.h" #include "xuartps.h" #include "stringBuilder.h" -#include "xscugic.h" -#include "new_comm.h" #define PACKET_START_CHAR 2 #define PACKET_END_CHAR 3 #define UPDATE_SIZE 28 -#define INTC XScuGic // Interrupt controller type -#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID - extern XUartPs* _Uart0PS; extern XUartPs* _Uart1PS; @@ -52,7 +47,6 @@ char uart_recvByte(XUartPs* uartps_ptr); /************************************************/ /********** UART 0 convenience methods **********/ XUartPs* uart0_init(u16 deviceID, int baudRate); -int uart0_int_init(u16 UartIntrId, Xil_ExceptionHandler handler); void uart0_clearFIFOs(); void uart0_sendByte(u8 data); void uart0_sendStr(char* data); diff --git a/quad/sw/comm_dev/src/update_gui.c b/quad/sw/imu_logger/src/update_gui.c similarity index 100% rename from quad/sw/comm_dev/src/update_gui.c rename to quad/sw/imu_logger/src/update_gui.c diff --git a/quad/sw/comm_dev/src/update_gui.h b/quad/sw/imu_logger/src/update_gui.h similarity index 100% rename from quad/sw/comm_dev/src/update_gui.h rename to quad/sw/imu_logger/src/update_gui.h diff --git a/quad/sw/comm_dev/src/user_input.c b/quad/sw/imu_logger/src/user_input.c similarity index 100% rename from quad/sw/comm_dev/src/user_input.c rename to quad/sw/imu_logger/src/user_input.c diff --git a/quad/sw/comm_dev/src/user_input.h b/quad/sw/imu_logger/src/user_input.h similarity index 100% rename from quad/sw/comm_dev/src/user_input.h rename to quad/sw/imu_logger/src/user_input.h diff --git a/quad/sw/comm_dev/src/util.c b/quad/sw/imu_logger/src/util.c similarity index 100% rename from quad/sw/comm_dev/src/util.c rename to quad/sw/imu_logger/src/util.c diff --git a/quad/sw/comm_dev/src/util.h b/quad/sw/imu_logger/src/util.h similarity index 100% rename from quad/sw/comm_dev/src/util.h rename to quad/sw/imu_logger/src/util.h diff --git a/quad/sw/modular_quad_pid/.gitignore b/quad/sw/modular_quad_pid/.gitignore new file mode 100644 index 000000000..06a1484bb --- /dev/null +++ b/quad/sw/modular_quad_pid/.gitignore @@ -0,0 +1,2 @@ +Debug/ +bootimage/ diff --git a/quad/sw/modular_quad_pid/bootimage/golden_boot.bin b/quad/sw/modular_quad_pid/bootimage/golden_boot.bin deleted file mode 100644 index bf165f708a501bd7b3960143f1728c05653568e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302804 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]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 zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy 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%0DTM1ka!ej6ZR$|ZBpDG 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 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS 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%0DItR^mnE5d3RMOad_lVePOb~12kF08X8v3V&4f={ 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Ⓢ*an>qs%1Iih$<Q#s&_{WZR^a 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�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%0D=U4lv30fknvNfzBU@_XB^d~(hj7=ip3yk2+n&;y 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 z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} z0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq z5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH* zAOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8}0TLhq5+DH*AOR8} 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 Ueq^K*f8s5V314{B-ca*@0!2t;zW@LL diff --git a/quad/sw/modular_quad_pid/bootimage/golden_boot2_fixed_pid_and_mixer.bin b/quad/sw/modular_quad_pid/bootimage/golden_boot2_fixed_pid_and_mixer.bin deleted file mode 100644 index de6a36b0e337292ebd378769fcdff8154849520e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302804 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]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 zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy 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%0DTM1ka!ej6ZR$|ZBpDG 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 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS 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%0DItR^mnE5d3RMOad_lVePOb~12kF08X8v3V&4f={ zxJU!+v<&-){QD#wS+u8wI0)dP5~B`vm-5Ce%nSto4jPQY_gL`Vl~}zSCt0~|GJH2> z!zW!{b(d&}-)I{c2uGW`#L2hjl<R$J$3|zTTtnByuU_6s{;T#J&TY^yrWxY9WB6v1 zpVLX`8;Y9Z3uNkqpR67~&XayX?=!?5w8x1P?h9)0jdxDF?XvKT2#2Sq?kwt5oTK$! zxt@ai4zRWG2_N!wfs=B^LB{b%J-c1Bv`dB!lfD=hMj&T6K(yPxRrqA^)O{i@h2CX; z70!J`1K8v3zZRcN_x4FjpX?Y6J_)uD9plSWHxIxkA9P<^(a^c6Ff^^!8Ye0=3#SCW z+)W-Q|E7AsOA2XM$H_Y%|N4RUqj~S>zx_q;X&Yqs<D}hQZ=9UOM?5%A!q*?e9QKSK zC-_<$4*OH@55AIFuFJVf|1~X3?mO`QChOR1oS=JoIDWZLZ1OmHXP4d@eDW+y$2fWX z>m1FYCjG~uL&-R?Az!=aI2j*zGIp6h*^$>QlpW@-N3Xwm06sawaT3Nhzn52lO~?5N zX3VDY)mkjb>lJItfiL?Mv7hlGIqkCPFMIkYef;}Ae#oDexw35f8li`mT8DCqn*6jR zc?RPq?1Ixf^-KAYvLdrL@?}-1L_(*nGqe!oXk2Fj5Bf}v2fS-t>vG{FsFpoP8#sBc zfINdSN`2ZpZP|0{aoE53b@H*F@pqm4Lnqud=|hjWd=EY5s`=38LnrX`|KR0k9gcar z0<tfX6kkq-*$esCujtBI`q8dr66KVvldC&PCCbuYIHcYKlHqC_LzcQ6=v{pm<ZVb) zV+}LY)B?su+C_m1jFgI`deY{(_+$;RYVdQ1Tu&jIL##}m?(DZ3yzcD`eXX2ZJ>SE` z7|&1?z}HAF3j(c(t<=J>Tm({ggp%}8xSX2}REpK1<OdC&A-_Z;N&tz}5@#GG<ClYx zlnWhk3Lnxl$U>U&AvsOK0)??rbHbOTGR&YADNIR_??yu%gkN-1X6GM3GjK_ls5d<p zfv!R28v<U!xHzm5Bt{L9BX@?{lM)knp5n`e`Lv42M1|v`GN6!17<Umv@{>8na;M&r zN(eZG3Ub#311^3&dY%SX_>eJ@_Cb(O%S1^B4iR2em2p>jazYJVY)BFabfv7PR3qX4 zSKLGB3G9nSnZ&w5QSU;c$b}q&2(J+Eipp}L$6`@X37qa@B?_BM>Zc1D8`7cK_tZj4 zBc}$+UjU7SmcN2d8bC`p0mUvQs870xk0LxFFP%7lIRR;c_CKZ_L?O``{~uj$JLyib zH8hmUuV*ZB!HS;A6XAM|!)Xi3rRAJ(ky&xX=A#w~&!VdeRYl5xUI*g{nvp>nh6w=E z0SungEkYxg5oxj}4M*@4lK{;CFl_T9hLM`2kO!m?i=cw{$*}Z^8CHuPZzuwOfZ33! z#KQkyOV^AQZnYkc6?WKE1#Q!tCLA@&gNvfD*3N1chZ*+w4xsT9F>vk%$iz<0dU5UJ z5Or!YWN8M$aTX1pfz6ytlL^NH5rr97MNF}{4>vQTVLdIgtpbRlaApou$7)rB$qdmp zWoMMKSW2RCx5tu-?jpkMRsbj_7zuj>R_HGDB2RTWdo_+18|t_C6$|XTdj%p`;)2lE zOk%+$b(9={uVUWI9JL-UgP={W%C)g1R5d@BFlx9=yE~T1muE1>%vx)d0nw=0*s7MO z5fl_)Sk`CpK$q1vIE@{TKZO|l591b^S^?3haif|o#43h9i{s&<!v73-Tm%goVx_R^ z!}S{@Gd1M6>W5(Pi({txhX3@^9-;=OGgxJ16%@h_NY^DHA|NFiU@@dhkR#grV>XGC z5fvxE1vtO~Xj=&qo($zKVG=-hN-=`f0*ouML?9=qFEaoVqbwrSKf(K<K};lRBa4-K z26xiHO?F#$I=f9JRu%-96)XyY<Pw}?kQ?*BIHCrAQZ>d3IZR?zGgCu`ilce(Y|4z} zvLhRb89+`dfute6HvC20ou6V-MfGcdQfm~TScO`ZEMp?CJ2Dj%-RWyc+fokS#++i9 zqA?vr7N)?6C@7#8twO3mLLR3dOM$FaUOg?&o~^}r$7nphioho70p>DXYa6Tkkpyl? zqS@h5{9=P+5Mq2%0k$uJE~WEaj^>N42zcaB`FmQqz;;&6mO5X88MABSLKceze-6rC z2_1xNHrhko<HD+054~KVUVlyDDv_U%%DX6w;vyW$jC8CTmNZ(}lWn}BEQ*6nycEyz zDN=0JWP>z?8A?`Xtf&!WNYrpVgaH)uFqhyo9g#0gBR@1)=JjALDf}@KFqDwl&Ee~X z|D(%2$RW*pxdcmP1TCZ4r6nX@fuv^75>q5;MvWgPZ`o~9@GX;8Lio=Rb0;!P0gQwQ zM2~iuK{V%*3^f%CAEqk-OzJS#5=*QleM5vBWF{?YLj5i3Xe{dDKOyq9Uxa94M?vDM zedLJo`?fMleFAA^wPK}~maI``+Z_4uCglhmL?O+jV!poMp4z&4mkDYOt0|=xdSc_t zD@aIXC88y#gcJ4Eb4dv`LyRTHoXQc~qeyoF>)Mz`Y%oFlpFu1zU>F&-Q(~qAz#$gE zoap7~$`aH1%9<ATd&iM7E!9FhVPNx<xEt^&WWZJ9Sz~qub-T#yj9cT7G-?Q(B{dhT zRs*G}#7es`Y7`Rj3Q%4^9+L`MNUB)27J%--rHsdL9@h*0VxSvmh(v2qSc@&eE*<<d zi#JHrz)(Qhyn|HO1{k%`sNo9`N%fE{9SU3lH%^qrAKGn5Gc1?jBg1|^2ONnUq;ffC zVLluTJYY4rq!DDGlZplUn#ANmJX*s=#Di=eHL^0ZiOI-Ak^=)L4DmL#9V}90vSP}( z6my|L1ss#QQPMykVO7E7qF>N;gIkNMnp}2SE1aYN%GN^d$|YClu0&ag^Vbc0J}Ywu zeG~MS6-q`}g5#$;cL~P_#>dc5t`CeNoWzn34sB@xARC0hmayJ=i9G&Rl~p!dRqRQq zj=?z+yVOLg?$^4N-t^$olGCwj$8p}3S{qw+bQxpHT2%0J$OwNK^(}ksn2mz>QC6d| z1cd??p_Y`2XW8V$A?t^~Kinz9dM?={%g<zVs)qBj3VB;3(V>7bqX6wH^_DnPjk85M zu3Ey?j>XUxNv2jnFjdmpSd4Yt=vo>TkjL`Koa7gLvnvL8re@W}sNU4vP4=eSMBUt6 zg6fQnrL*_zMrt$l3Dhey+gobyNQ|b;-Gn@Ei)S?|Gd8ZZ!NT^8yPKrf(1pIe25ZyV zL9n`741ZH#fR6KP=NVi@p&I?cMU}mCF3)Y*F|9F#SqA<ArgzUJ8=b&CGiN<r4w7?d zSk1Pq4{2honp<D4EMaZR`r*Wo!;dvUtnr`iRk0bwvX&$ro{iF%7#>M>t8rGgsk1b0 z#@Snr&P<G{y(t>27fqbZWa>58+;YvkK7eMV>PF1$1JpNzg@{=LC(n3$5(*lD`&#i_ z3g;ygd4nfl3APh;AYjULfChmj)$^3Kqn1}tl|m0va%D$uj3%RkMkDMBQg$R=G_PM- z5Op$!S~?sf;^jP3w53wEoPGVYv;lsBHCO~=rPVT)Ye8Q$l%=!T=b(1twnbh-jLd8^ z7ulWY_3`}6A*}QjW^4#~u37x{MX|C!Z<;1mQ>exv)Ff5QmqZ_(uuz=nmky?!>;3Ne zQJpq4OH$DQ%LUlo&h*YCLc$11q&`9u(mKI+@s+(g=%u4tjaoX!fjlzM9_bq4)|9VR z4>sxzj_Kf*bA1}GE<nZ0qz?IR1Y{_`fK8T#!E_+U+divwq)mijyqGS>@kg;)GMz9w z9ZKJ*mC4kD(IST#tT~fLe0f!t4(es4m3>zl#fMOxWfe_gw1B0CEd-IEI!Pt?KsUbD zwv8xm3~(#}Ckuu9h$t`{NRF{q_+Luzk;vs-iB6X%qSwIL-GRFd1@e3ya;aW{hIK%r z1YDJ$5=ghH<;))NgmE8ZHgWsS<d};VvBDg{*-p7#hJ&3ufpzk1u-MiRj~P^8{T5Zk z`$n$mV#j!#8=jAI#BB&VYwfaodS?@QW!O-u5H`IQ51<9sH4yz7{n)tYwgwhnMbG95 zy3iNRl*RU*MYsucf_rI{c*GI%u&Y(NSTWDA;l!WfDAom%1s>V@g#-hoYgPMIuo-d} zLCH|)%@aW4t5O`)AIKI)A55njL%(`UGGJo$R6Kj{3H9b#{rLs`;43CyqP}`l_P~v| zHPwRyYG!WIESUwZuT3KTxAFGDnas>C?#1a=Z1$>TB)(}F8lf586;9SeWBlB7l8$h| zCEQ%t#L*+~X+s#5ZhGOW8QlQV7d&-grx<SV=+XI$Z{)xY1)$Ki`$8;|LA;{WG_db2 z*HmFu5xjrV7}a;(eP+vRQhkMByr+Qt>>_$$7PkwNY)`zXkM2!ZV|DxTC-C)ia}|ye zQ`!9{ep|FMko;LZ+=%SXXj$KNsP)Lc=$d5c9oCwwTIqsn?Rq0_m8r=&e*AVX3_QGZ zw}L<L<^<5=xg_4LjG9Hs-1m<g|8NLj+5&(f@J|a8#B@!UUO&9Civ{9qTcfwf-wwz4 zSS>C>ZSQe|kBs62;<P#};(SvnxS^~uP2KD`SU}d-UE~*4OQTsvDO<_EE<$@?W!9(~ z!fQ!XV?m`8c=N>myO%%SxZvl1ZU0?g_~_j`zW!^sy!RKrvFEMNeCzIePb`1%t^f7^ z-T%R#di480{%8O8mi=G)%b$4qkAMB}y?^xIf8woQeg2jYKKE-2Kk=>S_iz8mft%kr zdvNc4`*;1w%-wrOFWY|0rLSxxNxExvIF9d+@3`!;?~ms6-gMWl9dOmaXsqtM!07!j z0*6yPl=0NKp%&7i3GBH8y+4@hGEVm2_pz()yYcxS=Bc>Y3_eLGv&mi>vC}b48+b6n z3xF;@+1qF>zNI<7zE9HDU9(bm+pDN<bUQSc3{1Y7H@JsJ=@Si~3^w7Dp^v?9;ZLr; z`K~X1{O()+<SVz__mltmmfN1W@$mEi;ZN?n`&a(k{(C<Dl_Lk>lVADIfBJ#9E`RZv zJO11AM{aojh9l2E{A=%d-7mo>fAmK`GQ0O5@10zD$M?VcO?yX2MsB(MmGK1)wX3n6 zKDlfA#oxDcF4>Q{>m``ZqO0JO3sHacOtBm0F1(QfBUTM1QP#gto+!N!GBo&#Yyb4B z`)+^!z1Z9+{^mHDOq)IDuAwX$N_XtyG~3H3w>58C-zRsa58SqQRqx%{II(spF_F%< z>4sLgn0u&({F;MUU5%xgZFTwfIoZ*o)HDDW_fuRr`<0!?+b3kn<p5|;t7h|L`!VdH zJE@Mh-MVdu@5?vVwcBprW4ry_bJbEE)^302JKgB((ROtaxE^&nd9$AiJ>Q+gcM%3D zj^8|o!>f7?@^u5Y`%Ho#nw@uAu?m1b;g80CrtN&PV+VI9wcB56JD*&CJ=XxY)ym1` z<5+FperkGZsy(!C-^y|Nq`hPL#Oeunsl9rF_&(JhbgN|%0vFv~ee#_)c1E58{B@UW z#vN$I4&Rdsm8MA6Qa59QqfdI-e%klbTDDC?aTgsnqg|`e{-(p}lSdz=PguieV(*iu z+wHIHd<7`e(<cvbL9|`9EA8R-<4;Xvl{kE2mzlr419YU?ZHL1r>KUwORtoE>AM^1e zjOzfOJXxppga1+26(!ge(~;Sj4w5IZpB{e^eS&J77~;uS4P0+l>Hr$UYsy%9%`@@k z+Yh714XGw@?~~>Z_y^<R<WpEWG%($6KdlZNaO2`6#?Q)e%DZtxpSY3vY}@U7e75~a zSD&=oPd-_zQeWt|yG&lwsME=g>lV{fALlOmq`r?aWau@10)I2&vQKb|I5X=m(r3qU zHk?eUHRDn6uPDitan>!@XZ>5beT8#+58RWB{DH7e{N^tAR=AH5mqPRFWbI)0I$L&h zURPD``F5UOuLhlSA<<7v{XEwRfP%s^sSLMMSg?=z0zNg!TgVc7xiOo)f0s%wf!y7Y zAH?3h9}75j3f&cPcPK;X2J)mExBszJt`qA;FDvPi{-p~$iKvshq}t3*p*jUO{W9e1 z2A)o{RosR)^n!|9FQGt({&$T6X+OKKNg8$x?K{xC`s#iAZhuev<|7C8U47y=?>IO; z{q}>`9Xx(w`rX&P{ls+#50WxHy<<mPef;qw*WYv9$v?mD;M))04*HSnkLYilJb2wN z9_Q@W&aU3qY;wEWbAFBr2d=lgB}v*RFTHf1??IyN<c>>u{3^rKPrv3hZ8_5@Q+ub= zF7xpC`0?Y@YJ5-cTpQzPP5I6l?C^M1&zA;=aZXxqQB`Iw48Ax(etXB$FyZv{zJ15{ zsYmR}@voow<O#sr-+tY7NZ)bYbtmpPc#xD6C-Am|_MKC9_2kKuJFdI#?QcJR{KN?y z)Bo)4Z$Ai-^E3G5z=5atwcC%h)gz+cSK^)TeC8SMN8NYW5#Zn*z&m`>ZomHZ2byns zlh3wp^o}kP5077uBg*)DyRc4)<b2YZweF=a4ZeDO2in*v*)PTIz~{bLj+4)S{`U8% z1=HL&eH})`yD<u`JGgK9-54joIsIDTuh{X{ecwC%x+^ajNQeL4b(ihnIH51~)b&%q zuG=r?o`0pTMhquo{JHCpaDvNmvO{5<_;XZ_6P$Tp8m@;ztp^7;Hcn3B!nY2G56d`t z{c4?Y8u(C`tC#vX8I*C-?s_KJSJ5;a;H2{71U_m1%SXR-{KOs8pZvKyoKLR4<Bsdz z{>kazIWax`?UP?P{>LXC`}cqM+%r$@*nx2ZiJ$(tPyXDWJ-+&QF;3_coQFX(X0qp~ zKh%)pgjYYgPcRPxy_Dy9RoK`#dHmvPZeq_I-hs`n<40CaC+}1#U8cy6+3ZVS!rax~ zdFnnn)ykcrd@JkdwcYpz3oYMSIc4c4wMjI+NqWv7HC<0+K>Yb$Yq&SP>E*N4O;>*E z3d_|prn{aw^xJTfXho#R#bpZx7V>ve0;gMClm3J9v#T1fS{9ef6kv)ZE;@LMUI69F zvTDu>v!EHl<?bm`vBxAb2$!g?Lapixib5<IHxTGvvZfcK8{G+at3xj}x|^C#+T|CE zg091;Q#w$p_a_6j7I)kUsPf6C-T6E~3kz7u5g{335s|wZptuYq0dfD1zoAe=y04a( z>hQL_1g;@QekjS*mrK+<SxKx_j?<KjzsrA+?-(hiJ%WOJDeL3z5tnML1zZY(yG>9S zHZd!o!&Ng(3f?+YR@*yf%azGJSS~ZJNR&C7mJZ{Am9`yPT~h+tgv6=EH@j?ht=y)A znN}yV4t|;7`j~4{p(*!-3=P*Lj6NBF_5Ca%7xQp)nh1p=BvaV37Krs&YoWLh4@~^g zfyKIx!b)<ux*;3nKy*+lkqxPOKtz_kq(mB;>cA3;e6GB*j5Cu^t_c1o=IK7NIYA^( zEs!Ub^{gmBTB*q>+8e4>wR*u1DKxEUU0rttFNu}gsZ1fY9MX6nuH|7%@~|kReWs7X zbN=a!*T_|O94`rec)X9F0OYMCLYD)<X)%s2%#P|W`&^!Tvio}^$aPDhyc|1JC<vtR zeKsVQgky6#O1fVl9kYoo<qhO&MM7&F*XBY<&<>US0SPe#;7?~RUCOCpvodJNkgqY$ zu{u$dj$x)`(<r%w-)>n@7j&gui~@N%Y#_Iv`J+itRVuG@L*_BA%P51dnAVQSPf=07 zM;)<u_|M$MTxgvLB6|hjh`vygbqUsl52RfigWZCVD@Nz26jWeqrKp%tt*E1|A7TO| zFvKDsSz!#PTGZ8o#^0=e*2iUElmjiAg}4?ugA{*JgU&#T)#198Xg3n<BFI7r)pQt$ z!4QtnJ)F;<pP23fU8$D!_kc>S0akb}^hs;bL`gH~r;?Dye-5UK0;47Hh-!V{n4lxC z^yQ|0OIFo(#;?*r-E?UJ2Rf!kK#^Phth#?9o~hlnW}p<vacwc<0FD~4p79%UpY#*~ z!&g~*86%yfp22f-ADPh5)VThf_vxmHS_KF)5fMNxBbbrU^+})Xh*(~AlTk%PmyO~q zWFeq6_t>Po;uFv)S)($pe54l*=vsc0GIBVe$QA2HRx0k5M<5G$&)}M`>?8V4lg~W4 zED7D=n-!m!?n0nObvFcKN{*@}=e!n!SW8;!?viM>4&pRtXC3LnkddhXCM4h^X)*(! z-Q-MNNcqA+fTS}guO^h8Jc_4UC;~LSN6g35irBzv_)!u|)&MjnRxnO#$U#DDJVGAO zw8W4_-821tuUu4sNqn7-RY7GWpVN_7jv|`DWZ(-%N>}*!%Y@8&)IsM29uf&!!dg(z zipmzi6}jk>lhS-9@k{kiZ4ig8oJdx{DbxjxNmHOq<*00nTf`Twd(^H{XU(jDEFINa zV{tr+y2wco)BG|NjwADLfy{2CH455|V8BKcHQa?WMXTQwvCmThPshwo1Onb8`7qJB zai9S={Jog-7AalfpXOAPry!i`3dD*61MqIDbOtX>mPJ(=8~l`!kSP+3nRiJE-I<W8 z=+D{4rONq10aY5$pp>uagu8~`SUJyS6U#zf#3ikwO8PpbW}1dk4iHkg>4j=?9umod z!y+n%OCm2zy{@v3U#V~)NnC2k+sXw+rYr`eBuGp22|?1uWgVRgFg4^5k}h9P4v7-E zloW1K^IFIv{Zt1G@g(ODi6vs+vm7pnwMv)K8TB|gsn)`u<op&(7bTeti6ESV&n!69 z5b#i+`dnEW;|Wi5Jqy%z;V+|35ud%v&{edGNsg`(Aj$?BGCTFwDbhYjt`GH`>*v^# z*s{Qu1-2}(Wq~aVY*}E-0$Uc?vcQ%Fwk)t^fh`McSzyZoTNc=|!1-qZcgr<=r^Kdj zm7Adc`zM)?abHrthl2QjG<ZYMroSimV+;CUm-B%izK;^Vn-bzc53&1xicNL-=4;K& zzgK&@@7czE!=)xHx5+zb{SZt)LXZh^A?`C<-(nBVdeLPUKlGT7zuqH$40nYA4?XDP zAXmp9bN6!d@1}(Br{v{$e)xWh&+kgDg&!>6t1oy-{*JqX#*{n{sFM1^`pp;QLfn_~ zQx%ejRxWePu6EO+F+_y!Jd*br6IU$(xd2uYK|WADu4e;bt@yXA-!V07$=V@shbt0B z@vjRMMzyuu>IJ91aL-q~i?$9@p`?Sg4nfnf20{kUn)*^xejavbO*^!ez?9OG>>$(y zy5cu-{ZfE+jM7&Ng04KSyjhD&@O&wZ@ZO0o;K~WCSQ&XhgfDfAY_6c1GY;}q^4gdQ z?6Tbh4W)t)PSL4+O557nw_Fe83+X~pNSXCaD2;gLf*@axkCl;)rz`C+2DJ<dkEvs6 zNSE5$rHEXr_UzP&uGR1^%IYKyf>u^S1OOvp_n<IjePq|<HSt2a#_b#Z&GIqc9f!j6 z%?=&oJ-XsLwTMf6KJRv=NF<N1Yvm04f#k)4ct>2z)=gDSL{Rh><LR()58r}Jj$ccz zy*wjHLx+d*YI9nr_z<257%!%Kl;hb&B#r*RI`;(e#rm5FrmV{XS*L#AQ<e|u!U~`S zZ#hK_*HKwy5q(%bA}bH5$2x7ZjEEcda|DsW(FTN3qcq6z3<9n@c{wJt%$OGOLHC+e zq_|K;s%V^+i2eaU0l_Gbqqsicd)!(gR7AisJlbObM&<oOB91cf*I^OS;skn!Y(;q4 zi!-^axYK4NqpT<Ct)f4UhM1{Y!=fy#=(01gRtpWr>r%0`$!II@>1;%^hK4q3)<Do& z9jl`&#t?yjOrqwqhUNO=<=NQa?NsrsQU*VOvGljN(6o?Oi9?PW#PVmsC3tr^q#AxU z22L|1{$~*9;4<PgfLsT7cUpiV6)4r%P&0CBw4>mF$~nWCzQdilT$NMG?<IVFS;MMm zu0axfD`x;yCQ%kYF3dJ^oU$2WT26H6Q64Z7^(heemgoo*yTKdnU{;V(2aVl2_(6nk zx{IUKVBuGiEb$eD(4NMc*%h)AV5-S<4gwY?NHmJDBs=JAk)xwQOU1b@DsLl;pVXET zc|POh3xCiQQZ<RKgdxZlLn_3^)kX&#id}j!rzodUaPopBeVo_CW$-hFLuBzHlE$Nq zjK|8ff?c_~5O3T7ro7h=7G+tmF~Bfct{LCAVo4+5MYaqjErA8kR^=VNIA)8&A_r2P z6!n$zxo}-Vs>?Bql1>j~9bvA*>8&(2=Y>Sk){?gZvz|40Fy~7`GMa+MVq4Azi)iXf zVv?-o>`2p$;EqeI?6|d(g*q*KW5L7hrQ(Lh5L=45zB`^6#l@OVT2bPJC5l^8X#`1f zzk8uSOM}D`LMfQi{CNu?)dk+YtxVK@{p4&QLJ?@E49t5Qeg;3<(eTf#K&J+lS4@+= zCOA<WWU!vygtUums1Q*^2UwvbbBq#WTXIB;;UO8CoOvd3Wt?!FXc3h$gJkScFlg2o zvFsWoE;P~sk%cM;AO}u}1B-9<><K@Z8wN$B8eO6;s$shhVqK^!Udkn}vGzi!ALmv& z$;CzUy#ylb>xJIh#k57GU5@Ht2hHHG3bum6a2OL}GbFA0P5fGHD6Fm2a@?|<J!cZc zN_`T%#4g3;$>^~StA<c}iw~!O3Wq@sdIS=wZ;NT?Iu)B^KwCgpL9<}24fna`_+ze# z%%FkJ%DW#kEth>LS-Os<!m6DNNjYTAJV~2t{2BZ)4`YrK4o;1wn_g1q8IX|m*x^Gr z!T7wZ!!~-zB4b=KMihiRvmBZ7E(pre6L@!~wo0wIZY;SmE2#t~Y@iGaUaFQ5Bq|yP z!h%~E8G1M|S77d%!Z!gvh4*d_4XO(g@{Jlq7-8-bJy0b88o{ci#HEU`ca>qKmv@NM z_G~Et{3@`Ql%PxA61O9X+(w9~5#RD!fjVAccCU#m9`lV6#R$8AQ5w`1Igm`SvYf~A zm^Hyy8Jc!Bww4HN9e-j<#oHmaUzs@5Gph9=rDu;Sup`Y&gjTl0sxMyvkEI&9qM?cT zqqP6fgu<U)N{$}0mcwpV%CjSJX6J0OgyChE<h&l^3G6b&WyGbI`M#B!*NpLUJm!@l z0aB9HWnQl|P6m}JGp!)Hq^HcSrgar9W6Zy<j&Z+N%4JOD#CHS+ceg6cvEdPu=o>P; z92rfsaTbr$zdUE2#d?2}nz`9g?!}55H{t#{PIeZRnu~b{562-~GETwAa*@RYQFs$t zJjU;#0LDgeqG~WPjKmjm(#rrGP`D*l>)ezs;M?8r)fWQwl&up^6_0yo+_W;J2siIB zX{In`8X6>hBZf_!WHTfW!$?}qf^Rr{H9jY+@wr9NvfZ$$8dqwOu~s{A{@9v8^2Xml zKJ3|;N!7)RWI-n)54gj^lLYuu$4P_tE1?ZA6hplOaaurX@qen}YoQqRfL!fbqJd}F zk`8c+I>^d)l1_)hVZ?qJAo8yYrw90;Z$cSdonc~1k0v;bML5jNFU`!U#SAyknnq3N zXmAA0#dr8*!muiR<^35xM8}!V&hWjT7sbZJ!-*dFItB_fi5$jRgJt52EBD8UhvBmE zRDBfJl`^tZ=p?-tyc!Pf4xOGvClQ_9<$F+V4?61g!hkM{kzMWBUajGM>zeWsOi<`I z+Xm8fOs7q0^zxIlFd<F~ADaj1qZ;2!(W%*%CVSyHe5QGufhElFZax1SGUo8@nw4Oi z2*x(@unfCSpoFvJ6pKQ6C}>dO%PTyx0V-D^Bm}q+FMjL+x|5FngZ~YJWo2rxVI{Tv zn}|w}_4PpyP8XZp(_@uJXQnap7^5u5af4FmSyc|=9>nSaVQlg1Ad=Au4|jQIfu<|F zfmFX6<1D51Q(wvyat4QI%sa-6@kQ_ADGLE~^2FlEZ#f|Wj!C?oN#K~sQgzI#i!2EN zFpcH?H#nn*T|*WhKTv)4TX1{KX{dhDf<pT2OvU4<Y^fod)kO72#+bs1>VrvwkC+Z+ z+jquSm{{r7T^BXyCKCItg?(>JCPpK>Fmcn@)TGV!&n?6W?ob|zkNtsOfX;zqNj9gS z*rS?53;1Z=CHpeF@Y5Dr1u`6`lE!58Qj;|4wq4`cI+@_K>k>q~YsgB;F~?`9L@%rC z#V)aME>Z{jBW~5H>)>V`{uyLT?<_rK8d|_<6)eh@ndUGrC;yR2eo>7MH{%J_n1~m~ ztXY0UogBGzcdNCMEyi!#9qWngtt08=i27WX4h&}|9ginRhGzdDd06RNCbMO`5}S)t z-BJ@V+|4I;aW<yp>kIhE1Y8j}aSQn^%3|ij<7=LCBrv3(EW5V;s%}g-ca=Jr%L-j# z5O&qog=j!Cs81CzEl7W@QZYq%LWt}94dMyL$xxd8|LnaFlwHMnCs^<H?dIyy&`(Vx z%Ys0uk>xga><$e!Njz4m^DK7=$vlu6973!%W;n#h@hG;iNFw7>r%gI6lW9D1hV^E0 zI$jS$WKPT^*vlB7xHsdRLmcg*lXw%>iDP!+%{n_CRvAp9V9eX!_f^%sb?>|HU;oiR z>g&E$_5G=@s=lwP?w?n6Z+b0UJ$L|{-ER@Mk8YiSPlmQ0{mq|!*Zq(D(G{1!=gQab z-1Erj!Ixf~efB#$U-`Y}p>KZuGuIyev%mW2UH|a6wO{_kr|!GuYmbb*{a^p}z0*(r z!z1^7;#0T%1@JpxdFdUGp7`P|H-75j`~IT#*e#!&$AuSs@|%}$y%NJ@=<o$s{@mcc zsB!zymS3(Mjfb{wyZp+*crYG|61q=mJ5K%w|JO^`X7UMMy5&$84@J>XG+*XKC(#ls zq2w9$NwkTdsB^`t2WtZYpCOqT-8%O!_~hoL2lv<Sf24lJ74NxZ=gvJlql2G%<!8VC zorB-~)8;*Y@zQ6m{m97I554|F&(}WoiLD>Ib@q|5+b{URU;c@QU-{7C(QQBW7e{~h zlKbvE^~=9@;@F`ZerxML`-`KWx%HFt5xuku<D@n+2%o(DH5c79v~Q?!{kAP1-n<g; zd3ehxd=kfFc(?;Aw)M%8k~I>1jxY1cPz;~&C3uVR+YsQBHshpBjka1`+(v0XWd9w; zd-u|pP6*7~XOG+OmpuPGecxni>cdyjmo#=w@_V*tkBgUIK8_?_z-_-{QpL9(8vKO; z^WBqL?Vaz$i)^P}v3iVddgtwP{0d^1&%KuzUjbm%POe@2Z|JQQy+Xe;SFd_EP|o)W zz0dh1-ahPnvU1XVzvQ{+=(`Q%lh1vQ;-+}v1$aV;mlr{woqgVZpMl;aOg?$ue$U~X z-+bpgN#`pTcg=Vy^@;iZ3EtrSDDj$2DyKU<)G|YL$aA~{uMZZ#n7I%6wTMn#m*pn= zHSwZvfp=#URWF<Gmx$-|q7Wax>cdyzD=7Fz%Aq>F@g6?Gd)4tRnnCv+6Y|M^e6a@j z)0F?4-@NA@;}ffghyZ*Sg#n}DIZ6O$pS)zhpu)@!!4|VdqJzZxv-YpQ%C;JPpX}X> zZ_NPQI9WVqzF#7qr|$rfPa2Kpv0amg>chj$+2+)vk76Y8+-3Uv{{2%^<P&J%?*r9p z_uOOVuJm(GT#sz-dhR(Qz$g6v?w9bTAr|No{AL&aMzC969ljBTl<1@>fu>*g-I8dl zsE_gux%sXMZp!&PDE{|P#__Ye`+iE1Uc^a`i?!cLapkxe*OfQ;d`_1He_V3U$U2f% zVbE6vtxJ%~)i^m9mrJdl3Y+7b9Pw5(jV{J$!JYYj31ZR;K7aRQtM~mAmb2eEN$G9y zZJO@|>FS^LC05SGj!s2&YDJ~wef3=D@zz`=ZfX@Oq4b*1$+@^hRbQm3Ys$rUP3~{t zTV`O=cNm7n;xRMF%mP3Dfn&2LpKX3_dH>=!PCk3`$?sgUc*x<m(HB$pHpN%3Ti*ZV zlZ)TD?Y4XGeQfXh|HaAU$MIQ}rnvV9%{M7<F2|flv*C+_pBo&hUUk*Lz-)7N<av9J zZx*fzinaVu$v8QF{I0uhDY*@K0oRKCgX}-cI^~#pTe%|oGRmRxCa!@#hg&y%yKLE< zi)Y2jlg1}v87^y*Pj38uiVc3-ZTMiyW1@+#sx;}lDYxAQ`6>7iPB}gW8oqx*C7x{R z6^h9x_!iCn4}bWXXXraA&)akS%k~<9WXfO{elRNn`{b1(wd|`htun0?*-AQ1ly2k1 zeY@wlz5h5SMsAyW-~0c?$m<2h(V_8?*N?pGJC}R|v1q(lJv4sXUGIC})ZSf_U%l>g z_`=Mg@w@K&iJzcxG6E+*26{G5@JT_yhp(EQHRA+VY+@GQt1<T{?z@id%<wVvlp?ep zCsReqUU1oq(1yr#9w+quIO^9gG;wvs_jnj5)+f#V`<KCmPj38uiktgsuDk8F4}9SG zV=K=b!*w!!^XazRFxO$6jKC?6?Ol1sjgw|`k*}}FCy>NAp>pUOLgu;)<Akr<+BN#V zOItbT%Q$ImSvQJKq}{*xd5)dDPTc-P-czU^NcTIseUJFr(h2tw;~9SmeAaybgr0y9 zm{5p4c0c2uiYd$0aOmTj#Cil(b%O5M&d|pVWzWCQx54q9yo;5shl}?dF&xFVON6VR zav9bdFGj54p{ECOn%q7`u}EYo9{RRnKlD{A)@gsD73n#$W#h7){p_Bexc!U^KW8-Q zX&Wp0@xND)ErMEcF=FAye4ASYErG6A30%A&8KvdYNbC`=emzu5nVh+>j79>I0w0X0 zS|4V&qjTOKD&?1vrmuL7xm4bPyD6Dc{e%LCETb*aEr|zFS(4*0o)Y5)+@7V`%<Y<& zffpSD*Tl)Kn&7@Dw4w^(lk%KLDULXZZIXZX7E!SpnP4uZa+pCfS}c8bJ@T>BnI1sN zPhYOMNQJa(YgPxE(uitg4Bbm3PYz@b>xd|D-7+Rh6VQ)BSy%LJU6WuaMfI5ELXjYl z9CloMYbE-NR6Fs^L@O-fa2MzD*)g7@wIWL`q|f1N^hBI#?e;CQeG-a`T=1JUX)txL z%X)xgoO)j*@XFAl;bCo)rRHcW-HwshA}j6WQaY;L513Z>kOL*JI5DKT2LhLl#xYUz zH71NHw&srOVwYW#N(AjdGLPm=m5R`hr#l$i&Y`K3rnEHrE1aglmDh87DN{SBp&B$* zGC0kK0%F?bosGOIGcTnZ1#1dFV{+q>Ojd5DkY@{6R-s5pFw||Fnk36v+IPJ6xttvH zjgj_A<PRTIhOlN^8%xbwA&+Glvs76<6thXMNu|;jWqJh&)DwwtRUr%HYg$Ah&=$(- zfn{S*iG!i)-N(}pk_1P<Rfu5-L@Np>b3$#wm78dZ40jGq)XXJ96UG5#U9HnDW(lmD zPbHGXZC7wo5h#kth<0m=7AX)~V}7NqD14LAUEzjcX|8rfv1B1A?I)>><fnnO?Mqr3 z$<tZ~_JcUWtAS~vrHau(9N>zOc?|?W^iJT{p*5}itkXbF;m&|mvRcbs23`@<2HTC_ zjj2Xt6f*c6$W$T9fMgyVVcH`@a9Tv*;NJvEM9Bpl;1MWVlFMKSN&(S0D8>OBY1e+@ zp*BQUk(ky;I4MC}HJIzlEPEnwU#0wc17+j@hGj1*OYPJt{EB61ozs^h)HRb|7-O7; zwPn%uC-++_3cu+KX&9izL@`({WbtC3X9<l^n=D31VRs7@E9P<#^ZG(sxR$>xFu9z? z5-sA19h3o!Iu&Q6P79@jD!o28<bFdMC%y&p+a-Cz&^eujUoG6-Q%<H&gv&R1{+(&K zvg5!iip)3=8h<e9f{3}!gaF7@Iq=6L7&^zy5RblOJ3DHkNj_#N#bHY@A8V#nt!6Eh zm<PpFidjGvC)O5BnA!-e^3_gLgv78xG+SW-la{pHNZUlW$adNiu{fjI<X&$jF-C;Y zbgyP%K^Y-@3<^K@i2G@V(PpmY#e7x;OH(>t@Qtgu0RkEE&tTQ@;xiE9X>{?1Ah{Lh zr}ZXffC?%^Nks?@fpkPi)_;gUq`^}-C~gJWN-9#cT#$O4sEfkP2`EJyDT=gAFvC-# z&>thFA~2skb686(-3*d(6eT4ED9eI2aV&VX0Jlj<O9U%gKzYlGtFfpfKGRW-STDB@ z6QUE-*-BI8VLAp%8qltEv>YRgJ%Aynkl9!SYFI>Dc@u$)ZG%XIjDH-lj#R-qQWz$p zK0!i0H&<y8(s#mOc_Z@?5S?m5G5sWoDrt+w728;16`^HTDGKCp4Qv6=g;^mG6+8Ac z67!m^KM(fD#UReH=%4trvzn9S*qoEtq(%khS4M;)E<lJCFf~vjQMWf_Qdy^L3NwTw zv4m-jHe9V0ubGBSMPS1&$wruCH9Rb6yeQ7In!wbV`ibNu7W7JAj~T5gC0@kHF%@N+ z&7Sf*B)a&=7WBVeVDzGl*jhw=T9BQHptV4HNGu=*j8hOTgA`MW14;lW?Qj<}1A(@O z!L=A29uPt?oqu{KK7+EcRWNT+s*6U!TG!?c3m9NX(>+e4(bD-Yt%V$qOUmYfmL9@M zO<{z7uh48R6@CYzsS<RcEFrhi(s1}tF~QPJx?3n)>Y<T^W&+ku!7~3^Nh87-T2maE zma~=Vx(lTP7VM-N<2hLr(|wI5aygK0E`-9BI75Y^8hn~^DG}9y(eBLxXyB+vydYdn z_)LOjo%GTH{4*a?`u?5hTz^Qah_*Jc7hglT63(_MpdMO817sn~$8J=5R41ovHP9I- z$Lavp&evSS9As#7Eozj)-p-R;hX`5ps2Hswp{z4|EMAX}<2qVp(xi)k42?pPcobi- znwCT=RE;Dwx&nP|(q@XLx%46XxQ3bYBHG6%rxpc7SPk&tpgzdmh&5<`jG<!quPSh` z^}&GYvKHwlLd)Rl7Wf>`UEErzw#`oy@hEi!RWX(U_W?<_3v+WqCg#gTEebt?6iOcx z5v?9!#ngsKBAA&&S!#z+LhJ;}kQNP0DI%dLv%s8cH%%0)$8Ez<oJTU*&rX7?0_=n^ zdL%X5gM_MHNrqzPAFa$?N`nRBprdmQ;$1hMbni)BD*AczYy}tO?%vFbsX8ci%$huZ zATv(n1C7+Ne05x^(d9=xwu97qppn)hq5Yf{i4y|0pp`U6na)!Yleip44uI`W69yBi zCKNjCm>d&S%{Z2pv8D)b7_zm2^4&M2x`y#XP1V1hl|T|D;$gf9#NMvLmnAJpRkTS| zO7nc`wfreAbbIJb@WKjezLdaFD2S6uA~(H(RqEjhqC9Ht1DP(cLqSzCk&`mxyh3;K z0QA2BOqGd6Q%S?chD?bKhV-{6&~uH&c<!be;-3yw3FC)DO05gzIuh+`C#`uR#_n37 zpfFW;6|RM)!)!6j)kU1o0IESvl{oMil12u-k_A|=pjZ$OMRFkLp^jz&p2xsy+q#HM z?YNSMn9*cCfJrP7i*-Bow`*dq@Sczb<LFej%;9XHGDe!KdqS0qTuXaQNj1uFtp`Tt z7ZDcIB4)AzvBF)&SrUXU03-243^DDCV#Xpz<9!VDtGc_n@g;0O;YS*nrd-9)D;&^F ziz?!~h&AG_i$7=_;_7-x9Mz(d6(#TvDPApF!zD8Ks5|yU!ZPvj=*74yMN3>Wk?sc+ z+uXG-%{hbAq=?4Gcn=WRB!R}#3n;b;ef>4HA-tgij={@GKK^64j2^FZUddtS;PI$R zV}Z1Bxv{(MnjRVz<2Ogu_g*|EW85ioyIOVOl8bjE^0hf0RI@~kD<g7;7UIT<ZMCsy zubrW80~MrYO;8h6+d-geXd%^w(@X_h-azDMk2t-@KZ%>QJ)_hzhSjZb#`rF+^B>~U z#*Te4G{mV$W9||QsMA<=NbH=UK2dFmH;qQ|XR0zbS3Qa3dCgU-Jcd7>5c`Doxl+kb zB<NR|zR1;L)2+s$#%;c&u8m`$VDIBJZcZZHutrD8$rZ>Xa*XcTBC%tJv`74jSN6NF zpx^XZwK|5&(4p$l1yQ*l?Pt*9!OJhcjC@k7RB0b#G_mc9e_4sgZ`pGB=#{vA!@YKO z47G~;Eiay?b`=_~h4>xpKe@Kb<78}T2p9i&UZJ-w&ex7UsJGqn*YCLItv_|m#lJCH zz4_)hkN)d-J@V`0J8!vK$T=}F(U|C12k3s{*wtJAU}E2oAURL6JWj|bAAIwc@vCp% zx$PI<e8rnCx^)M(qN8S+Nj1_^2z|xQE4EdK#-csZ(9m>ce7bt{{;C+d0M`wRlVeLs z?Z&G=b?tlp>WLd`)#@Nd5B}E%V@Y)kHospSJ$hl~SAW$h(?^H5T{egfiesDDCqr|| zZ+=vaJ#xzxmv6gx5LHL{>Ai}})Jq&st9YR36J)#&d*`l&pSNJ{8XCF)J`vHQ+a4C; z=!0V0*aPpFf=}v~)_&^d(Kp}xtG9mPfvb1!<26JRJ&cnlKXlvCFYLI5&H`+3>ha_7 z$#2~7Q(NMzZywrq&lOw7N7yIS7qVt3MSbqmTYlu?VGLgKNj(}EpN@`>vQKJB0-uQ5 z?LV^Z?YBSsr5nbg>ZQoAW}mnUyz~<7W6Z$qOLP>sKk=33%e>de(N`Jg$|4=NZEDqY z?3kf7n_pR>mD|U}@di<v(dLs^ZWiw{T$~WQLcNZ)%fjh1;#19Qc-`^rtYk+t#MG{K zikgzHeBGL(X7j}ti;^enMatUor=O;Mj2U3x)pHp}EAh>~t5@tkMW5Gyn)Z$5;dLdw z>)0`~So?d;l@<7;`MbkY#wShkiR(k%ebQ_ms?VOBJz4Y#@At!|Gn^+QajY>p^_F~{ zEH*B%PPz)~IG=pKrS{lY@Xt&0u8sJ#UiKBBzR&qMR?R<3_$xN{dHttbeKKVqfRiqo zFbIwv+r>{No6Y0Lg}CM==M(f0@(E}Jizez2(w>Xi7iM3``{bIJ+&JN^<dgFC`r~!$ z6X%N7+DBq!1ICGXiS{vO0H5%>dq;8mc;S-`nY-TR`NWm!Y-oLQ4d$*76E8P+sqW*1 z*7wg2%nmqxMt|y)|ATQ{(Y5gj9-CmCK*)`gX7l?kbJsfi<OZq}u58^tN3NnM>_fyA z@$PAQs!*UC;od{OvMv$-9cpx9p6)oAtyHEp`83$>GTdARr^Bg4TMJ2w?OA@ug}&V` zO|jGO(<trggZcsD1h^X&oS*o3*fo>Nk=WXRtAgU(K1ZX??oR|__;#P7DA4;Yx?Qin z%X~wCZ-$-B)_HMnG|nZw7q>NAapCkn!sr4DRxl51oiLHwf@BU}tbBJS!uotS3>dwc zgiG<AdUg#$x7oj7dDeC{aXC55WmseU-1BBHPf-o_AMzfaY#-w0&9jY>VeG9wNwV%8 z2E}}<#ghy8IzrTO29eTep*=x&VZvx0+P{Av&crm2M^U>OrhUnqH?JsqLx2P4i1fUG zw`MqASv+;fP>s~dW;O>7|15FH7l)>XZ+zheBe(WYuaxQFYZ5RJKTZ5*^Qot1_mAwt zI|!BuckeKubYBpaOaBp`3sakEQn>nRBf~zyS*?jJWWG=O?~g0WFE#ba_bj!GPbLo- zIpdSbDc>ig`1tW#2jG*#{r47Iej$49d9x3(K!zRMI5F>8*}NGW7%@(8zU4mEZGU1> zUpIUU&L_>!!Y3FH{x|`Ox{Qoq@16KZE_v!lyXh+OM}$(Mbey>R45PW2&*4*tDiul_ zpESL3f}0+|kK&CEvtsz4Up3W#Z=w7}c<%XSo{Ng~m#j}PPIwM`>M8gH;{^K_kC80u z*KvPhQC~Ow1)NXdlejoe=yfB`C&niI_eS=KSAle#G++EjLpGW{5l+_anLPE$mx+vf zSGE9)uuq!JTL<8ikM&<O))9hWfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4Pfnb4P zfnb4Pfnb4Pfnb4Pfnb4Pf%DP=9~?PHo2AatdiPN6pFdZ9B710D&my{wq-sNV<RZU_ zx5y0}ijymk|7I&mc|2Xf2^Av75#{8VtSAJJV@el58C=;om2)_;k@itgVh@+VxpazE z8c-qwl_gJ4O4?#n@5MzVDl>V;Gt{OO#XGAOYmK~IlDHn;Dr_jS9mAt{Q$u{x<6@*D z839c*M$|)23+Qg8*g6&EYK44`@8SYGMKx#q>cuI+B#P<`H7Q7yqe~fCWyyT1#h%*d za~n}uS_?_?594q(Alxg*&%FAy>M?7v;H8Sm=<+*$F@_XNLe90{<}~?TX!8AZ+WQ<m zjVq}gQj$$L`xNOOUh~qqWTmt+IT3?cIYh{UKihu7UAszhogPx#)^#bqw|t{NkW)h* z%4W0Fd^MtH-b?AZyg*9J%<`p5WHF=AhC&uc%IWdq)DO}~o|U1twOVRlJMPa;t{9ta zk6l7>kype?hCp*zh*658TXq^*x^{JRaxS(uH`8dE3+kLeMxzu{IfzrYrF0Qfa^1jn zhjmlfyP^+XNV0_rxYiZp-qmK3$|hNtDF<N>vtOp7B}KYS-Lf(0>e?dQJ3$phGvx)w z8c^Ls-s`S(LJEl*dxugCZRaQ_P#!OVtZ{grwwerucm$fm{)0wKmbJOKMcw)l`mPxI zL9+kS(h3xHt-cpJO{@VW#&D0N$<m_xB0BATWjb@hs;8p=<g!dmQj&YLLPGK%kyZ)T zUJBV)tO_OQ&q0mLa#+_`WfI;9B%;nZYe^|Tv-FWwr~B?R=(Xa`QCFUV4;ZpB(YHpY zs~9g^g0*E*u&FD#n5`YYZuM$cfT8!-WjgC}T;Ⓢ*an>qs%1Iih$<Q#s&_{WZR^a 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 zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J zBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZr zKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J 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 UPyNtHCqClM7lh9~Vt1(dpNQ8TZU6uP diff --git a/quad/sw/modular_quad_pid/bootimage/modular_quad_pid.bif b/quad/sw/modular_quad_pid/bootimage/modular_quad_pid.bif deleted file mode 100644 index a5ca1d7de..000000000 --- a/quad/sw/modular_quad_pid/bootimage/modular_quad_pid.bif +++ /dev/null @@ -1,6 +0,0 @@ -the_ROM_image: -{ - [bootloader]/local/ucart/microcart1630/tasks/Quad/sw/zybo_fsbl/Debug/zybo_fsbl.elf - /local/ucart/microcart1630/tasks/Quad/sw/system_hw_platform/system.bit - /local/ucart/microcart1630/tasks/Quad/sw/modular_quad_pid/Debug/modular_quad_pid.elf -} \ No newline at end of file diff --git a/quad/sw/modular_quad_pid/bootimage/output.bin b/quad/sw/modular_quad_pid/bootimage/output.bin deleted file mode 100644 index 415f842b68669550922a9c08ebd56daccb103905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368340 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 zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- 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 zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSSz#%~( z^sON6?Fkd1efXhB|6BkuvNFn?f4_Bb>2h`$`Z<4Eu7yH`d7DHds)PdRB;+KYvxU$V z@`DT?vDb{RgDpK1W6yZ)@)=C}&(ER!tc+3Czh4<#x`KUA!SBjdD3eGTGqJxh_F6s! zGvUrgpz#Y)Gq%$p_@hipi2rzfj}<_go@lpy>>UKrA<*{8K1ELI2VzHSaJ1e*XV5wn zA4X5m;0tj&+(F2PC=^X;O@0U_xp%_qX%pcH7$<CR9#TyjD7O(ecLn?ZXYXyGD?6$) z(K<&**QbT(J}t|QF#f4lgrjsAA}kyHjDt%;ZWIrbxfpeuA>bCq^mM#DJO_;1&mr#W zi!j1*pbaD;8Qw&Am@L!7055NnmkDI7ke}r+J!6Mtl1yeu92RTdOJ*MF#5m6Qd3@jZ z?W#I|_g?9$TWxpu(w1&j?Vs9JwRcsWzp8T<@HZ!Q$s$*=Ol2wpWRZ&AqjtJ_BArBo zY9dm*Nl3(xj`f0vGH>=-s_jqi*eklo^_jOz&JB_1g>Vc(N_@kZU|?zCODZ7=fy9Um zehzgq;Ld^eLPJ0P@KxSO)edh&_|#=x&1&`2)K{U6t5}WuQnb<{AYtt0GziBNY624D z7#lG%QzVWd8;wKe1%?RaRqDS^`DPuyXMg^ZE^>Y5?UHkYB=&OtDGBE!rV3*W!egWw zW%pt}Gnm5`KyxNA@Wm*8{F}rPWkl&wH3s(C2mOqta;>dW2g3PenZ8yUc}@Xb&AQZ& zR#p7rbSg%i1sr|ffU|<1jThq;;ITTCSomNPC(%06%Bn}=6rtV*4RiLh5Iry8;7ecd zW|&?jR$UfTEIGyizetITNXt}`MhG)CVTfxAz@_I5*mY`p_+{$|oH2H=qRvZLGLNX{ zu@xHM7_u#XGLDhR<ZK{TX_mnq@v<`7*f|glgvM+*R{(O(!$h~^$qUjd+oP07wLB;F zC%Gn<oM9@)m`UKT*pbuJ2(3EG9Piu=x1)hCC~zY3!0Cq&teGjx<RQ|KX2dxQ7FP=1 zFj<_LV=5gc32sSrqz3Rukqk0Hjd0K9An`4H0o!0*S&T|P(YbF72SApO79id~S=@x( zY5FlWXVtilES#1?Hc}eYa|O&g6}|bQbp$q>T^c8ys;#(b)iV&Mc2KEpaMG-}4;S}| zx(e(#(@ECEJ%CKj;j9bUmcThrAlc~st~1zf10QI1d;)!7D%~G8xA>ERLi;DB*{X^3 zc{6t%9YO0}6bMHXH-E7Tqh>)hO;aOj3<4bEc|!|n!-K{u>BtrDOo7Hmsl{X<!H6+K zqj4062M&-r$6?@wzdos1EUw{#f*8ApEphAwV#Qd(1U#QBB7uYEe1h-zTdglzo1CpX zi}yx%(E#|gy<kZ22BZUwAA#8V#CZ_Szt}!;HstMipDIVe;$=fu<Z#zsc-;icna-*7 zr7zkwqdQpFj0Mk>%v&JAV<j%+Qk-%bYCswiL+1(HiRQdmO~Fw?jtk-FP>+MZ8etx* z#dZ4VC?++4kCGe@bjE`vzDSqwAQ$KXFUK!H{$Iywk1z7n+u$2t*Z>+?cM>Xb$tIu& zo1bFrJ>(8D&=K%cRCo4dJ5rpAzL=GQJ;kKqd<th)p!nl|;$|$NkPgo_@-fx&=UtNh z#caanmHpyAk7qlaF>59*p-cwvRN5WGH>Kmti#G>v_T2w5T%T;V&VKcwuM>E+Ax5vn zaD^k|Iwc+u0S*pAqaou2aU&YQI00SUmd~9p^6}twj|IPgdyuEALyjA;LvE9f<48EJ zKqwp|5xWBl4eHGAVi^n0_H-A<QKAOKaX}1Im$(NSV)!J6o;YruKgW~GY_NrFSzyZo zTNc=|z?KEJEU;yPEemW}V9Nqq7TB`DmIbyfa8_HO{r6Avakf6g%?tWXQO<l68<p(N z3G+(r{XL~~{9I4`tJ8gov4$zIG^;OITh15YBW!F?Q+KH3<*ni&!<14>Ru&(r^8$3Y zeOl#~nKDvK7rY`>6Ilxl-N7hk=T9k%KW(j~85rOKiH|`s>djncg#YrAE*(3;b3eTC zg<qT6VKiEq)(=q3N@Xg!O%X8wiih2G*h{C2NB1Ifb_C@v6KaH>REIk0$R+G=YeB4( zt?>gMVoHQ`h!y4-{5BKZQb$Y0e!*T?w}+iU$=o{a*vy)ohOVeHZ&a)KZ*$#Bpq2d^ zXq_rHpOT;kzC0NK+LX!&X&lzoZ^?9(sAG^u7I^}LB=$H~9ypeAzo<!6?Ns0wi$i6P zcEPcxrn!!j9cUp2sjM1k2VexQ1JX%!AvCEhmfuZflfL&jmQ{Ajl%xvzb0k$B3#jtW z?Fec#X-S}2!A>byFKZ}5)?ahW0v(Hu@bFbqcW9OiEA@S-&6r9#mEkbr7%$qg=ToxG z+L<oju{M8AZa(95m&(V<9BkYNxN&14iJp%?K-hAc1`Qg-Ih9#NMwu0BkZ^!4b>|@1 zE_Hri*R`qLB)eqZ6jI@?ict#$lV@I^(r&CJ^=ZtuHp&K-)e5hba4y}HI=#3`*1leQ zVe7W)i*xQMoKmhu!l}xbd71Ax>z3xUvfR0x{^w_QBHob2Fd$?^tRns%*qb}$=$TY$ z#eb_-@LR^{;E-5}ETU0RM$#m~2JHtxJTKsLG{mXGI=xf}z03XeW|@3kCi;>;!LWHt zX<*`$ZSV<huxPcie2gATvjhZy))Jj#f$37;uU*=OsJcmZlUtWYyY_^7cbI|I`F9LC zqT-NUI^reRng!p?j2cW}%#QaHsR%P!bwOm$63-3B%P)Mf>j@)!=sbc1o(U3i$%_Se zmZ!^epf>TtKGSR}JAdY`+i?wcmVmZWkr<=Ys)vEe@kEn|nM-1(d2OPGWoB!wJYeCT z7+!(1>ch?npM&9RdChpXLB{C{N0-il<7z7NT9Vg#bXFbBR!uMIT<%;+>^>WP0^{)o z9=suMyPiiZa^&R4DwEFhj9~FxvH5!S{O9Wlyf}Qh^^TVhMQU5;l$0DprLv`bTp$6# z^9Npe7QM3|SXJyRqd*5zM~v6w6wGX=-Nj?fc>;fv_qMaBLB*j0mFldZ#tVlnrnR%E z#+zD|zb&2pZ>r+cP?q0t#QAPdsJlwn2|aV3^^7lEeil{{=Uv?B1DE*CinTgU!TwXl z>mQq1ZcXxak>>^cz**S6hOqyNTeDKUf(Y+F&(E)NgWq^aO{OMyijK7&m%C%R#5tY# zgR`*qL!%eP@dfZna#d`%k97DXz4spV$Te@nt$GJ{j^Dcb^@p182>7`k|K?fPfZ&s% zQTn8FoM`xD@|t&C6RLjK?R%cwv)ue(z|ZygZ_mQx$-V=Rw`teu>)X${RMpCD;nrz4 z?5k4FUF<z)p-<Xv=ZSW^w@>Pa!ESy!cfE4<)f~Q%k-)f{t^1{&eJ$&+M*I5{dqJi4 z9dTBlM%>;0Q>;(rc1rumzVl}8deL6_d>UR(Gc_~IhmRfv$IH0`ey+!Vb2@8@UZlpu z_*p#8oB0j|SILX`CbCeI&50M!!ehMZa$Z$#?THfy5AH9`T+bx?_O*9BeKsw@DOY#H z>2ua6&lgR7Cb|0R_Ii#i#LxQFIqQ?!I60}d#>pA&Z2in#=kYlC?Z#<Yw{bLN*CEk0 zHhPWQ?#R*jaP{1Fufigs9L!L|FK;p;Hs63g@OS#dysW{?rO)}q&*Igi>p*i2zSV)5 zCjy}oC&T$!QiUE6Yf3KQlX$7toM&sq{Ne6B-(9Z``uGu{DSSBS%)#1yiO&-@4(mJ- z{j08P?tC$(qqsm>B?s%Q7<B<{gy=#i=hH$D0cfi(?OJB>{FZ-kzzXOlHCEUxND8yc zkicSNgS7F!@@bGa9az>248OXL&uY~%HJn!QP^1C{algHYEq5bDLTtct>iCT&B=1a2 zVrY2i`yPlIE>f9e9KiJMAVK8pir28r=hoZzyGBc@YVj4B{KlZJ<#LiKSDnUO_TwQ> z_=oPyKT4iqpq3Mhi*pDe`;e%R=kUUdmBqKukkmvi)E3G}IqQLaPukR3(|2AVv>x1C z-Zi)^<<mMBfqBY&(uYxMi3Sr2PE!ixJWaGTVzn|L#mt~5)NUjvD4`hAagz+SDqSTe zTseFu;LK>P)-*SWBX95TI)1&Hb?>Cza&@DrWuZce95?VLRCvp9HZuqT25V1|G;mQ2 zG>!C(^C9G<Xnct73=Nd-Et6VFupYmV3@OyvL#Y=A65~mSIL(E$qgof`VX>gZSpbjC z%j1AsLp)fCi9<8Zs4N3ut|UP`4QcBo(fch~)@VNy+7)YJx8Wo<a?F8is1UzqD!Ux% z&umN`D~%dZ&Jp0KXIsi}d!;38Ua_J|<jcan(^i=dCT`cR1zMO!LhC)n%3*r5ylC2H zpwsLoe+EBSHDzZZV09C}B#x9^$6#xGlvv1|Yf$q=sQyE8JXza%LAGn`tm)2ryxkz@ zQU$IoeP6;c7Od!#P)o81=G+(P<}4hL_afxxha7-MEkuui7c0D8SY=qaG68Cl|13|H z=L%L8jV!~%{hfC?Eez}W%F6mm*D8?b;h7Y8(EnRf2Hv&p3$v+BSF(6ksaeafF9YPb zqoO6ag<FFSD5qU9>fJEt4d+-ZgB9lgzLv=8@Vx0)YC0+&DIr$mO5+tCP%){Ix+}TL za)U{hSQQ&(8hC?5gdM+4YtYB^OYv^+sPm*xy&#}Zr<5?V<DkS!;(w8Ew|ZOj{!Ezb zgx$KLv#V1URF`61N>`H=jvE<ragy>49soW_T;|A$u5zOjEm*}2r6c&kLI6HXFhWMt zY*b~}yjV_=ikxB)>{&UcEA@Ytx@OR<L!$rKX$^j7=cXMITCc-+UU9)<Ofip!N{oy3 zBa6x!WP}L7+BCB(5TVp3zNY45J2-`7eA<ezC1QA>fzv^F2i`kR;9D=*q=pp!a0<Jb zs4hcE!@x3N$bBb};-rNibZF2`f<%<eB6$=)Wie8KM+?jh`6Qb0`N%!%p>jQ-yHxj; zGIw=hfYe34qE8ONVf@)n9hLkrYd5e$#CevAb9S2EfP)5(@h#pyfs0xX!$mj;NO&#T zf<p|x$M{4;+m(;0SS!7pPN;{|HCmFZJ|_|%X`EIyZQr^3k{r~{3`g)xa}JwOSvJpC zDx~n2R*AvkPGdKGJPFL~OpYz8CIp-4Jmc&cNS`0@sngtxZTqqXr1}7i6nCA2BTc-* z3>+6%z!R$~-UDVjhS8#y_L`A{Bl8CQNo8cPHsKHp{QQ7N!{PNTXik=D_yAMXMUfoq zKc7h7x4)b2xlrS<A#aCLFV%V^QI|v)4U#*$GB(OM$t?4p7x3q2*S=q?Qr@gL_*tdq zdEJ4eRwr<39AOu{#u;*qhbI~*VapT8aP~E-9!V@u0kk?_;5BFEn!B;(NlaDvIrq58 zkLXCokhgzk0Zb#1nCWvJ?mq3a71(H#z~8i#Hxfj+7Q~2933O}3sWLjt5+2LptvSSJ z(WEPt+PvUpXV)H6>|ewtplk$lky5v2$pX)~hBQ4es;*Gm(?&M%5q0audi<tE%M<e{ zLr-!tvyeJJ;Q#LLnO3jHTB{=6i&@ZZUo%TOx^q&E;0*Xs`rw{NMsaB#<B@MeO^n<; zp|6OC)WvESN5_zw+cmE*Q(9+gUQh9%BTkb|QQSG6+Hrd0WK(@IG`e$7w(Hf+OYZ%( z2fzOd3&ZzbcG)evnpdbVzV_xXOuc&7?XSIT`x|y;J3g}KFK>D6eLsHRf0@){+25V~ z>Q~jB?@N!X)s=JH6?yf)dwPe1P4&s-=tZ}iUE8y<doG4gMz1*dsm3i0b;ay^ul%Eb zeD4+eFMjpKmtD4Nbl_)idH;R)-TuD&TKC*}&*D9Y?ztz;7Sr*`C*+hMZ`e7U_`qo& zDo>o)yyl0Kz&FpSIcSx&UWkvhj~u}d2X`sT?Grkn+U-@3TZzw?;0veSkj?Z-d7*Hu z=7#6oDguzPVGBNSK%YbrR?;I*kZiZDvVnOX#IFop^OW1Ni9U(irK1~m{RD76Y4i3l zq1`^2{d?~dhYR_<365TVx=q<cpQs(h(e2HpdU0DLAW+(0QMj;o<AgNF@eT_@=WvXN zL8k@%WXB`(xsAOtcX>wi@(OXcyE-J!eTz!F7|U1O^`i=}E&$^^fh$jA?i#V`&|DvO z;6=API<F;sXNhTk40pW-RAWkLnN{x^Rmm9jkbo;i>I>Z=s19*S&$*d2#cXj_G~n=I zzOUfV#2H5p;7%}rNB8!QlWH*f=Hu5t>Z(cSwA(B6lHQlkYL0iVhtEsTJ9}Dj81Im< z>KE=}jSkQ!$5T08xMRjQzZs4ybXrKCZ$3HO-W7FNj^)88%jxloPq4o?9}}zRtxq02 z+vct#w7Q$S+HLs6j|ZIpo>Xez4svlyhNq+E1@wtc|3!m_!fj6hn`*%ww(+pg(=G3B z+>jqD$==H#F)!Ks=cC?PniRG7!xAwD-Nbu8i^okuXKaS{{tFj3jykyzioSr9;-JUK zzC;?BdQr}AIH7<$4D_Sm%Rw9*oH4jn1jU(ytQ!u(XCQuPegGaRDaK9DGL){X%H&f^ zFJ4^9C+9L+tED%i4g&6Yvt-0%YUzhQB-Eul9DnJDNDuN_*+nPk@)qYt0T1!ggRV`< zM}6$^P)>dS<I?v*PDC|Stavpco>R$3J?V@@u8ya!I-DW;QHD|AG_Kl0XOIC!yVFbd zRHItCjKv8j0Jx!yMw;>Jsw5adepM|pm0F&jx}TQ}Ihi{LrumZ)pYM}oCHO5B3vSh_ zT~)?fRsi6rlI#eKqv#IC3r#Tn7icgQ(F%AP(Jj;OTw3TVQX-k7c|ynx90dxIaB0R< z&PTz^%1l7iL6@_;S+%GgGxkE*qG%*JFeg#SWKj3W@UA3Ebo;Ks(jvnE)In2JB&Tm; zBJ}WHDp3Uw>q$B>$`{QJd42rs1>Jq+*ug5bOgU;Q0`j#)n;Qoy4`e_R)phj%2hVan z^O%eI#J9BPh>COV6B#mEWshM)BwCZdoYQMyWJ>8XkSuK8P5Ihfm&4snE$7x;FW3$K zgpK#0wGPQ5W_giAwRB0O6D_rH2G%h!CLQWTWkofFT(3#hk~qZI-9@itBuTHHIklsp zx=xQKNz1CQ2@Dj9V_~XOKnX9F^k^MLHWzGNowP6;P|7$?QMalj8yR>;=B_fOBKst? zmBBa!xk4dQnrnN|S<b+;=Fh+bxT}RIfEiWX!{dC)8sy%Uv}#I!pz2iZk+#h_hG|G_ z9EL3>V9MMj1b1=Ifk%ksQv*!RGuV7U#aTtdjEhhv!G%n1(+JjhWj@=+pNEJwok4zR z$d$;7cPDW7OTD0tEX%eOk03e28X#U)YBAm|LZ3~&jkiVE6m1}ie*-C$w=;@Jh_nJA z8|#37OBCU<I*KrjjuHhOv~)fsjo_9co~+{sbEn4VWt1&pab1e#UWPKfO3;#^suogN zirbuL5`t5#*a#)%1Yc^vH&O{B!n2)O9vdXhF$_{ts8KP~Mj6YP&>{<%F`!%W<VO@~ zQdB&Pqy+&)XaEIC<bvfiLm)1+h=e^OT%pp95EL>N5oPn}{_vdvZ6~T{l)=aTun(C2 zdK)XE%-r0k)B`F$n#Bf(n2fS77)ZAY1zIWAg_7(MlqJw!92PO;6ADX^=eo9heUcm# zI%bXtQiUK_g#raZOb0{@8_TVsmwB*8(SsI4DhmPOI5Olw34j8u%O{jPZ)^p}o;mJ> zOJ;~+)GX~rTvE2U>}q4lSA0yo2)C64gnp_4s@ehJf}+N-6?}~f#1Q0<;2Y_XuHpMD zZ|t*q&YEzHnnJ1QMUYtHx%L(*O29}sj*uz*VwVCU6vlNB-7&_<QW%dS@d;(ODa#R> z;K+nQLKuR#kVF<k-H35=91s5t)*zvz%?AsW8nws)CH8>&)kaOya-T8)<hW&(x?j<# zg%FV?!GE+kM=MJp55P)}IF|c7t;CWhU>V}A@{B(e<2(o{%Fd#^L}4p2>(^3b6B2{Z zC%R-FLc%zrRMo=B+vEFT0IB$LWagseHfAMGC&=a#qj0N$^`ZkNR70(jX*3piiy)|H z0=&Cz58aOKg}TX*)nZKnG=ycsJ?4{SFpePV^_9I2f#)(Q8;T))Nwgu6$2cvp)B>(u z5>Zb0QZ!7+O0ee>7Q^%eDJv9qaU*#IEdniG(Zlx5!&tTrDNG4ouEjeBI5_QbZA%x& znJw1w_~gTCJn5#50-FG6p@6kMA!Qls8e@cLN>^82sv5~gGii+EZsgXjieU$bT!4k< z7*_~{to#y-m`wc8iERuofM*l(8)5|{)Tdw=Ue>8toYVjbSfZ4HFcJ7hFscFx=M{!t zQ;CHKWh%mv%p^-{yd|9p=YU3i!r-=zHEP_94x&JgbaA6eEV6Ng*hUNac@3Z4hDG-v zZUV5FD(HZ+`fMEIDuANv8S8k+VPpKseJtoIR6#ruqo^;Ih*nw1$a?@HRm?m{wqVpe zKXO<FBPnPGw5TD9t@k@j2Q%VlC?;SMMn=-5z=re^60kZBQ1=HC-=Bi*)<ClsPW<Pw zdV5%$0!m^~x~K$V)SOCI@g3$hj<66rWuQga5QYRJp%m{(t|A-m56FO=Ns_=X9zqf7 ztFp(`f(%mPrkFug0U01oIv`OmWd<82vp7b#rb-5b@QTIhky17>c&P*8mdgmHs1<ub zfhArB>kwp#V;tjCxtPMiYo#IXNao1L{PkI6y#lR>!5g>g*qmCTx(8D=Y|-hInu8C` zlGApELX?u=2S6<(E^vqT5l%oRnWtcrDNQ@7gm@W#yxhNV>eG<%WAK!_B$Z&r0(Tx@ zBf2qKB}3u@l^q*VW~9McYb2YEQDcn-*gjvJ`m(~?AWHh6MHz=9llvDGN#@6S$2cO* z|Jh}eV2|9})QD_1HK0$)bxb3hO;F)1&Ge`3@}@q(Kp8b);{Yx!@jC2T;&mo96wDf2 z-{Kf(&^YuY9O%m)kUXz1&bx@q)ryAiU`a#{V#9cr9+h(>Wz>Ym)UF3nOJhNP0CuD6 zoq8B*0;WX+Kt)&wW4NgrA$XBzTE@u)0yN(=;zV=(yqaxN2d*L2+ogMfsx1mzY_cqi zcS~SM8%S8S$joOFLREW|VSCUEG9}O&o`WuXvs_#?zmxsh()(5tbW2)5ayqsTsYa8v zq|$~g48mNY2GF6?G_f<uvgDb<`y6Oj_+!F1z(rbv4;z-imeNQHGnq=pNp_j+PQ`qN zwOLdHBg%3Jp&Ax^tt`h2|1-O2F<O>DJ44`Zu%Xnv5yqD!G@o8SiqhSf1GGAZ`m@1k zENuF!4kh0xnQ9Unogsx>$fPOnfQK2A=VS&TTAUOa))Sp|Fj*mkWlicy9F@TbXHCFu zH<4g4fL}DIBV?OQqx&a;;mtQ7YPEQDxCP&jfu^iRAimn2Ei-8?tE}}gd6gF_n-3Vd zn+F;vq`XU^^nz+JW*4r)S4-c_v=9e39@?X1KVgtWyO-&K@u6j!-#9m@&*8X&Gij{= zcx<R8A*GN4z@dLF&^a@2v&ERsyMj{INo37r4}3Hk<mEyDl>!)X3Z0Kb-dPW(R72c1 zO?mLG+(&WzC-DK$95PsecdiU5=|a)U%+m6Do`PW0v7GN=5FAldd?y{UQ}Mohgdc!* z%?&M-&Op~m@m0u};O!~Y?*YcvcqM_F(}CiO2i+GXbc1mDHwux>Psvz`c{*BZm}}yC z4J}m$Q-@Z@D0Lg2KP+6NvP)%~b4h~9A1$A-ToaGtwj#t}eVtAQ(RdNo(lM?QvRSh* ztn`g?dbMk0c_dnmw~r=zX+m9?-Jnq*ZmFwyl(*Y)-nHb<9z_wG<G`?5IDsP<a~485 zrQ-QqV<c<v&K1u7;0g=*CLXg4z2n;Cnte_|mfG1Qn^oB)4<_0uWmYjmXKJ$OL#~)j z3mXloqd3GVwLy2$s6bgOz72Y|H^-Bqp=_Vg@nmagMIJ)b@)%eoz^8Dsg*VA1dxq5V zwWZE#F?Xf-{$V_XD+09}Hw5wG4ZW(d%4&O@ti<1#9eT^IMKg&my%Vo!9M$k^GQyKr zfCMFFq#5bu2xUMO=lS|G%Sn<U>p&c974y!cX-z1T=(!(x(-1W+;v^mKg-WK3;l&U{ zv+>a>WyapKY1i>6r3Ul~AqnFI1`!B&O}-Zz-!>knuWsJHFf?@6&CSXEKln=*|N7AA zB{;pT!p)`Q$!D&OKeK(?=<pkEoPY4zYu=HMlLt=z>*YuG?B8?aWuLjRx$yVQRW}Y@ z^;*69EBF4wWjlUn{}*@t;q4#$z<uw(_lTa<J1-eaN5@BZP5#VCx+~^5kwH(N6kW;y zjvBMbHgcRW#!M7nw&ydyuxr<4yGDiv8dvD}irYV>Zft(zb5Gp+!$<BraOA*#6~QOj z<P-NMm%Oj}jW5l;&n8zkk3GEbcguhL>8IcEh5uM>+2&y#K2cVbqjhYQ^g8Ki>lA5j zyDCoKyZ_ePf=?cJ#jjs-$!NzB<$K-TNzwMHYcIZR`%9DUZ`d>c>1(IbH-sWu-@a-& zoxCZ%{o>EuIJ58r=BmG+W>-zEzV>DR^b?nVt?|YEe|zh94)6N$=0BO5oP5nCV`HON zj*eb3Ix^&af<u#BNLGC^V;12P6?~#Tgtkq*;op92*XXWYyY~LWT@7u<Z~as@ZocuV z=E57EyAPY^Uac`sn%U&Bdq+p_HO*HwuS|yDXPSE!PBx#o<^xlQt`7Cx?D#9w{b=Mm z&9wn*II-L8@y83P>n}f2AbDy$Pbqc$_*3uah1!V|`=<AmzVR}pPBeKBrMxdksguaM zkbhUK-F_51b+CFAly-ZE?4bC8>r2Wzl2~Ng0e(I3lxM`eqIV-~XS5ST$pPB-O{Vr? zkOgR~XSyj2?9+;0|N4Hi_u&&bplU<72(&tUf@ez};FG7A#J7=7lom@v&oq7V?DTZ| z(IBhTj`2u6CwAD0^8~KrB|Kg7$@H52>-u1Mml0vR&2KQ_ur3@-39;MHI9HzdAorKw z*&#m3Gcs>pgEDn<(wpTI)~4>0V7GEjpSY;N%0Aiu-1B+AoKp13>mIxE%Cd$X`8b&_ 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	E_7M9OiK{ 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 zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L 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 JZC}*ze*tYpKpg-8 diff --git a/quad/sw/modular_quad_pid/bootimage/the_real_golden_boot(final_demo).bin b/quad/sw/modular_quad_pid/bootimage/the_real_golden_boot(final_demo).bin deleted file mode 100644 index 415f842b68669550922a9c08ebd56daccb103905..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2368340 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 zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- zkOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW z0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf4 z5|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDy zBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1T zKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i z1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+F zNk9^i1SA1TKoXDyBmqf45|9KW0ZBj-kOU+FNk9^i1SA1TKoXDyBmqf45|9KW0ZBj- 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 zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 zzz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS z0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGK zBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N% zFanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS z03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R z2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q` zi~u9R2rvSS03*N%FanGKBftnS0*nA7zz8q`i~u9R2rvSS03*N%FanGKBftnS0*nA7 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%0Aiu-1B+AoKp13>mIxE%Cd$X`8b&_ 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	E_7M9OiK{ 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 zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L zfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@ z1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14c zNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-LfCNZ@1W14cNPq-L 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 JZC}*ze*tYpKpg-8 diff --git a/quad/zybo_fsbl/.cproject b/quad/zybo_fsbl/.cproject new file mode 100644 index 000000000..96b7f268f --- /dev/null +++ b/quad/zybo_fsbl/.cproject @@ -0,0 +1,172 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?> + +<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> + <storageModule moduleId="org.eclipse.cdt.core.settings"> + <cconfiguration id="xilinx.gnu.arm.exe.debug.1095913674"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="xilinx.gnu.arm.exe.debug.1095913674" moduleId="org.eclipse.cdt.core.settings" name="Debug"> + <externalSettings/> + <extensions> + <extension id="com.xilinx.sdk.managedbuilder.XELF.arm" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="xilinx.gnu.arm.exe.debug.1095913674" name="Debug" parent="xilinx.gnu.arm.exe.debug"> + <folderInfo id="xilinx.gnu.arm.exe.debug.1095913674." name="/" resourcePath=""> + <toolChain id="xilinx.gnu.arm.exe.debug.toolchain.1495091907" name="Xilinx ARM GNU Toolchain" superClass="xilinx.gnu.arm.exe.debug.toolchain"> + <targetPlatform binaryParser="com.xilinx.sdk.managedbuilder.XELF.arm" id="xilinx.arm.target.gnu.base.debug.1385494210" isAbstract="false" name="Debug Platform" superClass="xilinx.arm.target.gnu.base.debug"/> + <builder buildPath="${workspace_loc:/zybo_fsbl}/Debug" enableAutoBuild="true" id="xilinx.gnu.arm.toolchain.builder.debug.1764009936" managedBuildOn="true" name="GNU make.Debug" superClass="xilinx.gnu.arm.toolchain.builder.debug"/> + <tool id="xilinx.gnu.arm.c.toolchain.assembler.debug.784701642" name="ARM gcc assembler" superClass="xilinx.gnu.arm.c.toolchain.assembler.debug"> + <inputType id="xilinx.gnu.assembler.input.149263609" superClass="xilinx.gnu.assembler.input"/> + </tool> + <tool id="xilinx.gnu.arm.c.toolchain.compiler.debug.746876285" name="ARM gcc compiler" superClass="xilinx.gnu.arm.c.toolchain.compiler.debug"> + <option defaultValue="gnu.c.optimization.level.none" id="xilinx.gnu.compiler.option.optimization.level.1762516004" superClass="xilinx.gnu.compiler.option.optimization.level" valueType="enumerated"/> + <option id="xilinx.gnu.compiler.option.debugging.level.12432481" superClass="xilinx.gnu.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/> + <option id="xilinx.gnu.compiler.inferred.swplatform.includes.1925642358" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath"> + <listOptionValue builtIn="false" value="../../zybo_fsbl_bsp/ps7_cortexa9_0/include"/> + </option> + <inputType id="xilinx.gnu.arm.c.compiler.input.615679645" name="C source files" superClass="xilinx.gnu.arm.c.compiler.input"/> + </tool> + <tool id="xilinx.gnu.arm.cxx.toolchain.compiler.debug.448393800" name="ARM g++ compiler" superClass="xilinx.gnu.arm.cxx.toolchain.compiler.debug"> + <option defaultValue="gnu.c.optimization.level.none" id="xilinx.gnu.compiler.option.optimization.level.2072947165" superClass="xilinx.gnu.compiler.option.optimization.level" valueType="enumerated"/> + <option id="xilinx.gnu.compiler.option.debugging.level.802066935" superClass="xilinx.gnu.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/> + <option id="xilinx.gnu.compiler.inferred.swplatform.includes.996461247" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath"> + <listOptionValue builtIn="false" value="../../zybo_fsbl_bsp/ps7_cortexa9_0/include"/> + </option> + </tool> + <tool id="xilinx.gnu.arm.toolchain.archiver.561831661" name="ARM archiver" superClass="xilinx.gnu.arm.toolchain.archiver"/> + <tool id="xilinx.gnu.arm.c.toolchain.linker.debug.1140156832" name="ARM gcc linker" superClass="xilinx.gnu.arm.c.toolchain.linker.debug"> + <option id="xilinx.gnu.linker.inferred.swplatform.lpath.206600314" superClass="xilinx.gnu.linker.inferred.swplatform.lpath" valueType="libPaths"> + <listOptionValue builtIn="false" value="../../zybo_fsbl_bsp/ps7_cortexa9_0/lib"/> + </option> + <option id="xilinx.gnu.linker.inferred.swplatform.flags.259030211" superClass="xilinx.gnu.linker.inferred.swplatform.flags" valueType="libs"> + <listOptionValue builtIn="false" value="-Wl,--start-group,-lxil,-lgcc,-lc,--end-group"/> + </option> + <option id="xilinx.gnu.c.linker.option.lscript.1792080823" superClass="xilinx.gnu.c.linker.option.lscript" value="../src/lscript.ld" valueType="string"/> + <option id="xilinx.gnu.c.link.option.libs.818426599" superClass="xilinx.gnu.c.link.option.libs" valueType="libs"> + <listOptionValue builtIn="false" value="rsa"/> + </option> + <option id="xilinx.gnu.c.link.option.paths.1047505068" superClass="xilinx.gnu.c.link.option.paths" valueType="libPaths"> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src}""/> + </option> + <inputType id="xilinx.gnu.linker.input.242892571" superClass="xilinx.gnu.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + <inputType id="xilinx.gnu.linker.input.lscript.1076594746" name="Linker Script" superClass="xilinx.gnu.linker.input.lscript"/> + </tool> + <tool id="xilinx.gnu.arm.cxx.toolchain.linker.debug.1477424574" name="ARM g++ linker" superClass="xilinx.gnu.arm.cxx.toolchain.linker.debug"> + <option id="xilinx.gnu.linker.inferred.swplatform.lpath.262394271" superClass="xilinx.gnu.linker.inferred.swplatform.lpath" valueType="libPaths"> + <listOptionValue builtIn="false" value="../../zybo_fsbl_bsp/ps7_cortexa9_0/lib"/> + </option> + <option id="xilinx.gnu.linker.inferred.swplatform.flags.1779540987" superClass="xilinx.gnu.linker.inferred.swplatform.flags" valueType="libs"> + <listOptionValue builtIn="false" value="-Wl,--start-group,-lxil,-lgcc,-lc,--end-group"/> + </option> + <option id="xilinx.gnu.c.linker.option.lscript.1319121983" superClass="xilinx.gnu.c.linker.option.lscript" value="../src/lscript.ld" valueType="string"/> + </tool> + <tool id="xilinx.gnu.arm.size.debug.1798332777" name="ARM Print Size" superClass="xilinx.gnu.arm.size.debug"/> + </toolChain> + </folderInfo> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + <cconfiguration id="xilinx.gnu.arm.exe.release.814061880"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="xilinx.gnu.arm.exe.release.814061880" moduleId="org.eclipse.cdt.core.settings" name="Release"> + <externalSettings/> + <extensions> + <extension id="com.xilinx.sdk.managedbuilder.XELF.arm" point="org.eclipse.cdt.core.BinaryParser"/> + <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="xilinx.gnu.arm.exe.release.814061880" name="Release" parent="xilinx.gnu.arm.exe.release"> + <folderInfo id="xilinx.gnu.arm.exe.release.814061880." name="/" resourcePath=""> + <toolChain id="xilinx.gnu.arm.exe.release.toolchain.1885549648" name="Xilinx ARM GNU Toolchain" superClass="xilinx.gnu.arm.exe.release.toolchain"> + <targetPlatform binaryParser="com.xilinx.sdk.managedbuilder.XELF.arm" id="xilinx.arm.target.gnu.base.release.137935617" isAbstract="false" name="Release Platform" superClass="xilinx.arm.target.gnu.base.release"/> + <builder buildPath="${workspace_loc:/zybo_fsbl}/Release" enableAutoBuild="true" id="xilinx.gnu.arm.toolchain.builder.release.1434062650" managedBuildOn="true" name="GNU make.Release" superClass="xilinx.gnu.arm.toolchain.builder.release"/> + <tool id="xilinx.gnu.arm.c.toolchain.assembler.release.683855377" name="ARM gcc assembler" superClass="xilinx.gnu.arm.c.toolchain.assembler.release"> + <inputType id="xilinx.gnu.assembler.input.1515182665" superClass="xilinx.gnu.assembler.input"/> + </tool> + <tool id="xilinx.gnu.arm.c.toolchain.compiler.release.61095803" name="ARM gcc compiler" superClass="xilinx.gnu.arm.c.toolchain.compiler.release"> + <option defaultValue="gnu.c.optimization.level.more" id="xilinx.gnu.compiler.option.optimization.level.523655412" superClass="xilinx.gnu.compiler.option.optimization.level" valueType="enumerated"/> + <option id="xilinx.gnu.compiler.option.debugging.level.1217635803" superClass="xilinx.gnu.compiler.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/> + <option id="xilinx.gnu.compiler.inferred.swplatform.includes.1793303383" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath"> + <listOptionValue builtIn="false" value="../../zybo_fsbl_bsp/ps7_cortexa9_0/include"/> + </option> + <inputType id="xilinx.gnu.arm.c.compiler.input.618317427" name="C source files" superClass="xilinx.gnu.arm.c.compiler.input"/> + </tool> + <tool id="xilinx.gnu.arm.cxx.toolchain.compiler.release.531055342" name="ARM g++ compiler" superClass="xilinx.gnu.arm.cxx.toolchain.compiler.release"> + <option defaultValue="gnu.c.optimization.level.more" id="xilinx.gnu.compiler.option.optimization.level.134065135" superClass="xilinx.gnu.compiler.option.optimization.level" valueType="enumerated"/> + <option id="xilinx.gnu.compiler.option.debugging.level.135946073" superClass="xilinx.gnu.compiler.option.debugging.level" value="gnu.c.debugging.level.none" valueType="enumerated"/> + <option id="xilinx.gnu.compiler.inferred.swplatform.includes.219603583" superClass="xilinx.gnu.compiler.inferred.swplatform.includes" valueType="includePath"> + <listOptionValue builtIn="false" value="../../zybo_fsbl_bsp/ps7_cortexa9_0/include"/> + </option> + </tool> + <tool id="xilinx.gnu.arm.toolchain.archiver.1778209873" name="ARM archiver" superClass="xilinx.gnu.arm.toolchain.archiver"/> + <tool id="xilinx.gnu.arm.c.toolchain.linker.release.428719172" name="ARM gcc linker" superClass="xilinx.gnu.arm.c.toolchain.linker.release"> + <option id="xilinx.gnu.linker.inferred.swplatform.lpath.1017119363" superClass="xilinx.gnu.linker.inferred.swplatform.lpath" valueType="libPaths"> + <listOptionValue builtIn="false" value="../../zybo_fsbl_bsp/ps7_cortexa9_0/lib"/> + </option> + <option id="xilinx.gnu.linker.inferred.swplatform.flags.547447494" superClass="xilinx.gnu.linker.inferred.swplatform.flags" valueType="libs"> + <listOptionValue builtIn="false" value="-Wl,--start-group,-lxil,-lgcc,-lc,--end-group"/> + </option> + <option id="xilinx.gnu.c.linker.option.lscript.886045196" superClass="xilinx.gnu.c.linker.option.lscript" value="../src/lscript.ld" valueType="string"/> + <option id="xilinx.gnu.c.link.option.libs.382270191" superClass="xilinx.gnu.c.link.option.libs" valueType="libs"> + <listOptionValue builtIn="false" value="rsa"/> + </option> + <option id="xilinx.gnu.c.link.option.paths.1921094164" superClass="xilinx.gnu.c.link.option.paths" valueType="libPaths"> + <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/src}""/> + </option> + <inputType id="xilinx.gnu.linker.input.1214532917" superClass="xilinx.gnu.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + <inputType id="xilinx.gnu.linker.input.lscript.68991746" name="Linker Script" superClass="xilinx.gnu.linker.input.lscript"/> + </tool> + <tool id="xilinx.gnu.arm.cxx.toolchain.linker.release.1302987809" name="ARM g++ linker" superClass="xilinx.gnu.arm.cxx.toolchain.linker.release"> + <option id="xilinx.gnu.linker.inferred.swplatform.lpath.2052014272" superClass="xilinx.gnu.linker.inferred.swplatform.lpath" valueType="libPaths"> + <listOptionValue builtIn="false" value="../../zybo_fsbl_bsp/ps7_cortexa9_0/lib"/> + </option> + <option id="xilinx.gnu.linker.inferred.swplatform.flags.1452375922" superClass="xilinx.gnu.linker.inferred.swplatform.flags" valueType="libs"> + <listOptionValue builtIn="false" value="-Wl,--start-group,-lxil,-lgcc,-lc,--end-group"/> + </option> + <option id="xilinx.gnu.c.linker.option.lscript.838846766" superClass="xilinx.gnu.c.linker.option.lscript" value="../src/lscript.ld" valueType="string"/> + </tool> + <tool id="xilinx.gnu.arm.size.release.1480800967" name="ARM Print Size" superClass="xilinx.gnu.arm.size.release"/> + </toolChain> + </folderInfo> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <project id="zybo_fsbl.xilinx.gnu.arm.exe.1904711785" name="Xilinx ARM Executable" projectType="xilinx.gnu.arm.exe"/> + </storageModule> + <storageModule moduleId="scannerConfiguration"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> + <scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.debug.1095913674;xilinx.gnu.arm.exe.debug.1095913674."> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/> + </scannerConfigBuildInfo> + <scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.release.814061880;xilinx.gnu.arm.exe.release.814061880."> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/> + </scannerConfigBuildInfo> + <scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.debug.1095913674;xilinx.gnu.arm.exe.debug.1095913674.;xilinx.gnu.arm.c.toolchain.compiler.debug.746876285;xilinx.gnu.arm.c.compiler.input.615679645"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/> + </scannerConfigBuildInfo> + <scannerConfigBuildInfo instanceId="xilinx.gnu.arm.exe.release.814061880;xilinx.gnu.arm.exe.release.814061880.;xilinx.gnu.arm.c.toolchain.compiler.release.61095803;xilinx.gnu.arm.c.compiler.input.618317427"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="com.xilinx.managedbuilder.ui.ARMGCCManagedMakePerProjectProfileC"/> + </scannerConfigBuildInfo> + </storageModule> +</cproject> diff --git a/quad/zybo_fsbl/.gitignore b/quad/zybo_fsbl/.gitignore new file mode 100644 index 000000000..cd9403fc0 --- /dev/null +++ b/quad/zybo_fsbl/.gitignore @@ -0,0 +1,2 @@ +bootimage/ +Debug/ diff --git a/quad/zybo_fsbl/.project b/quad/zybo_fsbl/.project new file mode 100644 index 000000000..bc2d38219 --- /dev/null +++ b/quad/zybo_fsbl/.project @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>zybo_fsbl</name> + <comment>zybo_fsbl_bsp - ps7_cortexa9_0</comment> + <projects> + <project>zybo_fsbl_bsp</project> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <triggers>full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/quad/zybo_fsbl/src/ddr_init.c b/quad/zybo_fsbl/src/ddr_init.c new file mode 100644 index 000000000..bf9a059a6 --- /dev/null +++ b/quad/zybo_fsbl/src/ddr_init.c @@ -0,0 +1,291 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file ddr_init.c +* +* Initialize the DDR controller. When PCW is functioning, this would be gone. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 06/19/09 First release +* 2.00a jz 05/11/11 Changed register to #defines, updated to peep11 +* 3.00a mb 30/05/12 included fsbl.h +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_io.h" +#include "fsbl.h" + +/************************** Constant Definitions *****************************/ +#define DDR_CONFIG_BASE (XPS_DDR_CTRL_BASEADDR + 0x000) + +#define DDR_MSTR_CTRL_REG (XPS_DDR_CTRL_BASEADDR + 0x000) + +#define DDR_TWORANKPHY_REG (XPS_DDR_CTRL_BASEADDR + 0x004) + +#define DDR_HPR_PARAMS_REG (XPS_DDR_CTRL_BASEADDR + 0x008) +#define DDR_LPR_PARAMS_REG (XPS_DDR_CTRL_BASEADDR + 0x00C) +#define DDR_W_PARAMS_REG (XPS_DDR_CTRL_BASEADDR + 0x010) +#define DDR_DRAM_PARAMS_1_REG (XPS_DDR_CTRL_BASEADDR + 0x014) +#define DDR_DRAM_PARAMS_2_REG (XPS_DDR_CTRL_BASEADDR + 0x018) +#define DDR_DRAM_PARAMS_3_REG (XPS_DDR_CTRL_BASEADDR + 0x01C) +#define DDR_DRAM_PARAMS_4_REG (XPS_DDR_CTRL_BASEADDR + 0x020) +#define DDR_DRAM_PARAMS_5_REG (XPS_DDR_CTRL_BASEADDR + 0x024) +#define DDR_DRAM_INIT_PARAMS_REG (XPS_DDR_CTRL_BASEADDR + 0x028) + +#define DDR_DRAM_MODE_1_REG (XPS_DDR_CTRL_BASEADDR + 0x02C) +#define DDR_DRAM_MODE_2_REG (XPS_DDR_CTRL_BASEADDR + 0x030) +#define DDR_DRAM_BURST8_REG (XPS_DDR_CTRL_BASEADDR + 0x034) + +#define DDR_DEBUG_REG (XPS_DDR_CTRL_BASEADDR + 0x038) + +#define DDR_ADDR_MAP_1_REG (XPS_DDR_CTRL_BASEADDR + 0x03C) +#define DDR_ADDR_MAP_2_REG (XPS_DDR_CTRL_BASEADDR + 0x040) +#define DDR_ADDR_MAP_3_REG (XPS_DDR_CTRL_BASEADDR + 0x044) + +#define DDR_ODT_RD_WR_REG (XPS_DDR_CTRL_BASEADDR + 0x048) +#define DDR_PHY_RDC_FIFO_CTRL_REG (XPS_DDR_CTRL_BASEADDR + 0x04C) +#define DDR_REG_PHY_RDC_FIFO_CTRL (XPS_DDR_CTRL_BASEADDR + 0x050) +#define DDR_STATUS_REG (XPS_DDR_CTRL_BASEADDR + 0x054) + +#define DDR_DLL_CALIB_REG (XPS_DDR_CTRL_BASEADDR + 0x058) +#define DDR_ODT_REG (XPS_DDR_CTRL_BASEADDR + 0x05C) +#define DDR_MISC_1_REG (XPS_DDR_CTRL_BASEADDR + 0x060) +#define DDR_MISC_2_REG (XPS_DDR_CTRL_BASEADDR + 0x064) + +#define DDR_WR_DLL_FORCE (XPS_DDR_CTRL_BASEADDR + 0x068) +#define DDR_RD_DLL_FORCE0_REG (XPS_DDR_CTRL_BASEADDR + 0x06C) +#define DDR_RD_DLL_FORCE1_REG (XPS_DDR_CTRL_BASEADDR + 0x070) + +#define DDR_WR_RATIO_REG (XPS_DDR_CTRL_BASEADDR + 0x074) +#define DDR_RD_RATIO_REG (XPS_DDR_CTRL_BASEADDR + 0x078) + +#define DDR_MSTR_DLL_STATUS1_REG (XPS_DDR_CTRL_BASEADDR + 0x07C) +#define DDR_RD_SLAVE_STATUS0_REG (XPS_DDR_CTRL_BASEADDR + 0x080) +#define DDR_RD_SLAVE_STATUS1_REG (XPS_DDR_CTRL_BASEADDR + 0x084) + +#define DDR_OF_STATUS0_REG (XPS_DDR_CTRL_BASEADDR + 0x088) +#define DDR_OF_STATUS1_REG (XPS_DDR_CTRL_BASEADDR + 0x08C) +#define DDR_OF_STATUS2_REG (XPS_DDR_CTRL_BASEADDR + 0x090) +#define DDR_OF_STATUS3_REG (XPS_DDR_CTRL_BASEADDR + 0x094) + +#define DDR_MSTR_DLL_STATUS2_REG (XPS_DDR_CTRL_BASEADDR + 0x098) + +#define DDR_Wr_DLL_FORCE1_REG (XPS_DDR_CTRL_BASEADDR + 0x09C) +#define DDR_REFRESH_TIMER01_REG (XPS_DDR_CTRL_BASEADDR + 0x0A0) +#define DDR_T_ZQ_REG (XPS_DDR_CTRL_BASEADDR + 0x0A4) +#define DDR_T_ZQ_SHORT_INTERVAL_REG (XPS_DDR_CTRL_BASEADDR + 0x0A8) + +#define DDR_STATUS_DATA_SL_DLL_01_REG (XPS_DDR_CTRL_BASEADDR + 0x0AC) +#define DDR_STATUS_DATA_SL_DLL_23_REG (XPS_DDR_CTRL_BASEADDR + 0x0B0) +#define DDR_STATUS_DQS_SL_DLL_01_REG (XPS_DDR_CTRL_BASEADDR + 0x0B4) +#define DDR_STATUS_DQS_SL_DLL_23_REG (XPS_DDR_CTRL_BASEADDR + 0x0B8) + +#define DDR_WR_DATA_SLV0_REG (XPS_DDR_CTRL_BASEADDR + 0x17c) +#define DDR_WR_DATA_SLV1_REG (XPS_DDR_CTRL_BASEADDR + 0x180) +#define DDR_WR_DATA_SLV2_REG (XPS_DDR_CTRL_BASEADDR + 0x184) +#define DDR_WR_DATA_SLV3_REG (XPS_DDR_CTRL_BASEADDR + 0x188) + +#define DDR_ID_REG (XPS_DDR_CTRL_BASEADDR + 0x200) +#define DDR_DDR_CFG_REG (XPS_DDR_CTRL_BASEADDR + 0x204) + +#define DDR_PRIO_WR_PORT00_REG (XPS_DDR_CTRL_BASEADDR + 0x208) +#define DDR_PRIO_WR_PORT01_REG (XPS_DDR_CTRL_BASEADDR + 0x20C) +#define DDR_PRIO_WR_PORT02_REG (XPS_DDR_CTRL_BASEADDR + 0x210) +#define DDR_PRIO_WR_PORT03_REG (XPS_DDR_CTRL_BASEADDR + 0x214) +#define DDR_PRIO_RD_PORT00_REG (XPS_DDR_CTRL_BASEADDR + 0x218) +#define DDR_PRIO_RD_PORT01_REG (XPS_DDR_CTRL_BASEADDR + 0x21C) +#define DDR_PRIO_RD_PORT02_REG (XPS_DDR_CTRL_BASEADDR + 0x220) +#define DDR_PRIO_RD_PORT03_REG (XPS_DDR_CTRL_BASEADDR + 0x224) + +#define DDR_PERF_MON_1_PORT0_REG (XPS_DDR_CTRL_BASEADDR + 0x228) +#define DDR_PERF_MON_1_PORT1_REG (XPS_DDR_CTRL_BASEADDR + 0x22C) +#define DDR_PERF_MON_1_PORT2_REG (XPS_DDR_CTRL_BASEADDR + 0x230) +#define DDR_PERF_MON_1_PORT3_REG (XPS_DDR_CTRL_BASEADDR + 0x234) +#define DDR_PERF_MON_2_PORT0_REG (XPS_DDR_CTRL_BASEADDR + 0x238) +#define DDR_PERF_MON_2_PORT1_REG (XPS_DDR_CTRL_BASEADDR + 0x23C) +#define DDR_PERF_MON_2_PORT2_REG (XPS_DDR_CTRL_BASEADDR + 0x240) +#define DDR_PERF_MON_2_PORT3_REG (XPS_DDR_CTRL_BASEADDR + 0x244) +#define DDR_PERF_MON_3_PORT0_REG (XPS_DDR_CTRL_BASEADDR + 0x248) +#define DDR_PERF_MON_3_PORT1_REG (XPS_DDR_CTRL_BASEADDR + 0x24C) +#define DDR_PERF_MON_3_PORT2_REG (XPS_DDR_CTRL_BASEADDR + 0x250) +#define DDR_PERF_MON_3_PORT3_REG (XPS_DDR_CTRL_BASEADDR + 0x254) +#define DDR_TRUSTED_MEM_CFG_REG (XPS_DDR_CTRL_BASEADDR + 0x258) + +#define DDR_EXCLACC_CFG_PORT0_REG (XPS_DDR_CTRL_BASEADDR + 0x25C) +#define DDR_EXCLACC_CFG_PORT1_REG (XPS_DDR_CTRL_BASEADDR + 0x260) +#define DDR_EXCLACC_CFG_PORT2_REG (XPS_DDR_CTRL_BASEADDR + 0x264) +#define DDR_EXCLACC_CFG_PORT3_REG (XPS_DDR_CTRL_BASEADDR + 0x268) + +/* Trust zone configuration register */ +#define SLCR_LOCK_REG (XPS_SYS_CTRL_BASEADDR + 0x4) +#define SLCR_UNLOCK_REG (XPS_SYS_CTRL_BASEADDR + 0x8) +#define TZ_DDR_RAM_REG (XPS_SYS_CTRL_BASEADDR + 0x430) + + +/* Mask defines */ +#define DDR_OUT_RESET_MASK 0x1 + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ +#define DDRIn32 Xil_In32 +#define DDROut32 Xil_Out32 +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void init_ddr(void); + +#define DDRIn32 Xil_In32 +#define DDROut32 Xil_Out32 + +static int verify = 0; + +static void NewDDROut32(u32 Address, u32 Value) +{ + u32 Data; + + if (verify) { + Data = DDRIn32(Address); + if (Data != Value) fsbl_printf(DEBUG_INFO,"Verify failed, Address = %08X, \ + Data = %08X, Expected = %08X\n\r", Address, Data, Value); + } else + DDROut32(Address, Value); +} + +#undef DDROut32 +#define DDROut32 NewDDROut32 + +void init_ddr(void) +{ + u32 RegValue; + + RegValue = DDRIn32(DDR_MSTR_CTRL_REG); + + /* If DDR is being taking out of reset, then it has been configured + */ + if (RegValue & DDR_OUT_RESET_MASK) + verify = 1; + + /* Configure DDR */ + DDROut32(DDR_MSTR_CTRL_REG, 0x00000200); + + /* direct rip of the DDR init tcl for the PEEP startup */ + DDROut32(DDR_TWORANKPHY_REG, 0x000C1061); /* # 0 */ + + DDROut32(DDR_LPR_PARAMS_REG, 0x03001001); //;#3 + DDROut32(DDR_W_PARAMS_REG, 0x00014001); //;#4 + + DDROut32(DDR_DRAM_PARAMS_1_REG, 0x0004e020); //; #5 + +#ifdef PEEP_CODE + DDROut32(DDR_DRAM_PARAMS_2_REG, 0x36264ccf); //; #6 +#else + DDROut32(DDR_DRAM_PARAMS_2_REG, 0x349B48CD); //; #6 +#endif + DDROut32(DDR_DRAM_PARAMS_3_REG, 0x820158a4); //; #7 + + DDROut32(DDR_DRAM_PARAMS_4_REG, 0x250882c4); //; #8 + + DDROut32(DDR_DRAM_INIT_PARAMS_REG, 0x00809004); //; #10 + + DDROut32(DDR_DRAM_MODE_1_REG, 0x0); //; #11 + + DDROut32(DDR_DRAM_MODE_2_REG, 0x00040952); //; #12 + + DDROut32(DDR_DRAM_BURST8_REG, 0x00020022); //; #13 + +#ifdef PEEP_CODE + DDROut32(DDR_ADDR_MAP_1_REG, 0xF88); //; #15 +#endif + +#ifdef PALLADIUM + DDROut32(DDR_ADDR_MAP_1_REG, 0x777); //; #15 +#endif + + DDROut32(DDR_ADDR_MAP_2_REG, 0xFF000000); //; #16 + + DDROut32(DDR_ADDR_MAP_3_REG, 0x0FF66666); //; #17 + + DDROut32(DDR_REG_PHY_RDC_FIFO_CTRL, 0x256); //; #20 + + DDROut32(DDR_ODT_REG, 0x2223); //; #23 + + DDROut32(DDR_MISC_2_REG, 0x00020FE0); //; #25 + + DDROut32(DDR_T_ZQ_REG, 0x10200800); //; #41 + + DDROut32(DDR_STATUS_DQS_SL_DLL_23_REG, 0x200065); //; #46 + + DDROut32(DDR_WR_DATA_SLV0_REG, 0x50); //; #95 + + DDROut32(DDR_WR_DATA_SLV1_REG, 0x50); //; #96 + + DDROut32(DDR_WR_DATA_SLV2_REG, 0x50); //; #97 + + DDROut32(DDR_WR_DATA_SLV3_REG, 0x50); //; #98 + + DDROut32(DDR_ID_REG, 0x0); //; #128 + + /* Enable ddr controller by taking the controller out of reset */ + DDROut32(DDR_MSTR_CTRL_REG, + DDRIn32(DDR_MSTR_CTRL_REG) | DDR_OUT_RESET_MASK); + +#ifdef PALLADIUM + + /* Workaround for early palladium, to be removed for 4.61 */ + DDROut32(SLCR_UNLOCK_REG, 0xDF0D); + + DDROut32(TZ_DDR_RAM_REG, 0xffffffff); + + DDROut32(SLCR_LOCK_REG, 0x767B); + +#endif /* PALLADIUM*/ +} diff --git a/quad/zybo_fsbl/src/diskio.h b/quad/zybo_fsbl/src/diskio.h new file mode 100644 index 000000000..5244efd77 --- /dev/null +++ b/quad/zybo_fsbl/src/diskio.h @@ -0,0 +1,51 @@ +/*----------------------------------------------------------------------- +/ Low level disk interface modlue include file (C)ChaN, 2009 +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO +#define _DISKIO + +#include "integer.h" + + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + +int assign_drives (int, int); +DSTATUS disk_initialize (BYTE); +DSTATUS disk_status (BYTE); +DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); +DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); +DRESULT disk_ioctl (BYTE, BYTE, void*); + + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (mandatory for FatFs) */ +#define CTRL_SYNC 0 /* Flush disk cache (for write functions) */ +#define GET_SECTOR_COUNT 1 /* Get media size (for only f_mkfs()) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (for multiple sector size (_MAX_SS >= 1024)) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (for only f_mkfs()) */ + +#endif diff --git a/quad/zybo_fsbl/src/ff.c b/quad/zybo_fsbl/src/ff.c new file mode 100644 index 000000000..35bfa7e50 --- /dev/null +++ b/quad/zybo_fsbl/src/ff.c @@ -0,0 +1,3756 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.08a (C)ChaN, 2010 +/-----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2010, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Feb 26,'06 R0.00 Prototype. +/ +/ Apr 29,'06 R0.01 First stable version. +/ +/ Jun 01,'06 R0.02 Added FAT12 support. +/ Removed unbuffered mode. +/ Fixed a problem on small (<32M) partition. +/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). +/ +/ Sep 22,'06 R0.03 Added f_rename(). +/ Changed option _FS_MINIMUM to _FS_MINIMIZE. +/ Dec 11,'06 R0.03a Improved cluster scan algorithm to write files fast. +/ Fixed f_mkdir() creates incorrect directory on FAT32. +/ +/ Feb 04,'07 R0.04 Supported multiple drive system. +/ Changed some interfaces for multiple drive system. +/ Changed f_mountdrv() to f_mount(). +/ Added f_mkfs(). +/ Apr 01,'07 R0.04a Supported multiple partitions on a physical drive. +/ Added a capability of extending file size to f_lseek(). +/ Added minimization level 3. +/ Fixed an endian sensitive code in f_mkfs(). +/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. +/ Added FSInfo support. +/ Fixed DBCS name can result FR_INVALID_NAME. +/ Fixed short seek (<= csize) collapses the file object. +/ +/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). +/ Fixed f_mkfs() on FAT32 creates incorrect FSInfo. +/ Fixed f_mkdir() on FAT32 creates incorrect directory. +/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). +/ Fixed off by one error at FAT sub-type determination. +/ Fixed btr in f_read() can be mistruncated. +/ Fixed cached sector is not flushed when create and close without write. +/ +/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). +/ Improved performance of f_lseek() on moving to the same or following cluster. +/ +/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a buffer configuration option. (_FS_TINY) +/ Added long file name support. +/ Added multiple code page support. +/ Added re-entrancy for multitask operation. +/ Added auto cluster size selection to f_mkfs(). +/ Added rewind option to f_readdir(). +/ Changed result code of critical errors. +/ Renamed string functions to avoid name collision. +/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. +/ Added multiple sector size support. +/ Jun 21,'09 R0.07c Fixed f_unlink() can return FR_OK on error. +/ Fixed wrong cache control in f_lseek(). +/ Added relative path feature. +/ Added f_chdir() and f_chdrive(). +/ Added proper case conversion to extended char. +/ Nov 03,'09 R0.07e Separated out configuration options from ff.h to ffconf.h. +/ Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. +/ Fixed name matching error on the 13 char boundary. +/ Added a configuration option, _LFN_UNICODE. +/ Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. +/ +/ May 15,'10 R0.08 Added a memory configuration option. (_USE_LFN = 3) +/ Added file lock feature. (_FS_SHARE) +/ Added fast seek feature. (_USE_FASTSEEK) +/ Changed some types on the API, XCHAR->TCHAR. +/ Changed fname member in the FILINFO structure on Unicode cfg. +/ String functions support UTF-8 encoding files on Unicode cfg. +/ Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2) +/ Added sector erase feature. (_USE_ERASE) +/ Moved file lock semaphore table from fs object to the bss. +/ Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. +/ Fixed f_mkfs() creates wrong FAT32 volume. +/---------------------------------------------------------------------------*/ +#include "xparameters.h" +#ifdef XPAR_PS7_SD_0_S_AXI_BASEADDR +#include "ff.h" /* FatFs configurations and declarations */ +#include "diskio.h" /* Declarations of low level disk I/O functions */ + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FATFS != 8255 +#error Wrong include file (ff.h). +#endif + + +/* Definitions on sector size */ +#if _MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096 +#error Wrong sector size. +#endif +#if _MAX_SS != 512 +#define SS(fs) ((fs)->ssize) /* Multiple sector size */ +#else +#define SS(fs) 512U /* Fixed sector size */ +#endif + + +/* Reentrancy related */ +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area must not be used in re-entrant configuration. +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res +#endif + +#define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); } + + +/* File shareing feature */ +#if _FS_SHARE +#if _FS_READONLY +#error _FS_SHARE must be 0 on read-only cfg. +#endif +typedef struct { + FATFS *fs; /* File ID 1, volume (NULL:blank entry) */ + DWORD clu; /* File ID 2, directory */ + WORD idx; /* File ID 3, directory index */ + WORD ctr; /* File open counter, 0:none, 0x01..0xFF:read open count, 0x100:write mode */ +} FILESEM; +#endif + + +/* Misc definitions */ +#define LD_CLUST(dir) (((DWORD)LD_WORD(dir+DIR_FstClusHI)<<16) | LD_WORD(dir+DIR_FstClusLO)) +#define ST_CLUST(dir,cl) {ST_WORD(dir+DIR_FstClusLO, cl); ST_WORD(dir+DIR_FstClusHI, (DWORD)cl>>16);} + + +/* Character code support macros */ +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) +#define IsDigit(c) (((c)>='0')&&((c)<='9')) + +#if _DF1S /* Code page is DBCS */ + +#ifdef _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#ifdef _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* Code page is SBCS */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + +/* Name status flags */ +#define NS 11 /* Offset of name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ + + +/* FAT sub-type boundaries */ +/* Note that the FAT spec by Microsoft says 4085 but Windows works with 4087! */ +#define MIN_FAT16 4086 /* Minimum number of clusters for FAT16 */ +#define MIN_FAT32 65526 /* Minimum number of clusters for FAT32 */ + + +/* FatFs refers the members in the FAT structures as byte array instead of +/ structure member because there are incompatibility of the packing option +/ between compilers. */ + +#define BS_jmpBoot 0 +#define BS_OEMName 3 +#define BPB_BytsPerSec 11 +#define BPB_SecPerClus 13 +#define BPB_RsvdSecCnt 14 +#define BPB_NumFATs 16 +#define BPB_RootEntCnt 17 +#define BPB_TotSec16 19 +#define BPB_Media 21 +#define BPB_FATSz16 22 +#define BPB_SecPerTrk 24 +#define BPB_NumHeads 26 +#define BPB_HiddSec 28 +#define BPB_TotSec32 32 +#define BS_DrvNum 36 +#define BS_BootSig 38 +#define BS_VolID 39 +#define BS_VolLab 43 +#define BS_FilSysType 54 +#define BPB_FATSz32 36 +#define BPB_ExtFlags 40 +#define BPB_FSVer 42 +#define BPB_RootClus 44 +#define BPB_FSInfo 48 +#define BPB_BkBootSec 50 +#define BS_DrvNum32 64 +#define BS_BootSig32 66 +#define BS_VolID32 67 +#define BS_VolLab32 71 +#define BS_FilSysType32 82 +#define FSI_LeadSig 0 +#define FSI_StrucSig 484 +#define FSI_Free_Count 488 +#define FSI_Nxt_Free 492 +#define MBR_Table 446 +#define BS_55AA 510 + +#define DIR_Name 0 +#define DIR_Attr 11 +#define DIR_NTres 12 +#define DIR_CrtTime 14 +#define DIR_CrtDate 16 +#define DIR_FstClusHI 20 +#define DIR_WrtTime 22 +#define DIR_WrtDate 24 +#define DIR_FstClusLO 26 +#define DIR_FileSize 28 +#define LDIR_Ord 0 +#define LDIR_Attr 11 +#define LDIR_Type 12 +#define LDIR_Chksum 13 +#define LDIR_FstClusLO 26 + + + +/*------------------------------------------------------------*/ +/* Work area */ + +#if _VOLUMES +static +FATFS *FatFs[_VOLUMES]; /* Pointer to the file system objects (logical drives) */ +#else +#error Number of drives must not be 0. +#endif + +static +WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH +static +BYTE CurrVol; /* Current drive */ +#endif + +#if _FS_SHARE +static +FILESEM Files[_FS_SHARE]; /* File lock semaphores */ +#endif + +#if _USE_LFN == 0 /* No LFN */ +#define DEF_NAMEBUF BYTE sfn[12] +#define INIT_BUF(dobj) (dobj).fn = sfn +#define FREE_BUF() + +#elif _USE_LFN == 1 /* LFN with static LFN working buffer */ +static WCHAR LfnBuf[_MAX_LFN+1]; +#define DEF_NAMEBUF BYTE sfn[12] +#define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = LfnBuf; } +#define FREE_BUF() + +#elif _USE_LFN == 2 /* LFN with dynamic LFN working buffer on the stack */ +#define DEF_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1] +#define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = lbuf; } +#define FREE_BUF() + +#elif _USE_LFN == 3 /* LFN with dynamic LFN working buffer on the heap */ +#define DEF_NAMEBUF BYTE sfn[12]; WCHAR *lfn +#define INIT_BUF(dobj) { lfn = ff_memalloc((_MAX_LFN + 1) * 2); \ + if (!lfn) LEAVE_FF((dobj).fs, FR_NOT_ENOUGH_CORE); \ + (dobj).lfn = lfn; (dobj).fn = sfn; } +#define FREE_BUF() ff_memfree(lfn) + +#else +#error Wrong LFN configuration. +#endif + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, UINT cnt) { + BYTE *d = (BYTE*)dst; + const BYTE *s = (const BYTE*)src; + +#if _WORD_ACCESS == 1 + while (cnt >= sizeof(int)) { + *(int*)d = *(int*)s; + d += sizeof(int); s += sizeof(int); + cnt -= sizeof(int); + } +#endif + while (cnt--) + *d++ = *s++; +} + +/* Fill memory */ +static +void mem_set (void* dst, int val, UINT cnt) { + BYTE *d = (BYTE*)dst; + + while (cnt--) + *d++ = (BYTE)val; +} + +/* Compare memory to memory */ +static +int mem_cmp (const void* dst, const void* src, UINT cnt) { + const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; + int r = 0; + + while (cnt-- && (r = *d++ - *s++) == 0) ; + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { + while (*str && *str != chr) str++; + return *str; +} + + + +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT + +static +int lock_fs ( + FATFS *fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS *fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (res != FR_NOT_ENABLED && + res != FR_INVALID_DRIVE && + res != FR_INVALID_OBJECT && + res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* File shareing control functions */ +/*-----------------------------------------------------------------------*/ +#if _FS_SHARE + +static +FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dj, /* Directory object pointing the file to be checked */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i, be; + + /* Search file semaphore table */ + for (i = be = 0; i < _FS_SHARE; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dj->fs && /* Check if the file matched with an open file */ + Files[i].clu == dj->sclust && + Files[i].idx == dj->index) break; + } else { /* Blank entry */ + be++; + } + } + if (i == _FS_SHARE) /* The file is not opened */ + return (be || acc == 2) ? FR_OK : FR_TOO_MANY_OPEN_FILES; /* Is there a blank entry for new file? */ + + /* The file has been opened. Reject any open against writing file and all write mode open */ + return (acc || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static +int enq_lock ( /* Check if an entry is available for a new file */ + FATFS* fs /* File system object */ +) +{ + UINT i; + + for (i = 0; i < _FS_SHARE && Files[i].fs; i++) ; + return (i == _FS_SHARE) ? 0 : 1; +} + + +static +UINT inc_lock ( /* Increment file open counter and returns its index (0:int error) */ + DIR* dj, /* Directory object pointing the file to register or increment */ + int acc /* Desired access mode (0:Read, !0:Write) */ +) +{ + UINT i; + + + for (i = 0; i < _FS_SHARE; i++) { /* Find the file */ + if (Files[i].fs == dj->fs && + Files[i].clu == dj->sclust && + Files[i].idx == dj->index) break; + } + + if (i == _FS_SHARE) { /* Not opened. Register it as new. */ + for (i = 0; i < _FS_SHARE && Files[i].fs; i++) ; + if (i == _FS_SHARE) return 0; /* No space to register (int err) */ + Files[i].fs = dj->fs; + Files[i].clu = dj->sclust; + Files[i].idx = dj->index; + Files[i].ctr = 0; + } + + if (acc && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; +} + + +static +FRESULT dec_lock ( /* Decrement file open counter */ + UINT i /* Semaphore index */ +) +{ + WORD n; + FRESULT res; + + + if (--i < _FS_SHARE) { + n = Files[i].ctr; + if (n == 0x100) n = 0; + if (n) n--; + Files[i].ctr = n; + if (!n) Files[i].fs = 0; + res = FR_OK; + } else { + res = FR_INT_ERR; + } + return res; +} + + +static +void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < _FS_SHARE; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Change window offset */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT move_window ( + FATFS *fs, /* File system object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) /* Move to zero only writes back dirty window */ +{ + DWORD wsect; + + wsect = fs->winsect; + if (wsect != sector) { /* Changed current window */ +#if !_FS_READONLY + if (fs->wflag) { /* Write back dirty window if needed */ + if (disk_write(fs->drv, fs->win, wsect, 1) != RES_OK) + return FR_DISK_ERR; + fs->wflag = 0; + if (wsect < (fs->fatbase + fs->fsize)) { /* In FAT area */ + BYTE nf; + for (nf = fs->n_fats; nf > 1; nf--) { /* Reflect the change to all FAT copies */ + wsect += fs->fsize; + disk_write(fs->drv, fs->win, wsect, 1); + } + } + } +#endif + if (sector) { + if (disk_read(fs->drv, fs->win, sector, 1) != RES_OK) + return FR_DISK_ERR; + fs->winsect = sector; + } + } + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Clean-up cached data */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync ( /* FR_OK: successful, FR_DISK_ERR: failed */ + FATFS *fs /* File system object */ +) +{ + FRESULT res; + + + res = move_window(fs, 0); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag) { + fs->winsect = 0; + mem_set(fs->win, 0, 512); + ST_WORD(fs->win+BS_55AA, 0xAA55); + ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); + ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); + ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); + ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); + disk_write(fs->drv, fs->win, fs->fsi_sector, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drv, CTRL_SYNC, (void*)0) != RES_OK) + res = FR_DISK_ERR; + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + + +DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= (fs->n_fatent - 2)) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + + +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, Else:Cluster status */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to get the link information */ +) +{ + UINT wc, bc; + BYTE *p; + + + if (clst < 2 || clst >= fs->n_fatent) /* Chack range */ + return 1; + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs)))) break; + wc = fs->win[bc % SS(fs)]; bc++; + if (move_window(fs, fs->fatbase + (bc / SS(fs)))) break; + wc |= fs->win[bc % SS(fs)] << 8; + return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2)))) break; + p = &fs->win[clst * 2 % SS(fs)]; + return LD_WORD(p); + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4)))) break; + p = &fs->win[clst * 4 % SS(fs)]; + return LD_DWORD(p) & 0x0FFFFFFF; + } + + return 0xFFFFFFFF; /* An error occurred at the disk I/O layer */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY + +FRESULT put_fat ( + FATFS *fs, /* File system object */ + DWORD clst, /* Cluster# to be changed in range of 2 to fs->n_fatent - 1 */ + DWORD val /* New value to mark the cluster */ +) +{ + UINT bc; + BYTE *p; + FRESULT res; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + res = FR_INT_ERR; + + } else { + switch (fs->fs_type) { + case FS_FAT12 : + bc = clst; bc += bc / 2; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc % SS(fs)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + bc++; + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc % SS(fs)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + break; + + case FS_FAT16 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + p = &fs->win[clst * 2 % SS(fs)]; + ST_WORD(p, (WORD)val); + break; + + case FS_FAT32 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + p = &fs->win[clst * 4 % SS(fs)]; + val |= LD_DWORD(p) & 0xF0000000; + ST_DWORD(p, val); + break; + + default : + res = FR_INT_ERR; + } + fs->wflag = 1; + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT remove_chain ( + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to remove a chain from */ +) +{ + FRESULT res; + DWORD nxt; +#if _USE_ERASE + DWORD scl = clst, ecl = clst, resion[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + res = FR_INT_ERR; + + } else { + res = FR_OK; + while (clst < fs->n_fatent) { /* Not a last link? */ + nxt = get_fat(fs, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) { res = FR_INT_ERR; break; } /* Internal error? */ + if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } /* Disk error? */ + res = put_fat(fs, clst, 0); /* Mark the cluster "empty" */ + if (res != FR_OK) break; + if (fs->free_clust != 0xFFFFFFFF) { /* Update FSInfo */ + fs->free_clust++; + fs->fsi_flag = 1; + } +#if _USE_ERASE + if (ecl + 1 == nxt) { /* Next cluster is contiguous */ + ecl = nxt; + } else { /* End of contiguous clusters */ + resion[0] = clust2sect(fs, scl); /* Start sector */ + resion[1] = clust2sect(fs, ecl) + fs->csize - 1; /* End sector */ + disk_ioctl(fs->drv, CTRL_ERASE_SECTOR, resion); /* Erase the block */ + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch or Create a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clust; /* Get suggested start point */ + if (!scl || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch the current chain */ + cs = get_fat(fs, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* It is an invalid cluster */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; + } + + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Wrap around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster */ + } + cs = get_fat(fs, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 0xFFFFFFFF || cs == 1)/* An error occurred */ + return cs; + if (ncl == scl) return 0; /* No free cluster */ + } + + res = put_fat(fs, ncl, 0x0FFFFFFF); /* Mark the new cluster "last link" */ + if (res == FR_OK && clst != 0) { + res = put_fat(fs, clst, ncl); /* Link it to the previous one if needed */ + } + if (res == FR_OK) { + fs->last_clust = ncl; /* Update FSINFO */ + if (fs->free_clust != 0xFFFFFFFF) { + fs->free_clust--; + fs->fsi_flag = 1; + } + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; + } + + return ncl; /* Return new cluster number or error code */ +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_sdi ( + DIR *dj, /* Pointer to directory object */ + WORD idx /* Directory index number */ +) +{ + DWORD clst; + WORD ic; + + + dj->index = idx; + clst = dj->sclust; + if (clst == 1 || clst >= dj->fs->n_fatent) /* Check start cluster range */ + return FR_INT_ERR; + if (!clst && dj->fs->fs_type == FS_FAT32) /* Replace cluster# 0 with root cluster# if in FAT32 */ + clst = dj->fs->dirbase; + + if (clst == 0) { /* Static table (root-dir in FAT12/16) */ + dj->clust = clst; + if (idx >= dj->fs->n_rootdir) /* Index is out of range */ + return FR_INT_ERR; + dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / 32); /* Sector# */ + } + else { /* Dynamic table (sub-dirs or root-dir in FAT32) */ + ic = SS(dj->fs) / 32 * dj->fs->csize; /* Entries per cluster */ + while (idx >= ic) { /* Follow cluster chain */ + clst = get_fat(dj->fs, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= dj->fs->n_fatent) /* Reached to end of table or int error */ + return FR_INT_ERR; + idx -= ic; + } + dj->clust = clst; + dj->sect = clust2sect(dj->fs, clst) + idx / (SS(dj->fs) / 32); /* Sector# */ + } + + dj->dir = dj->fs->win + (idx % (SS(dj->fs) / 32)) * 32; /* Ptr to the entry in the sector */ + + return FR_OK; /* Seek succeeded */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not stretch */ + DIR *dj, /* Pointer to directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD clst; + WORD i; + + + i = dj->index + 1; + if (!i || !dj->sect) /* Report EOT when index has reached 65535 */ + return FR_NO_FILE; + + if (!(i % (SS(dj->fs) / 32))) { /* Sector changed? */ + dj->sect++; /* Next sector */ + + if (dj->clust == 0) { /* Static table */ + if (i >= dj->fs->n_rootdir) /* Report EOT when end of table */ + return FR_NO_FILE; + } + else { /* Dynamic table */ + if (((i / (SS(dj->fs) / 32)) & (dj->fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(dj->fs, dj->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + if (clst >= dj->fs->n_fatent) { /* When it reached end of dynamic table */ +#if !_FS_READONLY + BYTE c; + if (!stretch) return FR_NO_FILE; /* When do not stretch, report EOT */ + clst = create_chain(dj->fs, dj->clust); /* Stretch cluster chain */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + /* Clean-up stretched table */ + if (move_window(dj->fs, 0)) return FR_DISK_ERR; /* Flush active window */ + mem_set(dj->fs->win, 0, SS(dj->fs)); /* Clear window buffer */ + dj->fs->winsect = clust2sect(dj->fs, clst); /* Cluster start sector */ + for (c = 0; c < dj->fs->csize; c++) { /* Fill the new cluster with 0 */ + dj->fs->wflag = 1; + if (move_window(dj->fs, 0)) return FR_DISK_ERR; + dj->fs->winsect++; + } + dj->fs->winsect -= c; /* Rewind window address */ +#else + return FR_NO_FILE; /* Report EOT */ +#endif + } + dj->clust = clst; /* Initialize data for new cluster */ + dj->sect = clust2sect(dj->fs, clst); + } + } + } + + dj->index = i; + dj->dir = dj->fs->win + (i % (SS(dj->fs) / 32)) * 32; + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* LFN handling - Test/Pick/Fit an LFN segment from/to directory entry */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN chars in the directory entry */ + + +static +int cmp_lfn ( /* 1:Matched, 0:Not matched */ + WCHAR *lfnbuf, /* Pointer to the LFN to be compared */ + BYTE *dir /* Pointer to the directory entry containing a part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0xBF) - 1) * 13; /* Get offset in the LFN buffer */ + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + wc = ff_wtoupper(uc); /* Convert it to upper case */ + if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++])) /* Compare it */ + return 0; /* Not matched */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } while (++s < 13); /* Repeat until all chars in the entry are checked */ + + if ((dir[LDIR_Ord] & 0x40) && wc && lfnbuf[i]) /* Last segment matched but different length */ + return 0; + + return 1; /* The part of LFN matched */ +} + + + +static +int pick_lfn ( /* 1:Succeeded, 0:Buffer overflow */ + WCHAR *lfnbuf, /* Pointer to the Unicode-LFN buffer */ + BYTE *dir /* Pointer to the directory entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } while (++s < 13); /* Read all character in the entry */ + + if (dir[LDIR_Ord] & 0x40) { /* Put terminator if it is the last LFN part */ + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; +} + + +#if !_FS_READONLY +static +void fit_lfn ( + const WCHAR *lfnbuf, /* Pointer to the LFN buffer */ + BYTE *dir, /* Pointer to the directory entry */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* SFN sum */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + ST_WORD(dir+LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfnbuf[i++]; /* Get an effective char */ + ST_WORD(dir+LfnOfs[s], wc); /* Put it */ + if (!wc) wc = 0xFFFF; /* Padding chars following last char */ + } while (++s < 13); + if (wc == 0xFFFF || !lfnbuf[i]) ord |= 0x40; /* Bottom LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Create numbered name */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +void gen_numname ( + BYTE *dst, /* Pointer to generated SFN */ + const BYTE *src, /* Pointer to source SFN to be modified */ + const WCHAR *lfn, /* Pointer to LFN */ + WORD seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + + + mem_cpy(dst, src, 11); + + if (seq > 5) { /* On many collisions, generate a hash number instead of sequential number */ + do seq = (seq >> 1) + (seq << 15) + (WORD)*lfn++; while (*lfn); + } + + /* itoa */ + i = 7; + do { + c = (seq % 16) + '0'; + if (c > '9') c += 7; + ns[i--] = c; + seq /= 16; + } while (seq); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Calculate sum of an SFN */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +BYTE sum_sfn ( + const BYTE *dir /* Ptr to directory entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( + DIR *dj /* Pointer to the directory object linked to the file name */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_sdi(dj, 0); /* Rewind directory object */ + if (res != FR_OK) return res; + +#if _USE_LFN + ord = sum = 0xFF; +#endif + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == 0xE5 || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (dj->lfn) { + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; /* LFN start order */ + dj->lfn_idx = dj->index; + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dir[LDIR_Chksum] && cmp_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (!ord && sum == sum_sfn(dir)) break; /* LFN matched? */ + ord = 0xFF; dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ + if (!(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11)) break; /* SFN matched? */ + } + } +#else /* Non LFN configuration */ + if (!(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +FRESULT dir_read ( + DIR *dj /* Pointer to the directory object that pointing the entry to be read */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord = 0xFF, sum = 0xFF; +#endif + + res = FR_NO_FILE; + while (dj->sect) { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == 0xE5 || (!_FS_RPATH && c == '.') || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; + dj->lfn_idx = dj->index; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dir)) /* Is there a valid LFN? */ + dj->lfn_idx = 0xFFFF; /* It has no LFN. */ + break; + } + } +#else /* Non LFN configuration */ + if (c != 0xE5 && (_FS_RPATH || c != '.') && !(dir[DIR_Attr] & AM_VOL)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dj->sect = 0; + + return res; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ + DIR *dj /* Target directory with object name to be created */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN /* LFN configuration */ + WORD n, ne, is; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + + fn = dj->fn; lfn = dj->lfn; + mem_cpy(sn, fn, 12); + + if (_FS_RPATH && (sn[NS] & NS_DOT)) /* Cannot create dot entry */ + return FR_INVALID_NAME; + + if (sn[NS] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[NS] = 0; dj->lfn = 0; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ + res = dir_find(dj); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + fn[NS] = sn[NS]; dj->lfn = lfn; + } + + if (sn[NS] & NS_LFN) { /* When LFN is to be created, reserve an SFN + LFN entries. */ + for (ne = 0; lfn[ne]; ne++) ; + ne = (ne + 25) / 13; + } else { /* Otherwise reserve only an SFN entry. */ + ne = 1; + } + + /* Reserve contiguous entries */ + res = dir_sdi(dj, 0); + if (res != FR_OK) return res; + n = is = 0; + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; /* Check the entry status */ + if (c == 0xE5 || c == 0) { /* Is it a blank entry? */ + if (n == 0) is = dj->index; /* First index of the contiguous entry */ + if (++n == ne) break; /* A contiguous entry that required count is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dj, 1); /* Next entry with table stretch */ + } while (res == FR_OK); + + if (res == FR_OK && ne > 1) { /* Initialize LFN entry if needed */ + res = dir_sdi(dj, is); + if (res == FR_OK) { + sum = sum_sfn(dj->fn); /* Sum of the SFN tied to the LFN */ + ne--; + do { /* Store LFN entries in bottom first */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + fit_lfn(dj->lfn, dj->dir, (BYTE)ne, sum); + dj->fs->wflag = 1; + res = dir_next(dj, 0); /* Next entry */ + } while (res == FR_OK && --ne); + } + } + +#else /* Non LFN configuration */ + res = dir_sdi(dj, 0); + if (res == FR_OK) { + do { /* Find a blank entry for the SFN */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; + if (c == 0xE5 || c == 0) break; /* Is it a blank entry? */ + res = dir_next(dj, 1); /* Next entry with table stretch */ + } while (res == FR_OK); + } +#endif + + if (res == FR_OK) { /* Initialize the SFN entry */ + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + dir = dj->dir; + mem_set(dir, 0, 32); /* Clean the entry */ + mem_cpy(dir, dj->fn, 11); /* Put SFN */ +#if _USE_LFN + dir[DIR_NTres] = *(dj->fn+NS) & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + dj->fs->wflag = 1; + } + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static +FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ + DIR *dj /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; +#if _USE_LFN /* LFN configuration */ + WORD i; + + i = dj->index; /* SFN index */ + res = dir_sdi(dj, (WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx)); /* Goto the SFN or top of the LFN entries */ + if (res == FR_OK) { + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + if (dj->index >= i) break; /* When reached SFN, all entries of the object has been deleted. */ + res = dir_next(dj, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } + +#else /* Non LFN configuration */ + res = dir_sdi(dj, dj->index); + if (res == FR_OK) { + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + } + } +#endif + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( + DIR *dj, /* Pointer to the directory object */ + const TCHAR **path /* Pointer to pointer to the segment in the path string */ +) +{ +#ifdef _EXCVT + static const BYTE excvt[] = _EXCVT; /* Upper conversion table for extended chars */ +#endif + +#if _USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + UINT i, ni, si, di; + const TCHAR *p; + + /* Create LFN in Unicode */ + si = di = 0; + p = *path; + lfn = dj->lfn; + for (;;) { + w = p[si++]; /* Get a character */ + if (w < ' ' || w == '/' || w == '\\') break; /* Break on end of segment */ + if (di >= _MAX_LFN) /* Reject too long name */ + return FR_INVALID_NAME; +#if !_LFN_UNICODE + w &= 0xFF; + if (IsDBCS1(w)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + b = (BYTE)p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(b)) + return FR_INVALID_NAME; /* Reject invalid sequence */ + w = (w << 8) + b; /* Create a DBC */ + } + w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ + if (!w) return FR_INVALID_NAME; /* Reject invalid code */ +#endif + if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) /* Reject illegal chars for LFN */ + return FR_INVALID_NAME; + lfn[di++] = w; /* Store the Unicode char */ + } + *path = &p[si]; /* Return pointer to the next segment */ + cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ +#if _FS_RPATH + if ((di == 1 && lfn[di-1] == '.') || /* Is this a dot entry? */ + (di == 2 && lfn[di-1] == '.' && lfn[di-2] == '.')) { + lfn[di] = 0; + for (i = 0; i < 11; i++) + dj->fn[i] = (i < di) ? '.' : ' '; + dj->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Strip trailing spaces and dots */ + w = lfn[di-1]; + if (w != ' ' && w != '.') break; + di--; + } + if (!di) return FR_INVALID_NAME; /* Reject nul string */ + + lfn[di] = 0; /* LFN is created */ + + /* Create SFN in directory form */ + mem_set(dj->fn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= NS_LOSS | NS_LFN; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + b = i = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN char */ + if (!w) break; /* Break on end of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; continue; + } + + if (i >= ni || si == di) { /* Extension or end of SFN */ + if (ni == 11) { /* Long extension */ + cf |= NS_LOSS | NS_LFN; break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + + if (w >= 0x80) { /* Non ASCII char */ +#ifdef _EXCVT + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w) w = excvt[w - 0x80]; /* Convert extended char to upper (SBCS) */ +#else + w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ +#endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if (_DF1S && w >= 0x100) { /* Double byte char (always false on SBCS cfg) */ + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; i = ni; continue; + } + dj->fn[i++] = (BYTE)(w >> 8); + } else { /* Single byte char */ + if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal chars for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(w)) { /* ASCII large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* ASCII small capital */ + b |= 1; w -= 0x20; + } + } + } + } + dj->fn[i++] = (BYTE)w; + } + + if (dj->fn[0] == 0xE5) dj->fn[0] = 0x05; /* If the first char collides with deleted mark, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) /* Create LFN entry when there are composite capitals */ + cf |= NS_LFN; + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended char, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + dj->fn[NS] = cf; /* SFN is created */ + + return FR_OK; + + +#else /* Non-LFN configuration */ + BYTE b, c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + sfn = dj->fn; + mem_set(sfn, ' ', 11); + si = i = b = 0; ni = 8; + p = *path; +#if _FS_RPATH + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = &p[si]; /* Return pointer to the next segment */ + sfn[NS] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; + if (c <= ' ' || c == '/' || c == '\\') break; /* Break on end of segment */ + if (c == '.' || i >= ni) { + if (ni != 8 || c != '.') return FR_INVALID_NAME; + i = 8; ni = 11; + b <<= 2; continue; + } + if (c >= 0x80) { /* Extended char? */ + b |= 3; /* Eliminate NT flag */ +#ifdef _EXCVT + c = excvt[c-0x80]; /* Upper conversion (SBCS) */ +#else +#if !_DF1S /* ASCII only cfg */ + return FR_INVALID_NAME; +#endif +#endif + } + if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ + return FR_INVALID_NAME; + sfn[i++] = c; + sfn[i++] = d; + } else { /* Single byte code */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) /* Reject illegal chrs for SFN */ + return FR_INVALID_NAME; + if (IsUpper(c)) { /* ASCII large capital? */ + b |= 2; + } else { + if (IsLower(c)) { /* ASCII small capital? */ + b |= 1; c -= 0x20; + } + } + sfn[i++] = c; + } + } + *path = &p[si]; /* Return pointer to the next segment */ + c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ + + if (!i) return FR_INVALID_NAME; /* Reject nul string */ + if (sfn[0] == 0xE5) sfn[0] = 0x05; /* When first char collides with 0xE5, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Name extension has only small capital) */ + if ((b & 0x0C) == 0x04) c |= NS_BODY; /* NT flag (Name body has only small capital) */ + + sfn[NS] = c; /* Store NT flag, File name is created */ + + return FR_OK; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +void get_fileinfo ( /* No return code */ + DIR *dj, /* Pointer to the directory object */ + FILINFO *fno /* Pointer to the file information to be filled */ +) +{ + UINT i; + BYTE nt, *dir; + TCHAR *p, c; + + + p = fno->fname; + if (dj->sect) { + dir = dj->dir; + nt = dir[DIR_NTres]; /* NT flag */ + for (i = 0; i < 8; i++) { /* Copy name body */ + c = dir[i]; + if (c == ' ') break; + if (c == 0x05) c = (TCHAR)0xE5; + if (_USE_LFN && (nt & NS_BODY) && IsUpper(c)) c += 0x20; +#if _LFN_UNICODE + if (IsDBCS1(c) && i < 7 && IsDBCS2(dir[i+1])) + c = (c << 8) | dir[++i]; + c = ff_convert(c, 1); + if (!c) c = '?'; +#endif + *p++ = c; + } + if (dir[8] != ' ') { /* Copy name extension */ + *p++ = '.'; + for (i = 8; i < 11; i++) { + c = dir[i]; + if (c == ' ') break; + if (_USE_LFN && (nt & NS_EXT) && IsUpper(c)) c += 0x20; +#if _LFN_UNICODE + if (IsDBCS1(c) && i < 10 && IsDBCS2(dir[i+1])) + c = (c << 8) | dir[++i]; + c = ff_convert(c, 1); + if (!c) c = '?'; +#endif + *p++ = c; + } + } + fno->fattrib = dir[DIR_Attr]; /* Attribute */ + fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ + fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ + fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ + } + *p = 0; /* Terminate SFN str by a \0 */ + +#if _USE_LFN + if (fno->lfname && fno->lfsize) { + TCHAR *tp = fno->lfname; + WCHAR w, *lfn; + + i = 0; + if (dj->sect && dj->lfn_idx != 0xFFFF) {/* Get LFN if available */ + lfn = dj->lfn; + while ((w = *lfn++) != 0) { /* Get an LFN char */ +#if !_LFN_UNICODE + w = ff_convert(w, 0); /* Unicode -> OEM conversion */ + if (!w) { i = 0; break; } /* Could not convert, no LFN */ + if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC (always false on SBCS cfg) */ + tp[i++] = (TCHAR)(w >> 8); +#endif + if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overflow, no LFN */ + tp[i++] = (TCHAR)w; + } + } + tp[i] = 0; /* Terminate the LFN str by a \0 */ + } +#endif +} +#endif /* _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR *dj, /* Directory object to return last directory and found object */ + const TCHAR *path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE *dir, ns; + + +#if _FS_RPATH + if (*path == '/' || *path == '\\') { /* There is a heading separator */ + path++; dj->sclust = 0; /* Strip it and start from the root dir */ + } else { /* No heading separator */ + dj->sclust = dj->fs->cdir; /* Start from the current dir */ + } +#else + if (*path == '/' || *path == '\\') /* Strip heading separator if exist */ + path++; + dj->sclust = 0; /* Start from the root dir */ +#endif + + if ((UINT)*path < ' ') { /* Nul path means the start directory itself */ + res = dir_sdi(dj, 0); + dj->dir = 0; + + } else { /* Follow path */ + for (;;) { + res = create_name(dj, &path); /* Get a segment */ + if (res != FR_OK) break; + res = dir_find(dj); /* Find it */ + ns = *(dj->fn+NS); + if (res != FR_OK) { /* Failed to find the object */ + if (res != FR_NO_FILE) break; /* Abort if any hard error occured */ + /* Object not found */ + if (_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exit */ + dj->sclust = 0; dj->dir = 0; /* It is the root dir */ + res = FR_OK; + if (!(ns & NS_LAST)) continue; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; + } + break; + } + if (ns & NS_LAST) break; /* Last segment match. Function completed. */ + dir = dj->dir; /* There is next segment. Follow the sub directory */ + if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ + res = FR_NO_PATH; break; + } + dj->sclust = LD_CLUST(dir); + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load boot record and check if it is an FAT boot record */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:The FAT BR, 1:Valid BR but not an FAT, 2:Not a BR, 3:Disk error */ + FATFS *fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ +) +{ + if (disk_read(fs->drv, fs->win, sect, 1) != RES_OK) { /* Load boot record */ + return 3; + } + + if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) { /* Check record signature (always placed at offset 510 even if the sector size is >512) */ + return 2; + } + + if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) /* Check "FAT" string */ + return 0; + if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) + return 0; + + return 1; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file system object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */ + const TCHAR **path, /* Pointer to pointer to the path name (drive number) */ + FATFS **rfs, /* Pointer to pointer to the found file system object */ + BYTE chk_wp /* !=0: Check media write protection for write access */ +) +{ + BYTE fmt, b, *tbl; + UINT vol; + DSTATUS stat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat; + WORD nrsv; + const TCHAR *p = *path; + FATFS *fs; + + /* Get logical drive number from the path name */ + vol = p[0] - '0'; /* Is there a drive number? */ + if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ + p += 2; *path = p; /* Return pointer to the path name */ + } else { /* No drive number is given */ +#if _FS_RPATH + vol = CurrVol; /* Use current drive */ +#else + vol = 0; /* Use drive 0 */ +#endif + } + + /* Check if the logical drive is valid or not */ + if (vol >= _VOLUMES) /* Is the drive number valid? */ + return FR_INVALID_DRIVE; + *rfs = fs = FatFs[vol]; /* Return pointer to the corresponding file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + + ENTER_FF(fs); /* Lock file system */ + + if (fs->fs_type) { /* If the logical drive has been mounted */ + stat = disk_status(fs->drv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */ +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + return FR_OK; /* The file system object is valid */ + } + } + + /* The logical drive must be mounted. */ + /* Following code attempts to mount a volume. (analyze BPB and initialize the fs object) */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drv = (BYTE)LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drv); /* Initialize low level disk I/O layer */ + if (stat & STA_NOINIT) /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no media or hard error */ +#if _MAX_SS != 512 /* Get disk sector size (variable sector size cfg only) */ + if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &fs->ssize) != RES_OK) + return FR_DISK_ERR; +#endif +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + /* Search FAT partition on the drive. Supports only generic partitionings, FDISK and SFD. */ + fmt = check_fs(fs, bsect = 0); /* Check sector 0 if it is a VBR */ + if (fmt == 1) { /* Not an FAT-VBR, the disk may be partitioned */ + /* Check the partition listed in top of the partition table */ + tbl = &fs->win[MBR_Table + LD2PT(vol) * 16]; /* Partition table */ + if (tbl[4]) { /* Is the partition existing? */ + bsect = LD_DWORD(&tbl[8]); /* Partition offset in LBA */ + fmt = check_fs(fs, bsect); /* Check the partition */ + } + } + if (fmt == 3) return FR_DISK_ERR; + if (fmt) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + + /* Following code initializes the file system object */ + + if (LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) { /* (BPB_BytsPerSec must be equal to the physical sector size) */ + + return FR_NO_FILESYSTEM; + } + + fasize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ + if (!fasize) fasize = LD_DWORD(fs->win+BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = b = fs->win[BPB_NumFATs]; /* Number of FAT copies */ + if (b != 1 && b != 2) { + return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + } + fasize *= b; /* Number of sectors for FAT area */ + + fs->csize = b = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ + if (!b || (b & (b - 1))) { + return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + } + + fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / 32)) { + return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be sector aligned) */ + } + + tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the volume */ + if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); + + nrsv = LD_WORD(fs->win+BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (!nrsv) { + return FR_NO_FILESYSTEM; /* (BPB_RsvdSecCnt must not be 0) */ + } + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / 32); /* RSV+FAT+DIR */ + if (tsect < sysect) { + return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + } + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (!nclst) { + return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + } + fmt = FS_FAT12; + if (nclst >= MIN_FAT16) fmt = FS_FAT16; + if (nclst >= MIN_FAT32) fmt = FS_FAT32; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->database = bsect + sysect; /* Data start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + if (fmt == FS_FAT32) { + if (fs->n_rootdir) { + return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + } + fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Required FAT size) */ + } else { + if (!fs->n_rootdir) { + return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ + } + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Required FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) { /* (FAT size must not be less than FAT sectors */ + return FR_NO_FILESYSTEM; + } + +#if !_FS_READONLY + /* Initialize cluster allocation information */ + fs->free_clust = 0xFFFFFFFF; + fs->last_clust = 0; + + /* Get fsinfo if available */ + if (fmt == FS_FAT32) { + fs->fsi_flag = 0; + fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo); + if (disk_read(fs->drv, fs->win, fs->fsi_sector, 1) == RES_OK && + LD_WORD(fs->win+BS_55AA) == 0xAA55 && + LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && + LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { + fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + } + } +#endif + fs->fs_type = fmt; /* FAT sub-type */ + fs->id = ++Fsid; /* File system mount ID */ + fs->winsect = 0; /* Invalidate sector cache */ + fs->wflag = 0; +#if _FS_RPATH + fs->cdir = 0; /* Current directory (root dir) */ +#endif +#if _FS_SHARE /* Clear file lock semaphores */ + clear_lock(fs); +#endif + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/dir object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ + FATFS *fs, /* Pointer to the file system object */ + WORD id /* Member id of the target object to be checked */ +) +{ + if (!fs || !fs->fs_type || fs->id != id) + return FR_INVALID_OBJECT; + + ENTER_FF(fs); /* Lock file system */ + + if (disk_status(fs->drv) & STA_NOINIT) + return FR_NOT_READY; + + return FR_OK; +} + + + + +/*-------------------------------------------------------------------------- + + Public Functions + +--------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + BYTE vol, /* Logical drive number to be mounted/unmounted */ + FATFS *fs /* Pointer to new file system object (NULL for unmount)*/ +) +{ + FATFS *rfs; + + + if (vol >= _VOLUMES) /* Check if the drive number is valid */ + return FR_INVALID_DRIVE; + rfs = FatFs[vol]; /* Get current fs object */ + + if (rfs) { +#if _FS_SHARE + clear_lock(rfs); +#endif +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR; +#endif + rfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL *fp, /* Pointer to the blank file object */ + const TCHAR *path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + BYTE *dir; + DEF_NAMEBUF; + + + fp->fs = 0; /* Clear file object */ + +#if !_FS_READONLY + mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW; + res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ)); +#else + mode &= FA_READ; + res = chk_mounted(&path, &dj.fs, 0); +#endif + INIT_BUF(dj); + if (res == FR_OK) + res = follow_path(&dj, path); /* Follow the file path */ + dir = dj.dir; + +#if !_FS_READONLY /* R/W configuration */ + if (res == FR_OK) { + if (!dir) /* Current dir itself */ + res = FR_INVALID_NAME; +#if _FS_SHARE + else + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + DWORD dw, cl; + + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ +#if _FS_SHARE + res = enq_lock(dj.fs) ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + mode |= FA_CREATE_ALWAYS; /* File is created */ + dir = dj.dir; /* New entry */ + } + else { /* Any object is already existing */ + if (mode & FA_CREATE_NEW) { /* Cannot create new */ + res = FR_EXIST; + } else { + if (dir[DIR_Attr] & (AM_RDO | AM_DIR)) /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate it if overwrite mode */ + dw = get_fattime(); /* Created time */ + ST_DWORD(dir+DIR_CrtTime, dw); + dir[DIR_Attr] = 0; /* Reset attribute */ + ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ + cl = LD_CLUST(dir); /* Get start cluster */ + ST_CLUST(dir, 0); /* cluster = 0 */ + dj.fs->wflag = 1; + if (cl) { /* Remove the cluster chain if exist */ + dw = dj.fs->winsect; + res = remove_chain(dj.fs, cl); + if (res == FR_OK) { + dj.fs->last_clust = cl - 1; /* Reuse the cluster hole */ + res = move_window(dj.fs, dw); + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Follow succeeded */ + if (dir[DIR_Attr] & AM_DIR) { /* It is a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */ + res = FR_DENIED; + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) /* Set file change flag if created or overwritten */ + mode |= FA__WRITTEN; + fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dir; +#if _FS_SHARE + fp->lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); + if (!fp->lockid) res = FR_INT_ERR; +#endif + } + +#else /* R/O configuration */ + if (res == FR_OK) { /* Follow succeeded */ + if (!dir) { /* Current dir itself */ + res = FR_INVALID_NAME; + } else { + if (dir[DIR_Attr] & AM_DIR) /* It is a directory */ + res = FR_NO_FILE; + } + } +#endif + FREE_BUF(); + + if (res == FR_OK) { + fp->flag = mode; /* File access mode */ + fp->org_clust = LD_CLUST(dir); /* File start cluster */ + fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ + fp->fptr = 0; /* File pointer */ + fp->dsect = 0; +#if _USE_FASTSEEK + fp->cltbl = 0; /* No cluster link map table */ +#endif + fp->fs = dj.fs; fp->id = dj.fs->id; /* Validate file object */ + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL *fp, /* Pointer to the file object */ + void *buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT *br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + DWORD clst, sect, remain; + UINT rcnt, cc; + BYTE csect, *rbuff = (BYTE *)buff; + + *br = 0; /* Initialize byte counter */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data transferred */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ + if (!csect) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_fat(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - csect; + if (disk_read(fp->fs->drv, rbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if !_FS_READONLY && _FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if _FS_TINY + if (fp->fs->wflag && fp->fs->winsect - sect < cc) + mem_cpy(rbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), fp->fs->win, SS(fp->fs)); +#else + if ((fp->flag & FA__DIRTY) && fp->dsect - sect < cc) + mem_cpy(rbuff + ((fp->dsect - sect) * SS(fp->fs)), fp->buf, SS(fp->fs)); +#endif +#endif + rcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write sector I/O buffer if needed */ + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + } + rcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Get partial sector data from sector buffer */ + if (rcnt > btr) rcnt = btr; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#else + mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#endif + } + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL *fp, /* Pointer to the file object */ + const void *buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT *bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + DWORD clst, sect; + UINT wcnt, cc; + const BYTE *wbuff = buff; + BYTE csect; + + + *bw = 0; /* Initialize byte counter */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + if (fp->fsize + btw < fp->fsize) btw = 0; /* File size cannot reach 4GB */ + + for ( ; btw; /* Repeat until all data transferred */ + wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ + if (!csect) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->org_clust; /* Follow from the origin */ + if (clst == 0) /* When there is no cluster chain, */ + fp->org_clust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */ + } else { /* Middle or end of the file */ + clst = create_chain(fp->fs, fp->curr_clust); /* Follow or stretch cluster chain */ + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + } +#if _FS_TINY + if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0)) /* Write back data buffer prior to following direct transfer */ + ABORT(fp->fs, FR_DISK_ERR); +#else + if (fp->flag & FA__DIRTY) { /* Write back data buffer prior to following direct transfer */ + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - csect; + if (disk_write(fp->fs->drv, wbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if _FS_TINY + if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->fs->wflag = 0; + } +#else + if (fp->dsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->flag &= ~FA__DIRTY; + } +#endif + wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->fsize) { /* Avoid silly buffer filling at growing edge */ + if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR); + fp->fs->winsect = sect; + } +#else + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (fp->fptr < fp->fsize && + disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + } + wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs));/* Put partial sector into file I/O buffer */ + if (wcnt > btw) wcnt = btw; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->fs->wflag = 1; +#else + mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->flag |= FA__DIRTY; +#endif + } + + if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */ + fp->flag |= FA__WRITTEN; /* Set file change flag */ + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD tim; + BYTE *dir; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ +#if !_FS_TINY /* Write-back dirty buffer */ + if (fp->flag & FA__DIRTY) { + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + LEAVE_FF(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + /* Update the directory entry */ + res = move_window(fp->fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ + ST_CLUST(dir, fp->org_clust); /* Update start cluster */ + tim = get_fattime(); /* Update updated time */ + ST_DWORD(dir+DIR_WrtTime, tim); + fp->flag &= ~FA__WRITTEN; + fp->fs->wflag = 1; + res = sync(fp->fs); + } + } + } + + LEAVE_FF(fp->fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL *fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + +#if _FS_READONLY + FATFS *fs = fp->fs; + res = validate(fs, fp->id); + if (res == FR_OK) fp->fs = 0; /* Discard file object */ + LEAVE_FF(fs, res); + +#else + res = f_sync(fp); /* Flush cached data */ +#if _FS_SHARE + if (res == FR_OK) { /* Decrement open counter */ +#if _FS_REENTRANT + res = validate(fp->fs, fp->id); + if (res == FR_OK) { + res = dec_lock(fp->lockid); + unlock_fs(fp->fs, FR_OK); + } +#else + res = dec_lock(fp->lockid); +#endif + } +#endif + if (res == FR_OK) fp->fs = 0; /* Discard file object */ + return res; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Current Drive/Directory Handlings */ +/*-----------------------------------------------------------------------*/ + +#if _FS_RPATH >= 1 + +FRESULT f_chdrive ( + BYTE drv /* Drive number */ +) +{ + if (drv >= _VOLUMES) return FR_INVALID_DRIVE; + + CurrVol = drv; + + return FR_OK; +} + + + +FRESULT f_chdir ( + const TCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the path */ + FREE_BUF(); + if (res == FR_OK) { /* Follow completed */ + if (!dj.dir) { + dj.fs->cdir = dj.sclust; /* Start directory itself */ + } else { + if (dj.dir[DIR_Attr] & AM_DIR) /* Reached to the directory */ + dj.fs->cdir = LD_CLUST(dj.dir); + else + res = FR_NO_PATH; /* Reached but a file */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj.fs, res); +} + + +#if _FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR *path, /* Pointer to the directory path */ + UINT sz_path /* Size of path */ +) +{ + FRESULT res; + DIR dj; + UINT i, n; + DWORD ccl; + TCHAR *tp; + FILINFO fno; + DEF_NAMEBUF; + + + *path = 0; + res = chk_mounted((const TCHAR**)&path, &dj.fs, 0); /* Get current volume */ + if (res == FR_OK) { + INIT_BUF(dj); + i = sz_path; /* Bottom of buffer (dir stack base) */ + dj.sclust = dj.fs->cdir; /* Start to follow upper dir from current dir */ + while ((ccl = dj.sclust) != 0) { /* Repeat while current dir is a sub-dir */ + res = dir_sdi(&dj, 1); /* Get parent dir */ + if (res != FR_OK) break; + res = dir_read(&dj); + if (res != FR_OK) break; + dj.sclust = LD_CLUST(dj.dir); /* Goto parent dir */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child dir */ + res = dir_read(&dj); + if (res != FR_OK) break; + if (ccl == LD_CLUST(dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; +#if _USE_LFN + fno.lfname = path; + fno.lfsize = i; +#endif + get_fileinfo(&dj, &fno); /* Get the dir name and push it to the buffer */ + tp = fno.fname; + if (_USE_LFN && *path) tp = path; + for (n = 0; tp[n]; n++) ; + if (i < n + 3) { + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) path[--i] = tp[--n]; + path[--i] = '/'; + } + tp = path; + if (res == FR_OK) { + *tp++ = '0' + CurrVol; /* Put drive number */ + *tp++ = ':'; + if (i == sz_path) { /* Root-dir */ + *tp++ = '/'; + } else { /* Sub-dir */ + do /* Add stacked path str */ + *tp++ = path[i++]; + while (i < sz_path); + } + } + *tp = 0; + FREE_BUF(); + } + + LEAVE_FF(dj.fs, res); +} +#endif /* _FS_RPATH >= 2 */ +#endif /* _FS_RPATH >= 1 */ + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL *fp, /* Pointer to the file object */ + DWORD ofs /* File pointer from top of file */ +) +{ + FRESULT res; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + +#if _USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + DWORD cl, pcl, ncl, tcl, dsc, tlen, *tbl = fp->cltbl; + BYTE csc; + + tlen = *tbl++; + if (ofs == CREATE_LINKMAP) { /* Create link map table */ + cl = fp->org_clust; + if (cl) { + do { + if (tlen < 4) { /* Not enough table items */ + res = FR_NOT_ENOUGH_CORE; break; + } + tcl = cl; ncl = 0; + do { /* Get a fragment and store the top and length */ + pcl = cl; ncl++; + cl = get_fat(fp->fs, cl); + if (cl <= 1) ABORT(fp->fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + } while (cl == pcl + 1); + *tbl++ = ncl; *tbl++ = tcl; + tlen -= 2; + } while (cl < fp->fs->n_fatent); + } + *tbl = 0; /* Terminate table */ + + } else { /* Fast seek */ + if (ofs > fp->fsize) /* Clip offset at the file size */ + ofs = fp->fsize; + fp->fptr = ofs; /* Set file pointer */ + if (ofs) { + dsc = (ofs - 1) / SS(fp->fs); + cl = dsc / fp->fs->csize; + for (;;) { + ncl = *tbl++; + if (!ncl) ABORT(fp->fs, FR_INT_ERR); + if (cl < ncl) break; + cl -= ncl; tbl++; + } + fp->curr_clust = cl + *tbl; + csc = (BYTE)(dsc & (fp->fs->csize - 1)); + dsc = clust2sect(fp->fs, fp->curr_clust); + if (!dsc) ABORT(fp->fs, FR_INT_ERR); + dsc += csc; + if (fp->fptr % SS(fp->fs) && dsc != fp->dsect) { +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Flush dirty buffer if needed */ + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drv, fp->buf, dsc, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#endif + fp->dsect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { + DWORD clst, bcs, nsect, ifptr; + + if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ +#if !_FS_READONLY + && !(fp->flag & FA_WRITE) +#endif + ) ofs = fp->fsize; + + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs) { + bcs = (DWORD)fp->fs->csize * SS(fp->fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->curr_clust; + } else { /* When seek to back cluster, */ + clst = fp->org_clust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(fp->fs, 0); + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->org_clust = clst; + } +#endif + fp->curr_clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + clst = create_chain(fp->fs, clst); /* Force stretch if in write mode */ + if (clst == 0) { /* When disk gets full, clip file size */ + ofs = bcs; break; + } + } else +#endif + clst = get_fat(fp->fs, clst); /* Follow cluster chain if not in write mode */ + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fp->fs->n_fatent) ABORT(fp->fs, FR_INT_ERR); + fp->curr_clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + fp->fptr += ofs; + if (ofs % SS(fp->fs)) { + nsect = clust2sect(fp->fs, clst); /* Current sector */ + if (!nsect) ABORT(fp->fs, FR_INT_ERR); + nsect += ofs / SS(fp->fs); + } + } + } + if (fp->fptr % SS(fp->fs) && nsect != fp->dsect) { +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Flush dirty buffer if needed */ + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drv, fp->buf, nsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#endif + fp->dsect = nsect; + } +#if !_FS_READONLY + if (fp->fptr > fp->fsize) { /* Set change flag if the file size is extended */ + fp->fsize = fp->fptr; + fp->flag |= FA__WRITTEN; + } +#endif + } + + LEAVE_FF(fp->fs, res); +} + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directroy Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR *dj, /* Pointer to directory object to create */ + const TCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DEF_NAMEBUF; + + res = chk_mounted(&path, &dj->fs, 0); + if (res == FR_OK) { + INIT_BUF(*dj); + res = follow_path(dj, path); /* Follow the path to the directory */ + FREE_BUF(); + if (res == FR_OK) { /* Follow completed */ + if (dj->dir) { /* It is not the root dir */ + if (dj->dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ + dj->sclust = LD_CLUST(dj->dir); + } else { /* The object is not a directory */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dj->id = dj->fs->id; + res = dir_sdi(dj, 0); /* Rewind dir */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entry in Sequense */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR *dj, /* Pointer to the open directory object */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DEF_NAMEBUF; + + + res = validate(dj->fs, dj->id); /* Check validity of the object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dj, 0); /* Rewind the directory object */ + } else { + INIT_BUF(*dj); + res = dir_read(dj); /* Read an directory item */ + if (res == FR_NO_FILE) { /* Reached end of dir */ + dj->sect = 0; + res = FR_OK; + } + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dj, fno); /* Get the object information */ + res = dir_next(dj, 0); /* Increment index for next */ + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + } + FREE_BUF(); + } + } + + LEAVE_FF(dj->fs, res); +} + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR *path, /* Pointer to the file path */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.dir) /* Found an object */ + get_fileinfo(&dj, fno); + else /* It is root dir */ + res = FR_INVALID_NAME; + } + FREE_BUF(); + } + + LEAVE_FF(dj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR *path, /* Pointer to the logical drive number (root dir) */ + DWORD *nclst, /* Pointer to the variable to return number of free clusters */ + FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ +) +{ + FRESULT res; + DWORD n, clst, sect, stat; + UINT i; + BYTE fat, *p; + + + /* Get drive number */ + res = chk_mounted(&path, fatfs, 0); + if (res == FR_OK) { + /* If free_clust is valid, return it without full cluster scan */ + if ((*fatfs)->free_clust <= (*fatfs)->n_fatent - 2) { + *nclst = (*fatfs)->free_clust; + } else { + /* Get number of free clusters */ + fat = (*fatfs)->fs_type; + n = 0; + if (fat == FS_FAT12) { + clst = 2; + do { + stat = get_fat(*fatfs, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) n++; + } while (++clst < (*fatfs)->n_fatent); + } else { + clst = (*fatfs)->n_fatent; + sect = (*fatfs)->fatbase; + i = 0; p = 0; + do { + if (!i) { + res = move_window(*fatfs, sect++); + if (res != FR_OK) break; + p = (*fatfs)->win; + i = SS(*fatfs); + } + if (fat == FS_FAT16) { + if (LD_WORD(p) == 0) n++; + p += 2; i -= 2; + } else { + if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; + p += 4; i -= 4; + } + } while (--clst); + } + (*fatfs)->free_clust = n; + if (fat == FS_FAT32) (*fatfs)->fsi_flag = 1; + *nclst = n; + } + } + LEAVE_FF(*fatfs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD ncl; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & FA__ERROR) { /* Check abort flag */ + res = FR_INT_ERR; + } else { + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + res = FR_DENIED; + } + } + if (res == FR_OK) { + if (fp->fsize > fp->fptr) { + fp->fsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= FA__WRITTEN; + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(fp->fs, fp->org_clust); + fp->org_clust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(fp->fs, fp->curr_clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fp->fs->n_fatent) { + res = put_fat(fp->fs, fp->curr_clust, 0x0FFFFFFF); + if (res == FR_OK) res = remove_chain(fp->fs, ncl); + } + } + } + if (res != FR_OK) fp->flag |= FA__ERROR; + } + + LEAVE_FF(fp->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File or Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR *path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + BYTE *dir; + DWORD dclst; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; /* Cannot remove dot entry */ +#if _FS_SHARE + if (res == FR_OK) res = chk_lock(&dj, 2); /* Cannot remove open file */ +#endif + if (res == FR_OK) { /* The object is accessible */ + dir = dj.dir; + if (!dir) { + res = FR_INVALID_NAME; /* Cannot remove the start directory */ + } else { + if (dir[DIR_Attr] & AM_RDO) + res = FR_DENIED; /* Cannot remove R/O object */ + } + dclst = LD_CLUST(dir); + if (res == FR_OK && (dir[DIR_Attr] & AM_DIR)) { /* Is it a sub-dir? */ + if (dclst < 2) { + res = FR_INT_ERR; + } else { + mem_cpy(&sdj, &dj, sizeof(DIR)); /* Check if the sub-dir is empty or not */ + sdj.sclust = dclst; + res = dir_sdi(&sdj, 2); /* Exclude dot entries */ + if (res == FR_OK) { + res = dir_read(&sdj); + if (res == FR_OK /* Not empty dir */ +#if _FS_RPATH + || dclst == sdj.fs->cdir /* Current dir */ +#endif + ) res = FR_DENIED; + if (res == FR_NO_FILE) res = FR_OK; /* Empty */ + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK) { + if (dclst) /* Remove the cluster chain if exist */ + res = remove_chain(dj.fs, dclst); + if (res == FR_OK) res = sync(dj.fs); + } + } + } + FREE_BUF(); + } + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + BYTE *dir, n; + DWORD dsc, dcl, pcl, tim = get_fattime(); + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */ + if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_NO_FILE) { /* Can create a new directory */ + dcl = create_chain(dj.fs, 0); /* Allocate a cluster for the new directory table */ + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */ + if (dcl == 1) res = FR_INT_ERR; + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) /* Flush FAT */ + res = move_window(dj.fs, 0); + if (res == FR_OK) { /* Initialize the new directory table */ + dsc = clust2sect(dj.fs, dcl); + dir = dj.fs->win; + mem_set(dir, 0, SS(dj.fs)); + mem_set(dir+DIR_Name, ' ', 8+3); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + ST_DWORD(dir+DIR_WrtTime, tim); + ST_CLUST(dir, dcl); + mem_cpy(dir+32, dir, 32); /* Create ".." entry */ + dir[33] = '.'; pcl = dj.sclust; + if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase) + pcl = 0; + ST_CLUST(dir+32, pcl); + for (n = dj.fs->csize; n; n--) { /* Write dot entries and clear following sectors */ + dj.fs->winsect = dsc++; + dj.fs->wflag = 1; + res = move_window(dj.fs, 0); + if (res != FR_OK) break; + mem_set(dir, 0, SS(dj.fs)); + } + } + if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */ + if (res != FR_OK) { + remove_chain(dj.fs, dcl); /* Could not register, remove cluster chain */ + } else { + dir = dj.dir; + dir[DIR_Attr] = AM_DIR; /* Attribute */ + ST_DWORD(dir+DIR_WrtTime, tim); /* Created time */ + ST_CLUST(dir, dcl); /* Table start cluster */ + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + FREE_BUF(); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR *path, /* Pointer to the file path */ + BYTE value, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + BYTE *dir; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + FREE_BUF(); + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Is it a root directory? */ + res = FR_INVALID_NAME; + } else { /* File or sub directory */ + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ + dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR *path, /* Pointer to the file/directory name */ + const FILINFO *fno /* Pointer to the time stamp to be set */ +) +{ + FRESULT res; + DIR dj; + BYTE *dir; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + FREE_BUF(); + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Root directory */ + res = FR_INVALID_NAME; + } else { /* File or sub-directory */ + ST_WORD(dir+DIR_WrtTime, fno->ftime); + ST_WORD(dir+DIR_WrtDate, fno->fdate); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR *path_old, /* Pointer to the old name */ + const TCHAR *path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + BYTE buf[21], *dir; + DWORD dw; + DEF_NAMEBUF; + + + res = chk_mounted(&path_old, &djo.fs, 1); + if (res == FR_OK) { + djn.fs = djo.fs; + INIT_BUF(djo); + res = follow_path(&djo, path_old); /* Check old object */ + if (_FS_RPATH && res == FR_OK && (djo.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; +#if _FS_SHARE + if (res == FR_OK) res = chk_lock(&djo, 2); +#endif + if (res == FR_OK) { /* Old object is found */ + if (!djo.dir) { /* Is root dir? */ + res = FR_NO_FILE; + } else { + mem_cpy(buf, djo.dir+DIR_Attr, 21); /* Save the object information except for name */ + mem_cpy(&djn, &djo, sizeof(DIR)); /* Check new object */ + res = follow_path(&djn, path_new); + if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ + if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ +/* Start critical section that any interruption or error can cause cross-link */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy object information except for name */ + mem_cpy(dir+13, buf+2, 19); + dir[DIR_Attr] = buf[0] | AM_ARC; + djo.fs->wflag = 1; + if (djo.sclust != djn.sclust && (dir[DIR_Attr] & AM_DIR)) { /* Update .. entry in the directory if needed */ + dw = clust2sect(djn.fs, LD_CLUST(dir)); + if (!dw) { + res = FR_INT_ERR; + } else { + res = move_window(djn.fs, dw); + dir = djn.fs->win+32; /* .. entry */ + if (res == FR_OK && dir[1] == '.') { + dw = (djn.fs->fs_type == FS_FAT32 && djn.sclust == djn.fs->dirbase) ? 0 : djn.sclust; + ST_CLUST(dir, dw); + djn.fs->wflag = 1; + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) + res = sync(djo.fs); + } + } +/* End critical section */ + } + } + } + FREE_BUF(); + } + LEAVE_FF(djo.fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly (available on only tiny cfg) */ +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY + +FRESULT f_forward ( + FIL *fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btr, /* Number of bytes to forward */ + UINT *bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + DWORD remain, clst, sect; + UINT rcnt; + BYTE csect; + + + *bf = 0; /* Initialize byte counter */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check error flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr && (*func)(0, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btr -= rcnt) { + csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (!csect) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_fat(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + } + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current data sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += csect; + if (move_window(fp->fs, sect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + fp->dsect = sect; + rcnt = SS(fp->fs) - (WORD)(fp->fptr % SS(fp->fs)); /* Forward data from sector window */ + if (rcnt > btr) rcnt = btr; + rcnt = (*func)(&fp->fs->win[(WORD)fp->fptr % SS(fp->fs)], rcnt); + if (!rcnt) ABORT(fp->fs, FR_INT_ERR); + } + + LEAVE_FF(fp->fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create File System on the Drive */ +/*-----------------------------------------------------------------------*/ +#define N_ROOTDIR 512 /* Multiple of 32 */ +#define N_FATS 1 /* 1 or 2 */ + + +FRESULT f_mkfs ( + BYTE drv, /* Logical drive number */ + BYTE sfd, /* Partitioning rule 0:FDISK, 1:SFD */ + UINT au /* Allocation unit size [bytes] */ +) +{ + static const WORD vst[] = { 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 0}; + static const WORD cst[] = {32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512}; + BYTE fmt, md, *tbl; + DWORD n_clst, vs, n, wsect; + UINT i; + DWORD b_vol, b_fat, b_dir, b_data; /* Offset (LBA) */ + DWORD n_vol, n_rsv, n_fat, n_dir; /* Size */ + FATFS *fs; + DSTATUS stat; + + /* Check mounted drive and clear work area */ + if (drv >= _VOLUMES) return FR_INVALID_DRIVE; + fs = FatFs[drv]; + if (!fs) return FR_NOT_ENABLED; + fs->fs_type = 0; + drv = LD2PD(drv); + + /* Get disk statics */ + stat = disk_initialize(drv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; +#if _MAX_SS != 512 /* Get disk sector size */ + if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) + return FR_DISK_ERR; +#endif + if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128) + return FR_DISK_ERR; + b_vol = (sfd) ? 0 : 63; /* Volume start sector */ + n_vol -= b_vol; + if (au & (au - 1)) au = 0; /* Check validity of the allocation unit size */ + if (!au) { /* AU auto selection */ + vs = n_vol / (2000 / (SS(fs) / 512)); + for (i = 0; vs < vst[i]; i++) ; + au = cst[i]; + } + au /= SS(fs); /* Number of sectors per cluster */ + if (au == 0) au = 1; + if (au > 128) au = 128; + + /* Pre-compute number of clusters and FAT syb-type */ + n_clst = n_vol / au; + fmt = FS_FAT12; + if (n_clst >= MIN_FAT16) fmt = FS_FAT16; + if (n_clst >= MIN_FAT32) fmt = FS_FAT32; + + /* Determine offset and size of FAT structure */ + if (fmt == FS_FAT32) { + n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); + n_rsv = 32; + n_dir = 0; + } else { + n_fat = (fmt == FS_FAT12) ? (n_clst * 3 + 1) / 2 + 3 : (n_clst * 2) + 4; + n_fat = (n_fat + SS(fs) - 1) / SS(fs); + n_rsv = 1; + n_dir = N_ROOTDIR * 32UL / SS(fs); + } + b_fat = b_vol + n_rsv; /* FAT area start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory area start sector */ + b_data = b_dir + n_dir; /* Data area start sector */ + if (n_vol < b_data + au) return FR_MKFS_ABORTED; /* Too small volume */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK || !n || n > 32768) n = 1; + n = (b_data + n - 1) & ~(n - 1); /* Next nearest erase block from current data start */ + n = (n - b_data) / N_FATS; + if (fmt == FS_FAT32) { /* FAT32: Move FAT offset */ + n_rsv += n; + b_fat += n; + } else { /* FAT12/16: Expand FAT size */ + n_fat += n; + } + + /* Determine number of cluster and final check of validity of the FAT sub-type */ + n_clst = (n_vol - n_rsv - n_fat * N_FATS - n_dir) / au; + if ( (fmt == FS_FAT16 && n_clst < MIN_FAT16) + || (fmt == FS_FAT32 && n_clst < MIN_FAT32)) + return FR_MKFS_ABORTED; + + /* Create partition table if required */ + if (sfd) { + md = 0xF0; + } else { + DWORD n_disk = b_vol + n_vol; + + mem_set(fs->win, 0, SS(fs)); + tbl = fs->win+MBR_Table; + ST_DWORD(tbl, 0x00010180); /* Partition start in CHS */ + if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */ + n_disk = n_disk / 63 / 255; + tbl[7] = (BYTE)n_disk; + tbl[6] = (BYTE)((n_disk >> 2) | 63); + } else { + ST_WORD(&tbl[6], 0xFFFF); + } + tbl[5] = 254; + if (fmt != FS_FAT32) /* System ID */ + tbl[4] = (n_vol < 0x10000) ? 0x04 : 0x06; + else + tbl[4] = 0x0c; + ST_DWORD(tbl+8, 63); /* Partition start in LBA */ + ST_DWORD(tbl+12, n_vol); /* Partition size in LBA */ + ST_WORD(tbl+64, 0xAA55); /* Signature */ + if (disk_write(drv, fs->win, 0, 1) != RES_OK) + return FR_DISK_ERR; + md = 0xF8; + } + + /* Create volume boot record */ + tbl = fs->win; /* Clear sector */ + mem_set(tbl, 0, SS(fs)); + mem_cpy(tbl, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot code, OEM name */ + i = SS(fs); /* Sector size */ + ST_WORD(tbl+BPB_BytsPerSec, i); + tbl[BPB_SecPerClus] = (BYTE)au; /* Sectors per cluster */ + ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + i = (fmt == FS_FAT32) ? 0 : N_ROOTDIR; /* Number of rootdir entries */ + ST_WORD(tbl+BPB_RootEntCnt, i); + if (n_vol < 0x10000) { /* Number of total sectors */ + ST_WORD(tbl+BPB_TotSec16, n_vol); + } else { + ST_DWORD(tbl+BPB_TotSec32, n_vol); + } + tbl[BPB_Media] = md; /* Media descriptor */ + ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl+BPB_HiddSec, b_vol); /* Hidden sectors */ + n = get_fattime(); /* Use current time as VSN */ + if (fmt == FS_FAT32) { + ST_DWORD(tbl+BS_VolID32, n); /* VSN */ + ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of sectors per FAT */ + ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory start cluster (2) */ + ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (VBR+1) */ + ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (VBR+6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + ST_DWORD(tbl+BS_VolID, n); /* VSN */ + ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of sectors per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ + if (disk_write(drv, tbl, b_vol, 1) != RES_OK)/* Write original (VBR) */ + return FR_DISK_ERR; + if (fmt == FS_FAT32) /* Write backup (VBR+6) */ + disk_write(drv, tbl, b_vol + 6, 1); + + /* Initialize FAT area */ + wsect = b_fat; + for (i = 0; i < N_FATS; i++) { + mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ + n = md; /* Media descriptor byte */ + if (fmt != FS_FAT32) { + n |= (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; + ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT12/16) */ + } else { + n |= 0xFFFFFF00; + ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD(tbl+4, 0xFFFFFFFF); + ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root dir */ + } + if (disk_write(drv, tbl, wsect++, 1) != RES_OK) + return FR_DISK_ERR; + mem_set(tbl, 0, SS(fs)); /* Fill following FAT entries with zero */ + for (n = 1; n < n_fat; n++) { /* This loop may take a time on FAT32 volume due to many single sector write */ + if (disk_write(drv, tbl, wsect++, 1) != RES_OK) + return FR_DISK_ERR; + } + } + + /* Initialize root directory */ + i = (fmt == FS_FAT32) ? au : n_dir; + do { + if (disk_write(drv, tbl, wsect++, 1) != RES_OK) + return FR_DISK_ERR; + } while (--i); + +#if _USE_ERASE /* Erase data area if needed */ + { + DWORD eb[2]; + + eb[0] = wsect; eb[1] = wsect + n_clst * au - 1; + disk_ioctl(drv, CTRL_ERASE_SECTOR, eb); + } +#endif + + /* Create FSInfo if needed */ + if (fmt == FS_FAT32) { + ST_WORD(tbl+BS_55AA, 0xAA55); + ST_DWORD(tbl+FSI_LeadSig, 0x41615252); + ST_DWORD(tbl+FSI_StrucSig, 0x61417272); + ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); + ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF); + disk_write(drv, tbl, b_vol + 1, 1); /* Write original (VBR+1) */ + disk_write(drv, tbl, b_vol + 7, 1); /* Write backup (VBR+7) */ + } + + return (disk_ioctl(drv, CTRL_SYNC, (void*)0) == RES_OK) ? FR_OK : FR_DISK_ERR; +} + +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (characters) */ + FIL* fil /* Pointer to the file object */ +) +{ + int n = 0; + TCHAR c, *p = buff; + BYTE s[2]; + UINT rc; + + + while (n < len - 1) { /* Read bytes until buffer gets filled */ + f_read(fil, s, 1, &rc); + if (rc != 1) break; /* Break on EOF or error */ + c = s[0]; +#if _LFN_UNICODE /* Read a character in UTF-8 encoding */ + if (c >= 0x80) { + if (c < 0xC0) continue; /* Skip stray trailer */ + if (c < 0xE0) { /* Two-byte sequense */ + f_read(fil, s, 1, &rc); + if (rc != 1) break; + c = ((c & 0x1F) << 6) | (s[0] & 0x3F); + if (c < 0x80) c = '?'; + } else { + if (c < 0xF0) { /* Three-byte sequense */ + f_read(fil, s, 2, &rc); + if (rc != 2) break; + c = (c << 12) | ((s[0] & 0x3F) << 6) | (s[1] & 0x3F); + if (c < 0x800) c = '?'; + } else { /* Reject four-byte sequense */ + c = '?'; + } + } + } +#endif +#if _USE_STRFUNC >= 2 + if (c == '\r') continue; /* Strip '\r' */ +#endif + *p++ = c; + n++; + if (c == '\n') break; /* Break on EOL */ + } + *p = 0; + return n ? buff : 0; /* When no data read (eof or error), return with error. */ +} + + + +#if !_FS_READONLY +#include <stdarg.h> +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fil /* Pointer to the file object */ +) +{ + UINT bw, btw; + BYTE s[3]; + + +#if _USE_STRFUNC >= 2 + if (c == '\n') f_putc ('\r', fil); /* LF -> CRLF conversion */ +#endif + +#if _LFN_UNICODE /* Write the character in UTF-8 encoding */ + if (c < 0x80) { /* 7-bit */ + s[0] = (BYTE)c; + btw = 1; + } else { + if (c < 0x800) { /* 11-bit */ + s[0] = (BYTE)(0xC0 | (c >> 6)); + s[1] = (BYTE)(0x80 | (c & 0x3F)); + btw = 2; + } else { /* 16-bit */ + s[0] = (BYTE)(0xE0 | (c >> 12)); + s[1] = (BYTE)(0x80 | ((c >> 6) & 0x3F)); + s[2] = (BYTE)(0x80 | (c & 0x3F)); + btw = 3; + } + } +#else /* Write the character without conversion */ + s[0] = (BYTE)c; + btw = 1; +#endif + f_write(fil, s, btw, &bw); /* Write the char to the file */ + return (bw == btw) ? 1 : EOF; /* Return the result */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fil /* Pointer to the file object */ +) +{ + int n; + + + for (n = 0; *str; str++, n++) { + if (f_putc(*str, fil) == EOF) return EOF; + } + return n; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ +int f_printf ( + FIL* fil, /* Pointer to the file object */ + const TCHAR* str, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + BYTE f, r; + UINT i, w; + ULONG val; + TCHAR c, d, s[16]; + int res, cc; + + + va_start(arp, str); + + for (cc = res = 0; cc != EOF; res += cc) { + c = *str++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + cc = f_putc(c, fil); + if (cc != EOF) cc = 1; + continue; + } + w = f = 0; + c = *str++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *str++; + } + while (IsDigit(c)) { /* Precision */ + w = w * 10 + c - '0'; + c = *str++; + } + if (c == 'l' || c == 'L') { /* Prefix: Size is long int */ + f |= 2; c = *str++; + } + if (!c) break; + d = c; + if (IsLower(d)) d -= 0x20; + switch (d) { /* Type is... */ + case 'S' : /* String */ + cc = f_puts(va_arg(arp, TCHAR*), fil); continue; + case 'C' : /* Character */ + cc = f_putc((TCHAR)va_arg(arp, int), fil); continue; + case 'B' : /* Binary */ + r = 2; break; + case 'O' : /* Octal */ + r = 8; break; + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; break; + case 'X' : /* Hexdecimal */ + r = 16; break; + default: /* Unknown */ + cc = f_putc(c, fil); continue; + } + + /* Get an argument */ + val = (f & 2) ? va_arg(arp, long) : ((d == 'D') ? (long)va_arg(arp, int) : va_arg(arp, unsigned int)); + if (d == 'D' && (val & 0x80000000)) { + val = 0 - val; + f |= 4; + } + /* Put it in numeral string */ + i = 0; + do { + d = (TCHAR)(val % r); val /= r; + if (d > 9) { + d += 7; + if (c == 'x') d += 0x20; + } + s[i++] = d + '0'; + } while (val && i < sizeof(s) / sizeof(s[0])); + if (f & 4) s[i++] = '-'; + cc = 0; + while (i < w-- && cc != EOF) { + cc = f_putc((TCHAR)((f & 1) ? '0' : ' '), fil); + res++; + } + do { + cc = f_putc(s[--i], fil); + res++; + } while (i && cc != EOF); + if (cc != EOF) cc = 0; + } + + va_end(arp); + return (cc == EOF) ? cc : res; +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ + +#endif /* XPAR_PS7_SD_0_S_AXI_BASEADDR */ diff --git a/quad/zybo_fsbl/src/ff.h b/quad/zybo_fsbl/src/ff.h new file mode 100644 index 000000000..a2cf4907a --- /dev/null +++ b/quad/zybo_fsbl/src/ff.h @@ -0,0 +1,541 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module include file R0.08a (C)ChaN, 2010 +/----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following trems. +/ +/ Copyright (C) 2010, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/----------------------------------------------------------------------------*/ + +#ifndef _FATFS +#define _FATFS 8255 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ + +#if _FATFS != _FFCONF +#error Wrong configuration file (ffconf.h). +#endif + + +/* DBCS code ranges and SBCS extend char conversion table */ + +#if _CODE_PAGE == 932 /* Japanese Shift-JIS */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* Korean */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 437 /* U.S. (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 720 /* Arabic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 737 /* Greek (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 775 /* Baltic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 850 /* Multilingual Latin 1 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 852 /* Latin 2 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 855 /* Cyrillic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 857 /* Turkish (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 858 /* Multilingual Latin 1 + Euro (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 862 /* Hebrew (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 866 /* Russian (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 874 /* Thai (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} + +#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1253 /* Greek (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ + 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} + +#elif _CODE_PAGE == 1254 /* Turkish (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1256 /* Arabic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1257 /* Baltic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} + +#elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ +#define _DF1S 0 + +#else +#error Unknown code page + +#endif + + + +/* Definitions of volume management */ + +#if _MULTI_PARTITION /* Multiple partition configuration */ +#define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive# */ +#define LD2PT(vol) (VolToPart[vol].pt) /* Get partition# */ +typedef struct { + BYTE pd; /* Physical drive# */ + BYTE pt; /* Partition # (0-3) */ +} PARTITION; +extern const PARTITION VolToPart[]; /* Volume - Physical location resolution table */ + +#else /* Single partition configuration */ +#define LD2PD(vol) (vol) /* Logical drive# is bound to the same physical drive# */ +#define LD2PT(vol) 0 /* Always mounts the 1st partition */ + +#endif + + + +/* Type of path name strings on FatFs API */ + +#if _LFN_UNICODE /* Unicode string */ +#if !_USE_LFN +#error _LFN_UNICODE must be 0 in non-LFN cfg. +#endif +#ifndef _INC_TCHAR +typedef WCHAR TCHAR; +#define _T(x) L ## x +#define _TEXT(x) L ## x +#endif + +#else /* ANSI/OEM string */ +#ifndef _INC_TCHAR +typedef char TCHAR; +#define _T(x) x +#define _TEXT(x) x +#endif + +#endif + + + +/* File system object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* FAT sub-type (0:Not mounted) */ + BYTE drv; /* Physical drive number */ + BYTE csize; /* Sectors per cluster (1,2,4...128) */ + BYTE n_fats; /* Number of FAT copies (1,2) */ + BYTE wflag; /* win[] dirty flag (1:must be written back) */ + BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ + WORD id; /* File system mount ID */ + WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ +#if _MAX_SS != 512 + WORD ssize; /* Bytes per sector (512,1024,2048,4096) */ +#endif +#if _FS_REENTRANT + _SYNC_t sobj; /* Identifier of sync object */ +#endif +#if !_FS_READONLY + DWORD last_clust; /* Last allocated cluster */ + DWORD free_clust; /* Number of free clusters */ + DWORD fsi_sector; /* fsinfo sector (FAT32) */ +#endif +#if _FS_RPATH + DWORD cdir; /* Current directory start cluster (0:root) */ +#endif + DWORD n_fatent; /* Number of FAT entries (= number of clusters + 2) */ + DWORD fsize; /* Sectors per FAT */ + DWORD fatbase; /* FAT start sector */ + DWORD dirbase; /* Root directory start sector (FAT32:Cluster#) */ + DWORD database; /* Data start sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and Data on tiny cfg) */ +} FATFS; + + + +/* File object structure (FIL) */ + +typedef struct { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + BYTE flag; /* File status flags */ + BYTE pad1; + DWORD fptr; /* File read/write pointer (0 on file open) */ + DWORD fsize; /* File size */ + DWORD org_clust; /* File start cluster (0 when fsize==0) */ + DWORD curr_clust; /* Current cluster */ + DWORD dsect; /* Current data sector */ +#if !_FS_READONLY + DWORD dir_sect; /* Sector containing the directory entry */ + BYTE* dir_ptr; /* Ponter to the directory entry in the window */ +#endif +#if _USE_FASTSEEK + DWORD* cltbl; /* Pointer to the cluster link map table (null on file open) */ +#endif +#if _FS_SHARE + UINT lockid; /* File lock ID (index of file semaphore table) */ +#endif +#if !_FS_TINY + BYTE buf[_MAX_SS]; /* File data read/write buffer */ +#endif +} FIL; + + + +/* Directory object structure (DIR) */ + +typedef struct { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + WORD index; /* Current read/write index number */ + DWORD sclust; /* Table start cluster (0:Root dir) */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector */ + BYTE* dir; /* Pointer to the current SFN entry in the win[] */ + BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ +#if _USE_LFN + WCHAR* lfn; /* Pointer to the LFN working buffer */ + WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ +#endif +} DIR; + + + +/* File status structure (FILINFO) */ + +typedef struct { + DWORD fsize; /* File size */ + WORD fdate; /* Last modified date */ + WORD ftime; /* Last modified time */ + BYTE fattrib; /* Attribute */ + TCHAR fname[13]; /* Short file name (8.3 format) */ +#if _USE_LFN + TCHAR* lfname; /* Pointer to the LFN buffer */ + UINT lfsize; /* Size of LFN buffer in TCHAR */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* (0) Succeeded */ + FR_DISK_ERR, /* (1) A hard error occured in the low level disk I/O layer */ + FR_INT_ERR, /* (2) Assertion failed */ + FR_NOT_READY, /* (3) The physical drive cannot work */ + FR_NO_FILE, /* (4) Could not find the file */ + FR_NO_PATH, /* (5) Could not find the path */ + FR_INVALID_NAME, /* (6) The path name format is invalid */ + FR_DENIED, /* (7) Acces denied due to prohibited access or directory full */ + FR_EXIST, /* (8) Acces denied due to prohibited access */ + FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ + FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ + FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ + FR_NOT_ENABLED, /* (12) The volume has no work area */ + FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume on the physical drive */ + FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */ + FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ + FR_LOCKED, /* (16) The operation is rejected according to the file shareing policy */ + FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ + FR_TOO_MANY_OPEN_FILES /* (18) Number of open files > _FS_SHARE */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ +FRESULT f_open (FIL*, const TCHAR*, BYTE); /* Open or create a file */ +FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ +FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */ +FRESULT f_close (FIL*); /* Close an open file object */ +FRESULT f_opendir (DIR*, const TCHAR*); /* Open an existing directory */ +FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ +FRESULT f_stat (const TCHAR*, FILINFO*); /* Get file status */ + +#if !_FS_READONLY +FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ +FRESULT f_getfree (const TCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ +FRESULT f_truncate (FIL*); /* Truncate file */ +FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ +FRESULT f_unlink (const TCHAR*); /* Delete an existing file or directory */ +FRESULT f_mkdir (const TCHAR*); /* Create a new directory */ +FRESULT f_chmod (const TCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */ +FRESULT f_utime (const TCHAR*, const FILINFO*); /* Change timestamp of the file/dir */ +FRESULT f_rename (const TCHAR*, const TCHAR*); /* Rename/Move a file or directory */ +#endif + +#if _USE_FORWARD +FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ +#endif + +#if _USE_MKFS +FRESULT f_mkfs (BYTE, BYTE, UINT); /* Create a file system on the drive */ +#endif + +#if _FS_RPATH +FRESULT f_chdrive (BYTE); /* Change current drive */ +FRESULT f_chdir (const TCHAR*); /* Change current directory */ +FRESULT f_getcwd (TCHAR*, UINT); /* Get current directory */ +#endif + +#if _USE_STRFUNC +int f_putc (TCHAR, FIL*); /* Put a character to the file */ +int f_puts (const TCHAR*, FIL*); /* Put a string to the file */ +int f_printf (FIL*, const TCHAR*, ...); /* Put a formatted string to the file */ +TCHAR* f_gets (TCHAR*, int, FIL*); /* Get a string from the file */ +#ifndef EOF +#define EOF (-1) +#endif +#endif + +#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) +#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->fsize) + + + +/*--------------------------------------------------------------*/ +/* Additional user defined functions */ + +/* RTC function */ +#if !_FS_READONLY +DWORD get_fattime (void); +#endif + +/* Unicode support functions */ +#if _USE_LFN /* Unicode - OEM code conversion */ +WCHAR ff_convert (WCHAR, UINT); /* OEM-Unicode bidirectional conversion */ +WCHAR ff_wtoupper (WCHAR); /* Unicode upper-case conversion */ +#if _USE_LFN == 3 /* Memory functions */ +void* ff_memalloc (UINT); /* Allocate memory block */ +void ff_memfree (void*); /* Free memory block */ +#endif +#endif + +/* Sync functions */ +#if _FS_REENTRANT +int ff_cre_syncobj (BYTE, _SYNC_t*);/* Create a sync object */ +int ff_del_syncobj (_SYNC_t); /* Delete a sync object */ +int ff_req_grant (_SYNC_t); /* Lock sync object */ +void ff_rel_grant (_SYNC_t); /* Unlock sync object */ +#endif + + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access control and file status flags (FIL.flag) */ + +#define FA_READ 0x01 +#define FA_OPEN_EXISTING 0x00 +#define FA__ERROR 0x80 + +#if !_FS_READONLY +#define FA_WRITE 0x02 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA__WRITTEN 0x20 +#define FA__DIRTY 0x40 +#endif + + +/* FAT sub type (FATFS.fs_type) */ + +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 + + +/* File attribute bits for directory entry */ + +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* Fast seek function */ +#define CREATE_LINKMAP 0xFFFFFFFF + + +/*--------------------------------*/ +/* Multi-byte word access macros */ + +#if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ + #define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) + #define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) + #define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) + #define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) +#else /* Use byte-by-byte access to the FAT structure */ + #define LD_WORD(ptr) (WORD)(((WORD)*(BYTE*)((ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) + #define LD_DWORD(ptr) (DWORD)(((DWORD)*(BYTE*)((ptr)+3)<<24)|((DWORD)*(BYTE*)((ptr)+2)<<16)|((WORD)*(BYTE*)((ptr)+1)<<8)|*(BYTE*)(ptr)) + #define ST_WORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8) + #define ST_DWORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _FATFS */ diff --git a/quad/zybo_fsbl/src/ffconf.h b/quad/zybo_fsbl/src/ffconf.h new file mode 100644 index 000000000..1b57f9705 --- /dev/null +++ b/quad/zybo_fsbl/src/ffconf.h @@ -0,0 +1,188 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file R0.08a (C)ChaN, 2010 +/----------------------------------------------------------------------------/ +/ +/ CAUTION! Do not forget to make clean the project after any changes to +/ the configuration options. +/ +/----------------------------------------------------------------------------*/ +#ifndef _FFCONF +#define _FFCONF 8255 /* Revision ID */ + + +/*---------------------------------------------------------------------------/ +/ Function and Buffer Configurations +/----------------------------------------------------------------------------*/ + +#define _FS_TINY 1 /* 0:Normal or 1:Tiny */ +/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system +/ object instead of the sector buffer in the individual file object for file +/ data transfer. This reduces memory consumption 512 bytes each file object. */ + + +#define _FS_READONLY 1 /* 0:Read/Write or 1:Read only */ +/* Setting _FS_READONLY to 1 defines read only configuration. This removes +/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, +/ f_truncate and useless f_getfree. */ + + +#define _FS_MINIMIZE 1 /* 0 to 3 */ +/* The _FS_MINIMIZE option defines minimization level to remove some functions. +/ +/ 0: Full function. +/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename +/ are removed. +/ 2: f_opendir and f_readdir are removed in addition to 1. +/ 3: f_lseek is removed in addition to 2. */ + + +#define _USE_STRFUNC 0 /* 0:Disable or 1/2:Enable */ +/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ + + +#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ +/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ + + +#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ +/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ + + +#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ +/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ + + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/----------------------------------------------------------------------------*/ + +#define _CODE_PAGE 437 +/* The _CODE_PAGE specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) +/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) +/ 949 - Korean (DBCS, OEM, Windows) +/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) +/ 1250 - Central Europe (Windows) +/ 1251 - Cyrillic (Windows) +/ 1252 - Latin 1 (Windows) +/ 1253 - Greek (Windows) +/ 1254 - Turkish (Windows) +/ 1255 - Hebrew (Windows) +/ 1256 - Arabic (Windows) +/ 1257 - Baltic (Windows) +/ 1258 - Vietnam (OEM, Windows) +/ 437 - U.S. (OEM) +/ 720 - Arabic (OEM) +/ 737 - Greek (OEM) +/ 775 - Baltic (OEM) +/ 850 - Multilingual Latin 1 (OEM) +/ 858 - Multilingual Latin 1 + Euro (OEM) +/ 852 - Latin 2 (OEM) +/ 855 - Cyrillic (OEM) +/ 866 - Russian (OEM) +/ 857 - Turkish (OEM) +/ 862 - Hebrew (OEM) +/ 874 - Thai (OEM, Windows) +/ 1 - ASCII only (Valid for non LFN cfg.) +*/ + + +#define _USE_LFN 0 /* 0 to 3 */ +#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ +/* The _USE_LFN option switches the LFN support. +/ +/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, +/ Unicode handling functions ff_convert() and ff_wtoupper() must be added +/ to the project. When enable to use heap, memory control functions +/ ff_memalloc() and ff_memfree() must be added to the project. */ + + +#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ +/* To switch the character code set on FatFs API to Unicode, +/ enable LFN feature and set _LFN_UNICODE to 1. */ + + +#define _FS_RPATH 0 /* 0 to 2 */ +/* The _FS_RPATH option configures relative path feature. +/ +/ 0: Disable relative path feature and remove related functions. +/ 1: Enable relative path. f_chdrive() and f_chdir() are available. +/ 2: f_getcwd() is available in addition to 1. +/ +/ Note that output of the f_readdir fnction is affected by this option. */ + + + +/*---------------------------------------------------------------------------/ +/ Physical Drive Configurations +/----------------------------------------------------------------------------*/ + +#define _VOLUMES 1 +/* Number of volumes (logical drives) to be used. */ + + +#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ +/* Maximum sector size to be handled. +/ Always set 512 for memory card and hard disk but a larger value may be +/ required for floppy disk (512/1024) and optical disk (512/2048). +/ When _MAX_SS is larger than 512, GET_SECTOR_SIZE command must be implememted +/ to the disk_ioctl function. */ + + +#define _MULTI_PARTITION 0 /* 0:Single partition or 1:Multiple partition */ +/* When set to 0, each volume is bound to the same physical drive number and +/ it can mount only first primaly partition. When it is set to 1, each volume +/ is tied to the partitions listed in VolToPart[]. */ + + +#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ +/* To enable sector erase feature, set _USE_ERASE to 1. */ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/----------------------------------------------------------------------------*/ + +#define _WORD_ACCESS 0 /* 0 or 1 */ +/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS +/ option defines which access method is used to the word data on the FAT volume. +/ +/ 0: Byte-by-byte access. +/ 1: Word access. Do not choose this unless following condition is met. +/ +/ When the byte order on the memory is big-endian or address miss-aligned word +/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. +/ If it is not the case, the value can also be set to 1 to improve the +/ performance and code size. */ + + +/* Include a header file here to define sync object types on the O/S */ +/* #include <windows.h>, <ucos_ii.h.h>, <semphr.h> or ohters. */ + +#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ +#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ +#define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ + +/* The _FS_REENTRANT option switches the reentrancy of the FatFs module. +/ +/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. +/ 1: Enable reentrancy. Also user provided synchronization handlers, +/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj +/ function must be added to the project. */ + + +#define _FS_SHARE 0 /* 0:Disable or >=1:Enable */ +/* To enable file shareing feature, set _FS_SHARE to 1 or greater. The value + defines how many files can be opened simultaneously. */ + + +#endif /* _FFCONFIG */ diff --git a/quad/zybo_fsbl/src/fsbl.h b/quad/zybo_fsbl/src/fsbl.h new file mode 100644 index 000000000..edb0e039e --- /dev/null +++ b/quad/zybo_fsbl/src/fsbl.h @@ -0,0 +1,477 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl.h +* +* Contains the function prototypes, defines and macros for the +* First Stage Boot Loader (FSBL) functionality +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a jz 03/04/11 Initial release +* 2.00a mb 06/06/12 Removed the qspi define, will be picked from +* xparameters.h file +* 3.00a np/mb 08/08/12 Added the error codes for the FSBL hook errors. +* Added the debug levels +* 4.00a sgd 02/28/13 Removed DDR initialization check +* Removed DDR ECC initialization code +* Modified hand off address check to 1MB +* Added RSA authentication support +* Removed LPBK_DLY_ADJ register setting code as we use +* divisor 8 +* Removed check for Fabric is already initialized +* +* CR's fixed and description +* 689026: FSBL doesn't hold PL resets active during +* bit download +* Resolution: PL resets are released just before +* handoff +* +* 689077: FSBL hangs at Handoff clearing the +* TX UART buffer +* Resolution: STDOUT_BASEADDRESS macro value changes +* based UART select, hence used STDOUT_BASEADDRESS +* as UART base address +* +* 695578: FSBL failed to load standalone application +* in secure bootmode +* Resolution: Application will be placed at load address +* instead of DDR temporary address +* +* 699475: FSBL functionality is broken and its +* not able to boot in QSPI/NAND bootmode +* Resolution: New flags are added DevCfg driver +* for handling loopback +* XDCFG_CONCURRENT_NONSEC_READ_WRITE +* XDCFG_CONCURRENT_SECURE_READ_WRITE +* +* 683145: Define stack area for FIQ, UNDEF modes +* in linker file +* Resolution: FSBL linker modified to create stack area +* for FIQ, UNDEF +* +* 705664: FSBL fails to decrypt the bitstream when +* the image is AES encrypted using non-zero key value +* Resolution: Fabric cleaning will not be done +* for AES-E-Fuse encryption +* +* Watchdog disabled for AES E-Fuse encryption +* +* 5.00a sgd 05/17/13 Fallback support for E-Fuse encryption +* Added QSPI Flash Size > 128Mbit support +* QSPI Dual Stack support +* Added Md5 checksum support +* +* CR's fixed and description +* 692045 FSBL: Linker script of FSBL has PHDR workaround, +* this needs to be fixed +* Resolution: Removed PHDR from Linker file +* +* 704287 FSBL: fsbl.h file has a few error codes that +* are not used by FSBL, that needs to be removed +* Resolution: Removed unused error codes +* +* 704379 FSBL: Check if DDR is in proper state before +* handoff +* Resolution: Added DDR initialization check +* +* 709077 If FSBL_DEBUG and FSBL_DEBUG_INFO are defined, +* the debug level is FSBL_DEBUG only. +* +* 710128 FSBL: Linux boot failing without load attribute +* set for Linux partitions in BIF +* Resolution: FSBL will load partitions with valid load +* address and stop loading if any invalid load address +* +* 708728 Issues seen while making HP interconnect +* 32 bit wide +* Resolution: ps7_post_config function generated by PCW +* will be called after Bit stream download +* Added MMC support +* 6.00a kc 07/31/2013 CR's fixed and description +* 724166 FSBL doesn’t use PPK authenticated by Boot ROM +* for authenticating the Partition images +* Resolution: FSBL now uses the PPK left by Boot ROM in +* OCM for authencating the SPK +* +* 724165 Partition Header used by FSBL is not +* authenticated +* Resolution: FSBL now authenticates the partition header +* +* 691150 ps7_init does not check for peripheral +* initialization failures or timeout on polls +* Resolution: Return value of ps7_init() is now checked +* by FSBL and prints the error string +* +* 708316 PS7_init.tcl file should have Error mechanism +* for all mask_poll +* Resolution: Return value of ps7_init() is now checked +* by FSBL and prints the error string +* +* 732062 FSBL fails to build if UART not available +* Resolution: Added define to call xil_printf only +* if uart is defined +* +* 722979 Provide customer-friendly changelogs in FSBL +* Resolution: Added CR description for all the files +* +* 732865 Backward compatibility for ps7_init function +* Resolution: Added a new define for ps7_init success +* and value is defined based on ps7_init define +* +* Fix for CR#739711 - FSBL not able to read Large +* QSPI (512M) in IO Mode +* Resolution: Modified the address calculation +* algorithm in dual parallel mode for QSPI +* +* </pre> +* +* </pre> +* +* @note +* +* Flags in FSBL +* +* FSBL_PERF +* +* This Flag can be set at compilation time. This flag is set for +* measuring the performance of FSBL.That is the time taken to execute is +* measured.when this flag is set.Execution time with reference to +* global timer is taken here +* +* Total Execution time is the time taken for executing FSBL till handoff +* to any application . +* If there is a bitstream in the partition header then the +* execution time includes the copying of the bitstream to DDR +* (in case of SD/NAND bootmode) +* and programming the devcfg dma is accounted. +* +* FSBL provides two debug levels +* DEBUG GENERAL - fsbl_printf under this category will appear only when the +* FSBL_DEBUG flag is set during compilation +* DEBUG_INFO - fsbl_printf under this category will appear when the +* FSBL_DEBUG_INFO flag is set during compilation +* For a more detailed output log can be used. +* FSBL_DEBUG_RSA - Define this macro to print more detailed values used in +* RSA functions +* These macros are input to the fsbl_printf function +* +* DEBUG LEVELS +* FSBL_DEBUG level is level 1, when this flag is set all the fsbl_prints +* that are with the DEBUG_GENERAL argument are shown +* FSBL_DEBUG_INFO is level 2, when this flag is set during the +* compilation , the fsbl_printf with DEBUG_INFO will appear on the com port +* +* DEFAULT LEVEL +* By default no print messages will appear. +* +* NON_PS_INSTANTIATED_BITSTREAM +* +* FSBL will not enable the level shifters for a NON PS instantiated +* Bitstream.This flag can be set during compilation for a NON PS instantiated +* bitstream +* +* ECC_ENABLE +* This flag will be defined in the ps7_init.h file when ECC is enabled +* in the DDR configuration (XPS GUI) +* +* RSA_SUPPORT +* This flag is used to enable authentication feature +* Default this macro disabled, reason to avoid increase in code size +* +* MMC_SUPPORT +* This flag is used to enable MMC support feature +* +*******************************************************************************/ +#ifndef XIL_FSBL_H +#define XIL_FSBL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xil_io.h" +#include "xparameters.h" +#include "xpseudo_asm.h" +#include "xil_printf.h" +#include "pcap.h" +#include "fsbl_debug.h" +#include "ps7_init.h" +#ifdef FSBL_PERF +#include "xtime_l.h" +#include <stdio.h> +#endif + + +/************************** Constant Definitions *****************************/ +/* + * SDK release version + */ +#define SDK_RELEASE_VER 14 +#define SDK_SUB_VER 7 +#define SDK_RELEASE_YEAR 2013 +#define SDK_RELEASE_QUARTER 3 + +#define WORD_LENGTH_SHIFT 2 + +/* + * On a Successful handoff to an application FSBL sets this SUCCESS code + */ +#define SUCCESSFUL_HANDOFF 0x1 /* Successful Handoff */ + +/* + * Backward compatibility for ps7_init + */ +#ifdef NEW_PS7_ERR_CODE +#define FSBL_PS7_INIT_SUCCESS PS7_INIT_SUCCESS +#else +#define FSBL_PS7_INIT_SUCCESS (1) +#endif + +/* + * ERROR CODES + * The following are the Error codes that FSBL uses + * If the Debug prints are enabled only then the error codes will be + * seen on the com port.Without the debug prints enabled no error codes will + * be visible.There are not saved in any register + * Boot Mode States used for error and status output + * Error codes are defined below + */ +#define ILLEGAL_BOOT_MODE 0xA000 /**< Illegal boot mode */ +#define ILLEGAL_RETURN 0xA001 /**< Illegal return */ +#define PCAP_INIT_FAIL 0xA002 /**< Pcap driver Init Failed */ +#define DECRYPTION_FAIL 0xA003 /**< Decryption Failed */ +#define BITSTREAM_DOWNLOAD_FAIL 0xA004 /**< Bitstream download fail */ +#define DMA_TRANSFER_FAIL 0xA005 /**< DMA Transfer Fail */ +#define INVALID_FLASH_ADDRESS 0xA006 /**< Invalid Flash Address */ +#define DDR_INIT_FAIL 0xA007 /**< DDR Init Fail */ +#define NO_DDR 0xA008 /**< DDR missing */ +#define SD_INIT_FAIL 0xA009 /**< SD Init fail */ +#define NAND_INIT_FAIL 0xA00A /**< Nand Init Fail */ +#define PARTITION_MOVE_FAIL 0xA00B /**< Partition move fail */ +#define AUTHENTICATION_FAIL 0xA00C /**< Authentication fail */ +#define INVALID_HEADER_FAIL 0xA00D /**< Invalid header fail */ +#define GET_HEADER_INFO_FAIL 0xA00E /**< Get header fail */ +#define INVALID_LOAD_ADDRESS_FAIL 0xA00F /**< Invalid load address fail */ +#define PARTITION_CHECKSUM_FAIL 0xA010 /**< Partition checksum fail */ +#define RSA_SUPPORT_NOT_ENABLED_FAIL 0xA011 /**< RSA not enabled fail */ +#define PS7_INIT_FAIL 0xA012 /**< ps7 Init Fail */ +/* + * FSBL Exception error codes + */ +#define EXCEPTION_ID_UNDEFINED_INT 0xA301 /**< Undefined INT Exception */ +#define EXCEPTION_ID_SWI_INT 0xA302 /**< SWI INT Exception */ +#define EXCEPTION_ID_PREFETCH_ABORT_INT 0xA303 /**< Prefetch Abort xception */ +#define EXCEPTION_ID_DATA_ABORT_INT 0xA304 /**< Data Abort Exception */ +#define EXCEPTION_ID_IRQ_INT 0xA305 /**< IRQ Exception Occurred */ +#define EXCEPTION_ID_FIQ_INT 0xA306 /**< FIQ Exception Occurred */ + +/* + * FSBL hook routine failures + */ +#define FSBL_HANDOFF_HOOK_FAIL 0xA401 /**< FSBL handoff hook failed */ +#define FSBL_BEFORE_BSTREAM_HOOK_FAIL 0xA402 /**< FSBL before bit stream + download hook failed */ +#define FSBL_AFTER_BSTREAM_HOOK_FAIL 0xA403 /**< FSBL after bitstream + download hook failed */ + +/* + * Watchdog related Error codes + */ +#define WDT_RESET_OCCURED 0xA501 /**< WDT Reset happened in FSBL */ +#define WDT_INIT_FAIL 0xA502 /**< WDT driver INIT failed */ + +/* + * SLCR Registers + */ +#define PS_RST_CTRL_REG (XPS_SYS_CTRL_BASEADDR + 0x200) +#define FPGA_RESET_REG (XPS_SYS_CTRL_BASEADDR + 0x240) +#define RESET_REASON_REG (XPS_SYS_CTRL_BASEADDR + 0x250) +#define RESET_REASON_CLR (XPS_SYS_CTRL_BASEADDR + 0x254) +#define REBOOT_STATUS_REG (XPS_SYS_CTRL_BASEADDR + 0x258) +#define BOOT_MODE_REG (XPS_SYS_CTRL_BASEADDR + 0x25C) +#define PS_LVL_SHFTR_EN (XPS_SYS_CTRL_BASEADDR + 0x900) + +/* + * Efuse Status Register + */ +#define EFUSE_STATUS_REG (0xF800D010) /**< Efuse Status Register */ +#define EFUSE_STATUS_RSA_ENABLE_MASK (0x400) /**< Status of RSA enable */ + +/* + * PS reset control register define + */ +#define PS_RST_MASK 0x1 /**< PS software reset */ + +/* + * SLCR BOOT Mode Register defines + */ +#define BOOT_MODES_MASK 0x00000007 /**< FLASH types */ + +/* + * Boot Modes + */ +#define JTAG_MODE 0x00000000 /**< JTAG Boot Mode */ +#define QSPI_MODE 0x00000001 /**< QSPI Boot Mode */ +#define NOR_FLASH_MODE 0x00000002 /**< NOR Boot Mode */ +#define NAND_FLASH_MODE 0x00000004 /**< NAND Boot Mode */ +#define SD_MODE 0x00000005 /**< SD Boot Mode */ +#define MMC_MODE 0x00000006 /**< MMC Boot Device */ + +#define RESET_REASON_SRST 0x00000020 /**< Reason for reset is SRST */ +#define RESET_REASON_SWDT 0x00000001 /**< Reason for reset is SWDT */ + +/* + * Golden image offset + */ +#define GOLDEN_IMAGE_OFFSET 0x8000 + +/* + * Silicon Version + */ +#define SILICON_VERSION_1 0 +#define SILICON_VERSION_2 1 +#define SILICON_VERSION_3 2 +#define SILICON_VERSION_3_1 3 + +/* + * DDR start address for storing the data temporarily(1M) + * Need to finalize correct logic + */ +#ifdef XPAR_PS7_DDR_0_S_AXI_BASEADDR +#define DDR_START_ADDR XPAR_PS7_DDR_0_S_AXI_BASEADDR +#define DDR_END_ADDR XPAR_PS7_DDR_0_S_AXI_HIGHADDR +#else +/* + * In case of PL DDR, this macros defined based PL DDR address + */ +#define DDR_START_ADDR 0x00 +#define DDR_END_ADDR 0x00 +#endif + +#define DDR_TEMP_START_ADDR DDR_START_ADDR +/* + * DDR test pattern + */ +#define DDR_TEST_PATTERN 0xAA55AA55 +#define DDR_TEST_OFFSET 0x100000 +/* + * + */ +#define QSPI_DUAL_FLASH_SIZE 0x2000000; /*32MB*/ +#define QSPI_SINGLE_FLASH_SIZE 0x1000000; /*16MB*/ +#define NAND_FLASH_SIZE 0x8000000; /*128MB*/ +#define NOR_FLASH_SIZE 0x2000000; /*32MB*/ +#define LQSPI_CFG_OFFSET 0xA0 +#define LQSPI_CFG_DUAL_FLASH_MASK 0x40000000 + +/* + * These are the SLCR lock and unlock macros + */ +#define SlcrUnlock() Xil_Out32(XPS_SYS_CTRL_BASEADDR + 0x08, 0xDF0DDF0D) +#define SlcrLock() Xil_Out32(XPS_SYS_CTRL_BASEADDR + 0x04, 0x767B767B) + +#define IMAGE_HEADER_CHECKSUM_COUNT 10 + +/* Boot ROM Image defines */ +#define IMAGE_WIDTH_CHECK_OFFSET (0x020) /**< 0xaa995566 Width Detection word */ +#define IMAGE_IDENT_OFFSET (0x024) /**< 0x584C4E58 "XLNX" */ +#define IMAGE_ENC_FLAG_OFFSET (0x028) /**< 0xA5C3C5A3 */ +#define IMAGE_USR_DEF_OFFSET (0x02C) /**< undefined could be used as */ +#define IMAGE_SOURCE_ADDR_OFFSET (0x030) /**< start address of image */ +#define IMAGE_BYTE_LEN_OFFSET (0x034) /**< length of image> in bytes */ +#define IMAGE_DEST_ADDR_OFFSET (0x038) /**< destination address in OCM */ +#define IMAGE_EXECUTE_ADDR_OFFSET (0x03c) /**< address to start executing at */ +#define IMAGE_TOT_BYTE_LEN_OFFSET (0x040) /**< total length of image in bytes */ +#define IMAGE_QSPI_CFG_WORD_OFFSET (0x044) /**< QSPI configuration data */ +#define IMAGE_CHECKSUM_OFFSET (0x048) /**< Header Checksum offset */ +#define IMAGE_IDENT (0x584C4E58) /**< XLNX pattern */ + +/* Reboot status register defines: + * 0xF0000000 for FSBL fallback mask to notify Boot Rom + * 0x60000000 for FSBL to mark that FSBL has not handoff yet + * 0x00FFFFFF for user application to use across soft reset + */ +#define FSBL_FAIL_MASK 0xF0000000 +#define FSBL_IN_MASK 0x60000000 + +/* The address that holds the base address for the image Boot ROM found */ +#define BASEADDR_HOLDER 0xFFFFFFF8 + +/**************************** Type Definitions *******************************/ + +/************************** Function Prototypes ******************************/ + +void OutputStatus(u32 State); +void FsblFallback(void); + +int FsblSetNextPartition(int Num); +void *(memcpy_rom)(void * s1, const void * s2, u32 n); +char *strcpy_rom(char *Dest, const char *Src); + +void ClearFSBLIn(void); +void MarkFSBLIn(void); +void FsblHandoff(u32 FsblStartAddr); +u32 GetResetReason(void); + +#ifdef FSBL_PERF +void FsblGetGlobalTime (XTime tCur); +void FsblMeasurePerfTime (XTime tCur, XTime tEnd); +#endif +void GetSiliconVersion(void); +void FsblHandoffExit(u32 FsblStartAddr); +void FsblHandoffJtagExit(); +/************************** Variable Definitions *****************************/ +extern int SkipPartition; + +/***************** Macros (Inline Functions) Definitions *********************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl/src/fsbl_debug.h b/quad/zybo_fsbl/src/fsbl_debug.h new file mode 100644 index 000000000..a03cf6216 --- /dev/null +++ b/quad/zybo_fsbl/src/fsbl_debug.h @@ -0,0 +1,98 @@ +/************************************************************** + * (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. + * + * This file contains confidential and proprietary information + * of Xilinx, Inc. and is protected under U.S. and + * international copyright and other intellectual property + * laws. + * + * DISCLAIMER + * This disclaimer is not a license and does not grant any + * rights to the materials distributed herewith. Except as + * otherwise provided in a valid license issued to you by + * Xilinx, and to the maximum extent permitted by applicable + * law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND + * WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES + * AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING + * BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- + * INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and + * (2) Xilinx shall not be liable (whether in contract or tort, + * including negligence, or under any other theory of + * liability) for any loss or damage of any kind or nature + * related to, arising under or in connection with these + * materials, including for any direct, or any indirect, + * special, incidental, or consequential loss or damage + * (including loss of data, profits, goodwill, or any type of + * loss or damage suffered as a result of any action brought + * by a third party) even if such damage or loss was + * reasonably foreseeable or Xilinx had been advised of the + * possibility of the same. + * + * CRITICAL APPLICATIONS + * Xilinx products are not designed or intended to be fail- + * safe, or for use in any application requiring fail-safe + * performance, such as life-support or safety devices or + * systems, Class III medical devices, nuclear facilities, + * applications related to the deployment of airbags, or any + * other applications that could lead to death, personal + * injury, or severe property or environmental damage + * (individually and collectively, "Critical + * Applications"). Customer assumes the sole risk and + * liability of any use of Xilinx products in Critical + * Applications, subject only to applicable laws and + * regulations governing limitations on product liability. + * + * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS + * PART OF THIS FILE AT ALL TIMES. +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl_debug.h +* +* This file contains the debug verbose information for FSBL print functionality +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 3.00a mb 01/09/12 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ + +#ifndef _FSBL_DEBUG_H +#define _FSBL_DEBUG_H + +#ifdef __cplusplus +extern "C" { +#endif + + +#define DEBUG_GENERAL 0x00000001 /* general debug messages */ +#define DEBUG_INFO 0x00000002 /* More debug information */ + +#if defined (FSBL_DEBUG_INFO) +#define fsbl_dbg_current_types ((DEBUG_INFO) | (DEBUG_GENERAL)) +#elif defined (FSBL_DEBUG) +#define fsbl_dbg_current_types (DEBUG_GENERAL) +#else +#define fsbl_dbg_current_types 0 +#endif + +#ifdef STDOUT_BASEADDRESS +#define fsbl_printf(type,...) \ + if (((type) & fsbl_dbg_current_types)) {xil_printf (__VA_ARGS__); } +#else +#define fsbl_printf(type, ...) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _FSBL_DEBUG_H */ diff --git a/quad/zybo_fsbl/src/fsbl_handoff.S b/quad/zybo_fsbl/src/fsbl_handoff.S new file mode 100644 index 000000000..8aa308977 --- /dev/null +++ b/quad/zybo_fsbl/src/fsbl_handoff.S @@ -0,0 +1,115 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file handoff.S +* +* Contains the code that does the handoff to the loaded application. This +* code lives high in the ROM. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date.word Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 03/01/10 Initial release +* +* </pre> +* +* @note +* Assumes that the starting address of the FSBL is provided by the calling routine +* in R0. +* +******************************************************************************/ + +.globl FsblHandoffJtagExit + +.globl FsblHandoffExit + +.section .handoff,"axS" + +/***************************** Include Files *********************************/ + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +FsblHandoffJtagExit: + mcr 15,0,r0,cr7,cr5,0 /* Invalidate Instruction cache */ + mcr 15,0,r0,cr7,cr5,6 /* Invalidate branch predictor array */ + + dsb + isb /* make sure it completes */ + + ldr r4, =0 + mcr 15,0,r4,cr1,cr0,0 /* disable the ICache and MMU */ + + isb /* make sure it completes */ +Loop: + wfe + b Loop + +FsblHandoffExit: + mov lr, r0 /* move the destination address into link register */ + + mcr 15,0,r0,cr7,cr5,0 /* Invalidate Instruction cache */ + mcr 15,0,r0,cr7,cr5,6 /* Invalidate branch predictor array */ + + dsb + isb /* make sure it completes */ + + ldr r4, =0 + mcr 15,0,r4,cr1,cr0,0 /* disable the ICache and MMU */ + + isb /* make sure it completes */ + + + bx lr /* force the switch, destination should have been in r0 */ + +.Ldone: b .Ldone /* Paranoia: we should never get here */ +.end diff --git a/quad/zybo_fsbl/src/fsbl_hooks.c b/quad/zybo_fsbl/src/fsbl_hooks.c new file mode 100644 index 000000000..7b27a25e7 --- /dev/null +++ b/quad/zybo_fsbl/src/fsbl_hooks.c @@ -0,0 +1,173 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ + +/***************************************************************************** +* +* @file fsbl_hooks.c +* +* This file provides functions that serve as user hooks. The user can add the +* additional functionality required into these routines. This would help retain +* the normal FSBL flow unchanged. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 3.00a np 08/03/12 Initial release +* </pre> +* +* @note +* +******************************************************************************/ + + +#include "fsbl.h" +#include "xstatus.h" +#include "fsbl_hooks.h" + +/************************** Variable Definitions *****************************/ + + +/************************** Function Prototypes ******************************/ + + +/****************************************************************************** +* This function is the hook which will be called before the bitstream download. +* The user can add all the customized code required to be executed before the +* bitstream download to this routine. +* +* @param None +* +* @return +* - XST_SUCCESS to indicate success +* - XST_FAILURE.to indicate failure +* +****************************************************************************/ +u32 FsblHookBeforeBitstreamDload(void) +{ + u32 Status; + + Status = XST_SUCCESS; + + /* + * User logic to be added here. Errors to be stored in the status variable + * and returned + */ + fsbl_printf(DEBUG_INFO,"In FsblHookBeforeBitstreamDload function \r\n"); + + return (Status); +} + +/****************************************************************************** +* This function is the hook which will be called after the bitstream download. +* The user can add all the customized code required to be executed after the +* bitstream download to this routine. +* +* @param None +* +* @return +* - XST_SUCCESS to indicate success +* - XST_FAILURE.to indicate failure +* +****************************************************************************/ +u32 FsblHookAfterBitstreamDload(void) +{ + u32 Status; + + Status = XST_SUCCESS; + + /* + * User logic to be added here. + * Errors to be stored in the status variable and returned + */ + fsbl_printf(DEBUG_INFO, "In FsblHookAfterBitstreamDload function \r\n"); + + return (Status); +} + +/****************************************************************************** +* This function is the hook which will be called before the FSBL does a handoff +* to the application. The user can add all the customized code required to be +* executed before the handoff to this routine. +* +* @param None +* +* @return +* - XST_SUCCESS to indicate success +* - XST_FAILURE.to indicate failure +* +****************************************************************************/ +u32 FsblHookBeforeHandoff(void) +{ + u32 Status; + + Status = XST_SUCCESS; + + /* + * User logic to be added here. + * Errors to be stored in the status variable and returned + */ + fsbl_printf(DEBUG_INFO,"In FsblHookBeforeHandoff function \r\n"); + + return (Status); +} + + +/****************************************************************************** +* This function is the hook which will be called in case FSBL fall back +* +* @param None +* +* @return None +* +****************************************************************************/ +void FsblHookFallback(void) +{ + /* + * User logic to be added here. + * Errors to be stored in the status variable and returned + */ + fsbl_printf(DEBUG_INFO,"In FsblHookFallback function \r\n"); + while(1); +} + + diff --git a/quad/zybo_fsbl/src/fsbl_hooks.h b/quad/zybo_fsbl/src/fsbl_hooks.h new file mode 100644 index 000000000..6ba5c039f --- /dev/null +++ b/quad/zybo_fsbl/src/fsbl_hooks.h @@ -0,0 +1,90 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file fsbl_hooks.h +* +* Contains the function prototypes, defines and macros required by fsbl_hooks.c +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 3.00a np/mb 10/08/12 Initial release +* Corrected the prototype +* +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef FSBL_HOOKS_H_ +#define FSBL_HOOKS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "fsbl.h" + + +/************************** Function Prototypes ******************************/ + +/* FSBL hook function which is called before bitstream download */ +u32 FsblHookBeforeBitstreamDload(void); + +/* FSBL hook function which is called after bitstream download */ +u32 FsblHookAfterBitstreamDload(void); + +/* FSBL hook function which is called before handoff to the application */ +u32 FsblHookBeforeHandoff(void); + +/* FSBL hook function which is called in FSBL fallback */ +void FsblHookFallback(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl/src/image_mover.c b/quad/zybo_fsbl/src/image_mover.c new file mode 100644 index 000000000..81ab06a51 --- /dev/null +++ b/quad/zybo_fsbl/src/image_mover.c @@ -0,0 +1,1301 @@ +/****************************************************************************** +* +* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file image_mover.c +* +* Move partitions to either DDR to execute or to program FPGA. +* It performs partition walk. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a jz 05/24/11 Initial release +* 2.00a jz 06/30/11 Updated partition header defs for 64-byte +* alignment change in data2mem tool +* 2.00a mb 05/25/12 Updated for standalone based bsp FSBL +* Nand/SD encryption and review comments +* 3.00a np 08/30/12 Added FSBL user hook calls +* (before and after bitstream download.) +* 4.00a sgd 02/28/13 Fix for CR#691148 +* Fix for CR#695578 +* +* 4.00a sgd 04/23/13 Fix for CR#710128 +* 5.00a kc 07/30/13 Fix for CR#724165 +* Fix for CR#724166 +* Fix for CR#732062 +* +* </pre> +* +* @note +* A partition is either an executable or a bitstream to program FPGA +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "fsbl.h" +#include "image_mover.h" +#include "xil_printf.h" +#include "xreg_cortexa9.h" +#include "pcap.h" +#include "fsbl_hooks.h" +#include "md5.h" + +#ifdef XPAR_XWDTPS_0_BASEADDR +#include "xwdtps.h" +#endif + +#ifdef RSA_SUPPORT +#include "rsa.h" +#endif +/************************** Constant Definitions *****************************/ + +/* We are 32-bit machine */ +#define MAXIMUM_IMAGE_WORD_LEN 0x40000000 +#define MD5_CHECKSUM_SIZE 16 + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +u32 ValidateParition(u32 StartAddr, u32 Length, u32 ChecksumOffset); +u32 GetPartitionChecksum(u32 ChecksumOffset, u8 *Checksum); +u32 CalcPartitionChecksum(u32 SourceAddr, u32 DataLength, u8 *Checksum); + +/************************** Variable Definitions *****************************/ +/* + * Partition information flags + */ +u8 EncryptedPartitionFlag; +u8 PLPartitionFlag; +u8 PSPartitionFlag; +u8 SignedPartitionFlag; +u8 PartitionChecksumFlag; +u8 BitstreamFlag; +u8 ApplicationFlag; + +u32 ExecutionAddress; +ImageMoverType MoveImage; + +/* + * Header array + */ +PartHeader PartitionHeader[MAX_PARTITION_NUMBER]; +u32 PartitionCount; +u32 FsblLength; + +#ifdef XPAR_XWDTPS_0_BASEADDR +extern XWdtPs Watchdog; /* Instance of WatchDog Timer */ +#endif + +extern u32 Silicon_Version; +extern u32 FlashReadBaseAddress; +extern u8 LinearBootDeviceFlag; +extern XDcfg *DcfgInstPtr; + +/*****************************************************************************/ +/** +* +* This function +* +* @param +* +* @return +* +* +* @note None +* +****************************************************************************/ +u32 LoadBootImage(void) +{ + u32 RebootStatusRegister = 0; + u32 MultiBootReg = 0; + u32 ImageStartAddress = 0; + u32 PartitionNum; + u32 PartitionDataLength; + u32 PartitionImageLength; + u32 PartitionTotalSize; + u32 PartitionExecAddr; + u32 PartitionAttr; + u32 ExecAddress = 0; + u32 PartitionLoadAddr; + u32 PartitionStartAddr; + u32 PartitionChecksumOffset; + u8 ExecAddrFlag = 0 ; + u32 Status; + PartHeader *HeaderPtr; + u32 EfuseStatusRegValue; +#ifdef RSA_SUPPORT + u32 HeaderSize; +#endif + /* + * Resetting the Flags + */ + BitstreamFlag = 0; + ApplicationFlag = 0; + + RebootStatusRegister = Xil_In32(REBOOT_STATUS_REG); + fsbl_printf(DEBUG_INFO, + "Reboot status register: 0x%08x\r\n",RebootStatusRegister); + + if (Silicon_Version == SILICON_VERSION_1) { + /* + * Clear out fallback mask from previous run + * We start from the first partition again + */ + if ((RebootStatusRegister & FSBL_FAIL_MASK) == + FSBL_FAIL_MASK) { + fsbl_printf(DEBUG_INFO, + "Reboot status shows previous run falls back\r\n"); + RebootStatusRegister &= ~(FSBL_FAIL_MASK); + Xil_Out32(REBOOT_STATUS_REG, RebootStatusRegister); + } + + /* + * Read the image start address + */ + ImageStartAddress = *(u32 *)BASEADDR_HOLDER; + } else { + /* + * read the multiboot register + */ + MultiBootReg = XDcfg_ReadReg(DcfgInstPtr->Config.BaseAddr, + XDCFG_MULTIBOOT_ADDR_OFFSET); + + fsbl_printf(DEBUG_INFO,"Multiboot Register: 0x%08x\r\n",MultiBootReg); + + /* + * Compute the image start address + */ + ImageStartAddress = (MultiBootReg & PCAP_MBOOT_REG_REBOOT_OFFSET_MASK) + * GOLDEN_IMAGE_OFFSET; + } + + fsbl_printf(DEBUG_INFO,"Image Start Address: 0x%08x\r\n",ImageStartAddress); + + /* + * Get partitions header information + */ + Status = GetPartitionHeaderInfo(ImageStartAddress); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "Partition Header Load Failed\r\n"); + OutputStatus(GET_HEADER_INFO_FAIL); + FsblFallback(); + } + + /* + * RSA is not implemented in 1.0 and 2.0 + * silicon + */ + if ((Silicon_Version != SILICON_VERSION_1) && + (Silicon_Version != SILICON_VERSION_2)) { + /* + * Read Efuse Status Register + */ + EfuseStatusRegValue = Xil_In32(EFUSE_STATUS_REG); + if (EfuseStatusRegValue & EFUSE_STATUS_RSA_ENABLE_MASK) { + fsbl_printf(DEBUG_GENERAL,"RSA enabled for Chip\r\n"); +#ifdef RSA_SUPPORT + /* + * Set the Ppk + */ + SetPpk(); + + /* + * Read partition header with signature + */ + Status = GetImageHeaderAndSignature(ImageStartAddress, + (u32 *)DDR_TEMP_START_ADDR); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, + "Read Partition Header signature Failed\r\n"); + OutputStatus(GET_HEADER_INFO_FAIL); + FsblFallback(); + } + HeaderSize=TOTAL_HEADER_SIZE+RSA_SIGNATURE_SIZE; + + Status = AuthenticatePartition((u8 *)DDR_TEMP_START_ADDR, HeaderSize); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, + "Partition Header signature Failed\r\n"); + OutputStatus(GET_HEADER_INFO_FAIL); + FsblFallback(); + } +#else + /* + * In case user not enabled RSA authentication feature + */ + fsbl_printf(DEBUG_GENERAL,"RSA_SUPPORT_NOT_ENABLED_FAIL\r\n"); + OutputStatus(RSA_SUPPORT_NOT_ENABLED_FAIL); + FsblFallback(); +#endif + } + } + +#ifdef MMC_SUPPORT + /* + * In case of MMC support + * boot image preset in MMC will not have FSBL partition + */ + PartitionNum = 0; +#else + /* + * First partition header was ignored by FSBL + * As it contain FSBL partition information + */ + PartitionNum = 1; +#endif + + while (PartitionNum < PartitionCount) { + + fsbl_printf(DEBUG_INFO, "Partition Number: %d\r\n", PartitionNum); + + HeaderPtr = &PartitionHeader[PartitionNum]; + + /* + * Print partition header information + */ + HeaderDump(HeaderPtr); + + /* + * Validate partition header + */ + Status = ValidateHeader(HeaderPtr); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "INVALID_HEADER_FAIL\r\n"); + OutputStatus(INVALID_HEADER_FAIL); + FsblFallback(); + } + + /* + * Load partition header information in to local variables + */ + PartitionDataLength = HeaderPtr->DataWordLen; + PartitionImageLength = HeaderPtr->ImageWordLen; + PartitionExecAddr = HeaderPtr->ExecAddr; + PartitionAttr = HeaderPtr->PartitionAttr; + PartitionLoadAddr = HeaderPtr->LoadAddr; + PartitionChecksumOffset = HeaderPtr->CheckSumOffset; + PartitionStartAddr = HeaderPtr->PartitionStart; + PartitionTotalSize = HeaderPtr->PartitionWordLen; + + + if (PartitionAttr & ATTRIBUTE_PL_IMAGE_MASK) { + fsbl_printf(DEBUG_INFO, "Bitstream\r\n"); + PLPartitionFlag = 1; + PSPartitionFlag = 0; + BitstreamFlag = 1; + if (ApplicationFlag == 1) { +#ifdef STDOUT_BASEADDRESS + xil_printf("\r\nFSBL Warning !!!" + "Bitstream not loaded into PL\r\n"); + xil_printf("Partition order invalid\r\n"); +#endif + break; + } + } + + if (PartitionAttr & ATTRIBUTE_PS_IMAGE_MASK) { + fsbl_printf(DEBUG_INFO, "Application\r\n"); + PSPartitionFlag = 1; + PLPartitionFlag = 0; + ApplicationFlag = 1; + } + + /* + * Encrypted partition will have different value + * for Image length and data length + */ + if (PartitionDataLength != PartitionImageLength) { + fsbl_printf(DEBUG_INFO, "Encrypted\r\n"); + EncryptedPartitionFlag = 1; + } else { + EncryptedPartitionFlag = 0; + } + + /* + * Check for partition checksum check + */ + if (PartitionAttr & ATTRIBUTE_CHECKSUM_TYPE_MASK) { + PartitionChecksumFlag = 1; + } else { + PartitionChecksumFlag = 0; + } + + /* + * RSA signature check + */ + if (PartitionAttr & ATTRIBUTE_RSA_PRESENT_MASK) { + fsbl_printf(DEBUG_INFO, "RSA Signed\r\n"); + SignedPartitionFlag = 1; + } else { + SignedPartitionFlag = 0; + } + + /* + * Load address check + * Loop will break when PS load address zero and partition is + * un-signed or un-encrypted + */ + if ((PSPartitionFlag == 1) && (PartitionLoadAddr < DDR_START_ADDR)) { + if ((PartitionLoadAddr == 0) && + (!((SignedPartitionFlag == 1) || + (EncryptedPartitionFlag == 1)))) { + break; + } else { + fsbl_printf(DEBUG_GENERAL, + "INVALID_LOAD_ADDRESS_FAIL\r\n"); + OutputStatus(INVALID_LOAD_ADDRESS_FAIL); + FsblFallback(); + } + } + + if (PSPartitionFlag && (PartitionLoadAddr > DDR_END_ADDR)) { + fsbl_printf(DEBUG_GENERAL, + "INVALID_LOAD_ADDRESS_FAIL\r\n"); + OutputStatus(INVALID_LOAD_ADDRESS_FAIL); + FsblFallback(); + } + + /* + * Load execution address of first PS partition + */ + if (PSPartitionFlag && (!ExecAddrFlag)) { + ExecAddrFlag++; + ExecAddress = PartitionExecAddr; + } + + /* + * FSBL user hook call before bitstream download + */ + if (PLPartitionFlag) { + Status = FsblHookBeforeBitstreamDload(); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"FSBL_BEFORE_BSTREAM_HOOK_FAIL\r\n"); + OutputStatus(FSBL_BEFORE_BSTREAM_HOOK_FAIL); + FsblFallback(); + } + } + + /* + * Move partitions from boot device + */ + Status = PartitionMove(ImageStartAddress, HeaderPtr); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"PARTITION_MOVE_FAIL\r\n"); + OutputStatus(PARTITION_MOVE_FAIL); + FsblFallback(); + } + + if ((SignedPartitionFlag) || (PartitionChecksumFlag)) { + if(PLPartitionFlag) { + /* + * PL partition loaded in to DDR temporary address + * for authentication and checksum verification + */ + PartitionStartAddr = DDR_TEMP_START_ADDR; + } else { + PartitionStartAddr = PartitionLoadAddr; + } + + if (PartitionChecksumFlag) { + /* + * Validate the partition data with checksum + */ + Status = ValidateParition(PartitionStartAddr, + (PartitionTotalSize << WORD_LENGTH_SHIFT), + (PartitionChecksumOffset << WORD_LENGTH_SHIFT)); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"PARTITION_CHECKSUM_FAIL\r\n"); + OutputStatus(PARTITION_CHECKSUM_FAIL); + FsblFallback(); + } + + fsbl_printf(DEBUG_INFO, "Partition Validation Done\r\n"); + } + + /* + * Authentication Partition + */ + if (SignedPartitionFlag == 1 ) { +#ifdef RSA_SUPPORT + Status = AuthenticatePartition((u8*)PartitionStartAddr, + (PartitionTotalSize << WORD_LENGTH_SHIFT)); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"AUTHENTICATION_FAIL\r\n"); + OutputStatus(AUTHENTICATION_FAIL); + FsblFallback(); + } + fsbl_printf(DEBUG_INFO,"Authentication Done\r\n"); +#else + /* + * In case user not enabled RSA authentication feature + */ + fsbl_printf(DEBUG_GENERAL,"RSA_SUPPORT_NOT_ENABLED_FAIL\r\n"); + OutputStatus(RSA_SUPPORT_NOT_ENABLED_FAIL); + FsblFallback(); +#endif + } + + /* + * Decrypt PS partition + */ + if (EncryptedPartitionFlag && PSPartitionFlag) { + Status = DecryptPartition(PartitionStartAddr, + PartitionDataLength, + PartitionImageLength); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"DECRYPTION_FAIL\r\n"); + OutputStatus(DECRYPTION_FAIL); + FsblFallback(); + } + } + + /* + * Load Signed PL partition in Fabric + */ + if (PLPartitionFlag) { + Status = PcapLoadPartition((u32*)PartitionStartAddr, + (u32*)PartitionLoadAddr, + PartitionImageLength, + PartitionDataLength, + EncryptedPartitionFlag); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"BITSTREAM_DOWNLOAD_FAIL\r\n"); + OutputStatus(BITSTREAM_DOWNLOAD_FAIL); + FsblFallback(); + } + } + } + + + /* + * FSBL user hook call after bitstream download + */ + if (PLPartitionFlag) { + Status = FsblHookAfterBitstreamDload(); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"FSBL_AFTER_BSTREAM_HOOK_FAIL\r\n"); + OutputStatus(FSBL_AFTER_BSTREAM_HOOK_FAIL); + FsblFallback(); + } + } + /* + * Increment partition number + */ + PartitionNum++; + } + + return ExecAddress; +} + +/*****************************************************************************/ +/** +* +* This function loads all partition header information in global array +* +* @param ImageAddress is the start address of the image +* +* @return - XST_SUCCESS if Get partition Header information successful +* - XST_FAILURE if Get Partition Header information failed +* +* @note None +* +****************************************************************************/ +u32 GetPartitionHeaderInfo(u32 ImageBaseAddress) +{ + u32 PartitionHeaderOffset; + u32 Status; + + + /* + * Get the length of the FSBL from BootHeader + */ + Status = GetFsblLength(ImageBaseAddress, &FsblLength); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "Get Header Start Address Failed\r\n"); + return XST_FAILURE; + } + + /* + * Get the start address of the partition header table + */ + Status = GetPartitionHeaderStartAddr(ImageBaseAddress, + &PartitionHeaderOffset); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "Get Header Start Address Failed\r\n"); + return XST_FAILURE; + } + + /* + * Header offset on flash + */ + PartitionHeaderOffset += ImageBaseAddress; + + fsbl_printf(DEBUG_INFO,"Partition Header Offset:0x%08x\r\n", + PartitionHeaderOffset); + + /* + * Load all partitions header data in to global variable + */ + Status = LoadPartitionsHeaderInfo(PartitionHeaderOffset, + &PartitionHeader[0]); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "Header Information Load Failed\r\n"); + return XST_FAILURE; + } + + /* + * Get partitions count from partitions header information + */ + PartitionCount = GetPartitionCount(&PartitionHeader[0]); + + fsbl_printf(DEBUG_INFO, "Partition Count: %d\r\n", PartitionCount); + + /* + * Partition Count check + */ + if (PartitionCount >= MAX_PARTITION_NUMBER) { + fsbl_printf(DEBUG_GENERAL, "Invalid Partition Count\r\n"); + return XST_FAILURE; + + } else if (PartitionCount <= 1) { + fsbl_printf(DEBUG_GENERAL, "There is no partition to load\r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* +* This function goes to the partition header of the specified partition +* +* @param ImageAddress is the start address of the image +* +* @return Offset Partition header address of the image +* +* @return - XST_SUCCESS if Get Partition Header start address successful +* - XST_FAILURE if Get Partition Header start address failed +* +* @note None +* +****************************************************************************/ +u32 GetPartitionHeaderStartAddr(u32 ImageAddress, u32 *Offset) +{ + u32 Status; + + Status = MoveImage(ImageAddress + IMAGE_PHDR_OFFSET, (u32)Offset, 4); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"Move Image failed\r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function goes to the partition header of the specified partition +* +* @param ImageAddress is the start address of the image +* +* @return Offset to Image header table address of the image +* +* @return - XST_SUCCESS if Get Partition Header start address successful +* - XST_FAILURE if Get Partition Header start address failed +* +* @note None +* +****************************************************************************/ +u32 GetImageHeaderStartAddr(u32 ImageAddress, u32 *Offset) +{ + u32 Status; + + Status = MoveImage(ImageAddress + IMAGE_HDR_OFFSET, (u32)Offset, 4); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"Move Image failed\r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} +/*****************************************************************************/ +/** +* +* This function gets the length of the FSBL +* +* @param ImageAddress is the start address of the image +* +* @return FsblLength is the length of the fsbl +* +* @return - XST_SUCCESS if fsbl length reading is successful +* - XST_FAILURE if fsbl length reading failed +* +* @note None +* +****************************************************************************/ +u32 GetFsblLength(u32 ImageAddress, u32 *FsblLength) +{ + u32 Status; + + Status = MoveImage(ImageAddress + IMAGE_TOT_BYTE_LEN_OFFSET, + (u32)FsblLength, 4); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"Move Image failed reading FsblLength\r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +#ifdef RSA_SUPPORT +/*****************************************************************************/ +/** +* +* This function goes to read the image headers and its signature. Image +* header consists of image header table, image headers, partition +* headers +* +* @param ImageBaseAddress is the start address of the image header +* +* @return Offset Partition header address of the image +* +* @return - XST_SUCCESS if Get Partition Header start address successful +* - XST_FAILURE if Get Partition Header start address failed +* +* @note None +* +****************************************************************************/ +u32 GetImageHeaderAndSignature(u32 ImageBaseAddress, u32 *Offset) +{ + u32 Status; + u32 ImageHeaderOffset; + + /* + * Get the start address of the partition header table + */ + Status = GetImageHeaderStartAddr(ImageBaseAddress, &ImageHeaderOffset); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "Get Header Start Address Failed\r\n"); + return XST_FAILURE; + } + + Status = MoveImage(ImageBaseAddress+ImageHeaderOffset, (u32)Offset, + TOTAL_HEADER_SIZE + RSA_SIGNATURE_SIZE); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"Move Image failed\r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} +#endif +/*****************************************************************************/ +/** +* +* This function get the header information of the all the partitions and load into +* global array +* +* @param PartHeaderOffset Offset address where the header information present +* +* @param Header Partition header pointer +* +* @return - XST_SUCCESS if Load Partitions Header information successful +* - XST_FAILURE if Load Partitions Header information failed +* +* @note None +* +****************************************************************************/ +u32 LoadPartitionsHeaderInfo(u32 PartHeaderOffset, PartHeader *Header) +{ + u32 Status; + + Status = MoveImage(PartHeaderOffset, (u32)Header, sizeof(PartHeader)*MAX_PARTITION_NUMBER); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"Move Image failed\r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* +* This function dumps the partition header. +* +* @param Header Partition header pointer +* +* @return None +* +* @note None +* +******************************************************************************/ +void HeaderDump(PartHeader *Header) +{ + fsbl_printf(DEBUG_INFO, "Header Dump\r\n"); + fsbl_printf(DEBUG_INFO, "Image Word Len: 0x%08x\r\n", + Header->ImageWordLen); + fsbl_printf(DEBUG_INFO, "Data Word Len: 0x%08x\r\n", + Header->DataWordLen); + fsbl_printf(DEBUG_INFO, "Partition Word Len:0x%08x\r\n", + Header->PartitionWordLen); + fsbl_printf(DEBUG_INFO, "Load Addr: 0x%08x\r\n", + Header->LoadAddr); + fsbl_printf(DEBUG_INFO, "Exec Addr: 0x%08x\r\n", + Header->ExecAddr); + fsbl_printf(DEBUG_INFO, "Partition Start: 0x%08x\r\n", + Header->PartitionStart); + fsbl_printf(DEBUG_INFO, "Partition Attr: 0x%08x\r\n", + Header->PartitionAttr); + fsbl_printf(DEBUG_INFO, "Partition Checksum Offset: 0x%08x\r\n", + Header->CheckSumOffset); + fsbl_printf(DEBUG_INFO, "Section Count: 0x%08x\r\n", + Header->SectionCount); + fsbl_printf(DEBUG_INFO, "Checksum: 0x%08x\r\n", + Header->CheckSum); +} + + +/******************************************************************************/ +/** +* +* This function calculates the partitions count from header information +* +* @param Header Partition header pointer +* +* @return Count Partition count +* +* @note None +* +*******************************************************************************/ +u32 GetPartitionCount(PartHeader *Header) +{ + u32 Count=0; + struct HeaderArray *Hap; + + for(Count = 0; Count < MAX_PARTITION_NUMBER; Count++) { + Hap = (struct HeaderArray *)&Header[Count]; + if(IsLastPartition(Hap)!=XST_FAILURE) + break; + } + + return Count; +} + +/******************************************************************************/ +/** +* This function check whether the current partition is the end of partitions +* +* The partition is the end of the partitions if it looks like this: +* 0x00000000 +* 0x00000000 +* .... +* 0x00000000 +* 0x00000000 +* 0xFFFFFFFF +* +* @param H is a pointer to struct HeaderArray +* +* @return +* - XST_SUCCESS if it is the last partition +* - XST_FAILURE if it is not last partition +* +****************************************************************************/ +u32 IsLastPartition(struct HeaderArray *H) +{ + int Index; + + if (H->Fields[PARTITION_HDR_CHECKSUM_WORD_COUNT] != 0xFFFFFFFF) { + return XST_FAILURE; + } + + for (Index = 0; Index < PARTITION_HDR_WORD_COUNT - 1; Index++) { + + if (H->Fields[Index] != 0x0) { + return XST_FAILURE; + } + } + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* +* This function validates the partition header. +* +* @param Header Partition header pointer +* +* @return +* - XST_FAILURE if bad header. +* - XST_SUCCESS if successful. +* +* @note None +* +*******************************************************************************/ +u32 ValidateHeader(PartHeader *Header) +{ + struct HeaderArray *Hap; + + Hap = (struct HeaderArray *)Header; + + /* + * If there are no partitions to load, fail + */ + if (IsEmptyHeader(Hap) == XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "IMAGE_HAS_NO_PARTITIONS\r\n"); + return XST_FAILURE; + } + + /* + * Validate partition header checksum + */ + if (ValidatePartitionHeaderChecksum(Hap) != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "PARTITION_HEADER_CORRUPTION\r\n"); + return XST_FAILURE; + } + + /* + * Validate partition data size + */ + if (Header->ImageWordLen > MAXIMUM_IMAGE_WORD_LEN) { + fsbl_printf(DEBUG_GENERAL, "INVALID_PARTITION_LENGTH\r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* This function check whether the current partition header is empty. +* A partition header is considered empty if image word length is 0 and the +* last word is 0. +* +* @param H is a pointer to struct HeaderArray +* +* @return +* - XST_SUCCESS , If the partition header is empty +* - XST_FAILURE , If the partition header is NOT empty +* +* @note Caller is responsible to make sure the address is valid. +* +* +****************************************************************************/ +u32 IsEmptyHeader(struct HeaderArray *H) +{ + int Index; + + for (Index = 0; Index < PARTITION_HDR_WORD_COUNT; Index++) { + if (H->Fields[Index] != 0x0) { + return XST_FAILURE; + } + } + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* +* This function checks the header checksum If the header checksum is not valid +* XST_FAILURE is returned. +* +* @param H is a pointer to struct HeaderArray +* +* @return +* - XST_SUCCESS is header checksum is ok +* - XST_FAILURE if the header checksum is not correct +* +* @note None. +* +****************************************************************************/ +u32 ValidatePartitionHeaderChecksum(struct HeaderArray *H) +{ + u32 Checksum; + u32 Count; + + Checksum = 0; + + for (Count = 0; Count < PARTITION_HDR_CHECKSUM_WORD_COUNT; Count++) { + /* + * Read the word from the header + */ + Checksum += H->Fields[Count]; + } + + /* + * Invert checksum, last bit of error checking + */ + Checksum ^= 0xFFFFFFFF; + + /* + * Validate the checksum + */ + if (H->Fields[PARTITION_HDR_CHECKSUM_WORD_COUNT] != Checksum) { + fsbl_printf(DEBUG_GENERAL, "Error: Checksum 0x%8.8x != 0x%8.8x\r\n", + Checksum, H->Fields[PARTITION_HDR_CHECKSUM_WORD_COUNT]); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* +* This function load the partition from boot device +* +* @param ImageBaseAddress Base address on flash +* @param Header Partition header pointer +* +* @return +* - XST_SUCCESS if partition move successful +* - XST_FAILURE if check failed move failed +* +* @note None +* +*******************************************************************************/ +u32 PartitionMove(u32 ImageBaseAddress, PartHeader *Header) +{ + u32 SourceAddr; + u32 Status; + u8 SecureTransferFlag = 0; + u32 LoadAddr; + u32 ImageWordLen; + u32 DataWordLen; + + SourceAddr = ImageBaseAddress; + SourceAddr += Header->PartitionStart<<WORD_LENGTH_SHIFT; + LoadAddr = Header->LoadAddr; + ImageWordLen = Header->ImageWordLen; + DataWordLen = Header->DataWordLen; + + /* + * Add flash base address for linear boot devices + */ + if (LinearBootDeviceFlag) { + SourceAddr += FlashReadBaseAddress; + } + + /* + * Partition encrypted + */ + if(EncryptedPartitionFlag) { + SecureTransferFlag = 1; + } + + /* + * For Signed partition, Total partition image need to copied to DDR + */ + if (SignedPartitionFlag) { + ImageWordLen = Header->PartitionWordLen; + DataWordLen = Header->PartitionWordLen; + } + + /* + * Encrypted and Signed PS partition need to be loaded on to DDR + * without decryption + */ + if (PSPartitionFlag && + (SignedPartitionFlag || PartitionChecksumFlag) && + EncryptedPartitionFlag) { + SecureTransferFlag = 0; + } + + /* + * CPU is used for data transfer in case of non-linear + * boot device + */ + if (!LinearBootDeviceFlag) { + /* + * PL partition copied to DDR temporary location + */ + if (PLPartitionFlag) { + LoadAddr = DDR_TEMP_START_ADDR; + } + + Status = MoveImage(SourceAddr, + LoadAddr, + (ImageWordLen << WORD_LENGTH_SHIFT)); + if(Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "Move Image Failed\r\n"); + return XST_FAILURE; + } + + /* + * As image present at load address + */ + SourceAddr = LoadAddr; + } + + if ((LinearBootDeviceFlag && PLPartitionFlag && + (SignedPartitionFlag || PartitionChecksumFlag)) || + (LinearBootDeviceFlag && PSPartitionFlag) || + ((!LinearBootDeviceFlag) && PSPartitionFlag && SecureTransferFlag)) { + /* + * PL signed partition copied to DDR temporary location + * using non-secure PCAP for linear boot device + */ + if(PLPartitionFlag){ + SecureTransferFlag = 0; + LoadAddr = DDR_TEMP_START_ADDR; + } + + /* + * Data transfer using PCAP + */ + Status = PcapDataTransfer((u32*)SourceAddr, + (u32*)LoadAddr, + ImageWordLen, + DataWordLen, + SecureTransferFlag); + if(Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "PCAP Data Transfer Failed\r\n"); + return XST_FAILURE; + } + + /* + * As image present at load address + */ + SourceAddr = LoadAddr; + } + + /* + * Load Bitstream partition in to fabric only + * if checksum and authentication bits are not set + */ + if (PLPartitionFlag && (!(SignedPartitionFlag || PartitionChecksumFlag))) { + Status = PcapLoadPartition((u32*)SourceAddr, + (u32*)Header->LoadAddr, + Header->ImageWordLen, + Header->DataWordLen, + EncryptedPartitionFlag); + if(Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL, "PCAP Bitstream Download Failed\r\n"); + return XST_FAILURE; + } + } + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* +* This function load the decrypts partition +* +* @param StartAddr Source start address +* @param DataLength Data length in words +* @param ImageLength Image length in words +* +* @return +* - XST_SUCCESS if decryption successful +* - XST_FAILURE if decryption failed +* +* @note None +* +*******************************************************************************/ +u32 DecryptPartition(u32 StartAddr, u32 DataLength, u32 ImageLength) +{ + u32 Status; + u8 SecureTransferFlag =1; + + /* + * Data transfer using PCAP + */ + Status = PcapDataTransfer((u32*)StartAddr, + (u32*)StartAddr, + ImageLength, + DataLength, + SecureTransferFlag); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"PCAP Data Transfer failed \r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +/******************************************************************************/ +/** +* +* This function Validate Partition Data by using checksum preset in image +* +* @param Partition header pointer +* @param Partition check sum offset +* @return +* - XST_SUCCESS if partition data is ok +* - XST_FAILURE if partition data is corrupted +* +* @note None +* +*******************************************************************************/ +u32 ValidateParition(u32 StartAddr, u32 Length, u32 ChecksumOffset) +{ + u8 Checksum[MD5_CHECKSUM_SIZE]; + u8 CalcChecksum[MD5_CHECKSUM_SIZE]; + u32 Status; + u32 Index; + +#ifdef XPAR_XWDTPS_0_BASEADDR + /* + * Prevent WDT reset + */ + XWdtPs_RestartWdt(&Watchdog); +#endif + + /* + * Get checksum from flash + */ + Status = GetPartitionChecksum(ChecksumOffset, &Checksum[0]); + if(Status != XST_SUCCESS) { + return XST_FAILURE; + } + + fsbl_printf(DEBUG_INFO, "Actual checksum\r\n"); + + for (Index = 0; Index < MD5_CHECKSUM_SIZE; Index++) { + fsbl_printf(DEBUG_INFO, "0x%0x ",Checksum[Index]); + } + + fsbl_printf(DEBUG_INFO, "\r\n"); + + /* + * Calculate checksum for the partition + */ + Status = CalcPartitionChecksum(StartAddr, Length, &CalcChecksum[0]); + if(Status != XST_SUCCESS) { + return XST_FAILURE; + } + + fsbl_printf(DEBUG_INFO, "Calculated checksum\r\n"); + + for (Index = 0; Index < MD5_CHECKSUM_SIZE; Index++) { + fsbl_printf(DEBUG_INFO, "0x%0x ",CalcChecksum[Index]); + } + + fsbl_printf(DEBUG_INFO, "\r\n"); + + /* + * Compare actual checksum with the calculated checksum + */ + for (Index = 0; Index < MD5_CHECKSUM_SIZE; Index++) { + if(Checksum[Index] != CalcChecksum[Index]) { + fsbl_printf(DEBUG_GENERAL, "Error: " + "Partition DataChecksum 0x%0x!= 0x%0x\r\n", + Checksum[Index], CalcChecksum[Index]); + return XST_FAILURE; + } + } + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* +* This function gets partition checksum from flash +* +* @param Check sum offset +* @param Checksum pointer +* @return +* - XST_SUCCESS if checksum read success +* - XST_FAILURE if unable get checksum +* +* @note None +* +*******************************************************************************/ +u32 GetPartitionChecksum(u32 ChecksumOffset, u8 *Checksum) +{ + u32 Status; + + Status = MoveImage(ChecksumOffset, (u32)Checksum, MD5_CHECKSUM_SIZE); + if(Status != XST_SUCCESS) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* +* This function calculates the checksum preset in image +* +* @param Start address +* @param Length of the data +* @param Checksum pointer +* +* @return +* - XST_SUCCESS if Checksum calculate successful +* - XST_FAILURE if Checksum calculate failed +* +* @note None +* +*******************************************************************************/ +u32 CalcPartitionChecksum(u32 SourceAddr, u32 DataLength, u8 *Checksum) +{ + /* + * Calculate checksum using MD5 algorithm + */ + md5((u8*)SourceAddr, DataLength, Checksum, 0 ); + + return XST_SUCCESS; +} + diff --git a/quad/zybo_fsbl/src/image_mover.h b/quad/zybo_fsbl/src/image_mover.h new file mode 100644 index 000000000..e74d0bebc --- /dev/null +++ b/quad/zybo_fsbl/src/image_mover.h @@ -0,0 +1,166 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file image_mover.h +* +* This file contains the interface for moving the image from FLASH to OCM + +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a jz 03/04/11 Initial release +* 2.00a jz 06/04/11 partition header expands to 12 words +* 5.00a kc 07/30/13 Added defines for image header information +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef ___IMAGE_MOVER_H___ +#define ___IMAGE_MOVER_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "fsbl.h" + +/************************** Constant Definitions *****************************/ +#define PARTITION_NUMBER_SHIFT 24 +#define MAX_PARTITION_NUMBER (0xE) + +/* Boot Image Header defines */ +#define IMAGE_HDR_OFFSET 0x098 /* Start of image header table */ +#define IMAGE_PHDR_OFFSET 0x09C /* Start of partition headers */ +#define IMAGE_HEADER_SIZE (64) +#define IMAGE_HEADER_TABLE_SIZE (64) +#define TOTAL_PARTITION_HEADER_SIZE (MAX_PARTITION_NUMBER * IMAGE_HEADER_SIZE) +#define TOTAL_IMAGE_HEADER_SIZE (MAX_PARTITION_NUMBER * IMAGE_HEADER_SIZE) +#define TOTAL_HEADER_SIZE (IMAGE_HEADER_TABLE_SIZE + \ + TOTAL_IMAGE_HEADER_SIZE + \ + TOTAL_PARTITION_HEADER_SIZE + 64) + +/* Partition Header defines */ +#define PARTITION_IMAGE_WORD_LEN_OFFSET 0x00 /* Word length of image */ +#define PARTITION_DATA_WORD_LEN_OFFSET 0x04 /* Word length of data */ +#define PARTITION_WORD_LEN_OFFSET 0x08 /* Word length of partition */ +#define PARTITION_LOAD_ADDRESS_OFFSET 0x0C /* Load addr in DDR */ +#define PARTITION_EXEC_ADDRESS_OFFSET 0x10 /* Addr to start executing */ +#define PARTITION_ADDR_OFFSET 0x14 /* Partition word offset */ +#define PARTITION_ATTRIBUTE_OFFSET 0x18 /* Partition type */ +#define PARTITION_HDR_CHECKSUM_OFFSET 0x3C /* Header Checksum offset */ +#define PARTITION_HDR_CHECKSUM_WORD_COUNT 0xF /* Checksum word count */ +#define PARTITION_HDR_WORD_COUNT 0x10 /* Header word len */ +#define PARTITION_HDR_TOTAL_LEN 0x40 /* One partition hdr length*/ + +/* Attribute word defines */ +#define ATTRIBUTE_IMAGE_TYPE_MASK 0xF0 /* Destination Device type */ +#define ATTRIBUTE_PS_IMAGE_MASK 0x10 /* Code partition */ +#define ATTRIBUTE_PL_IMAGE_MASK 0x20 /* Bit stream partition */ +#define ATTRIBUTE_CHECKSUM_TYPE_MASK 0x7000 /* Checksum Type */ +#define ATTRIBUTE_RSA_PRESENT_MASK 0x8000 /* RSA Signature Present */ + + +/**************************** Type Definitions *******************************/ +typedef u32 (*ImageMoverType)( u32 SourceAddress, + u32 DestinationAddress, + u32 LengthBytes); + +typedef struct StructPartHeader { + u32 ImageWordLen; /* 0x0 */ + u32 DataWordLen; /* 0x4 */ + u32 PartitionWordLen; /* 0x8 */ + u32 LoadAddr; /* 0xC */ + u32 ExecAddr; /* 0x10 */ + u32 PartitionStart; /* 0x14 */ + u32 PartitionAttr; /* 0x18 */ + u32 SectionCount; /* 0x1C */ + u32 CheckSumOffset; /* 0x20 */ + u32 Pads1[1]; + u32 ACOffset; /* 0x28 */ + u32 Pads2[4]; + u32 CheckSum; /* 0x3C */ +}PartHeader; + +struct HeaderArray { + u32 Fields[16]; +}; + + +/***************** Macros (Inline Functions) Definitions *********************/ +#define MoverIn32 Xil_In32 +#define MoverOut32 Xil_Out32 + +/************************** Function Prototypes ******************************/ +u32 LoadBootImage(void); +u32 GetPartitionHeaderInfo(u32 ImageBaseAddress); +u32 PartitionMove(u32 ImageBaseAddress, PartHeader *Header); +u32 ValidatePartitionHeaderChecksum(struct HeaderArray *H); +u32 GetPartitionHeaderStartAddr(u32 ImageAddress, u32 *Offset); +u32 GetImageHeaderAndSignature(u32 ImageAddress, u32 *Offset); +u32 GetFsblLength(u32 ImageAddress, u32 *FsblLength); +u32 LoadPartitionsHeaderInfo(u32 PartHeaderOffset, PartHeader *Header); +u32 IsEmptyHeader(struct HeaderArray *H); +u32 IsLastPartition(struct HeaderArray *H); +void HeaderDump(PartHeader *Header); +u32 GetPartitionCount(PartHeader *Header); +u32 ValidateHeader(PartHeader *Header); +u32 DecryptPartition(u32 StartAddr, u32 DataLength, u32 ImageLength); + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + + +#endif /* ___IMAGE_MOVER_H___ */ + + + + diff --git a/quad/zybo_fsbl/src/integer.h b/quad/zybo_fsbl/src/integer.h new file mode 100644 index 000000000..75f5709a3 --- /dev/null +++ b/quad/zybo_fsbl/src/integer.h @@ -0,0 +1,36 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _INTEGER +#define _INTEGER + +#ifdef _WIN32 /* FatFs development platform */ + +#include <tchar.h> + +#else /* Embedded platform */ + +/* These types must be 16-bit, 32-bit or larger integer */ +typedef int INT; +typedef unsigned int UINT; + +/* These types must be 8-bit integer */ +typedef char CHAR; +typedef unsigned char UCHAR; +typedef unsigned char BYTE; + +/* These types must be 16-bit integer */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types must be 32-bit integer */ +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + +#endif + +#endif diff --git a/quad/zybo_fsbl/src/librsa.a b/quad/zybo_fsbl/src/librsa.a new file mode 100644 index 0000000000000000000000000000000000000000..cdf35a3f339c3d48fe2c67eea6e13806618178a2 GIT binary patch literal 12806 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 NYY?1hUkAzb{{qCCT6q8f literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl/src/lscript.ld b/quad/zybo_fsbl/src/lscript.ld new file mode 100644 index 000000000..d86df11b1 --- /dev/null +++ b/quad/zybo_fsbl/src/lscript.ld @@ -0,0 +1,287 @@ +/*******************************************************************/ +/* */ +/* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved */ +/* */ +/* Description : FSBL Linker Script */ +/* */ +/*******************************************************************/ + +_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x6000; +_HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x2000; + +_RSA_AC_SIZE = DEFINED(_RSA_AC_SIZE) ? _RSA_AC_SIZE : 0x1000; + +_ABORT_STACK_SIZE = DEFINED(_ABORT_STACK_SIZE) ? _ABORT_STACK_SIZE : 1024; +_SUPERVISOR_STACK_SIZE = DEFINED(_SUPERVISOR_STACK_SIZE) ? _SUPERVISOR_STACK_SIZE : 2048; +_FIQ_STACK_SIZE = DEFINED(_FIQ_STACK_SIZE) ? _FIQ_STACK_SIZE : 1024; +_UNDEF_STACK_SIZE = DEFINED(_UNDEF_STACK_SIZE) ? _UNDEF_STACK_SIZE : 1024; + +/* Define Memories in the system */ + +MEMORY +{ + ps7_ram_0_S_AXI_BASEADDR : ORIGIN = 0x00000000, LENGTH = 0x00030000 + ps7_ram_1_S_AXI_BASEADDR : ORIGIN = 0xFFFF0000, LENGTH = 0x0000FE00 +} + +/* Specify the default entry point to the program */ + +ENTRY(_vector_table) + + +SECTIONS +{ +.text : { + *(.vectors) + *(.boot) + *(.text) + *(.text.*) + *(.gnu.linkonce.t.*) + *(.plt) + *(.gnu_warning) + *(.gcc_execpt_table) + *(.glue_7) + *(.glue_7t) + *(.vfp11_veneer) + *(.ARM.extab) + *(.gnu.linkonce.armextab.*) +} > ps7_ram_0_S_AXI_BASEADDR + +.init : { + KEEP (*(.init)) +} > ps7_ram_0_S_AXI_BASEADDR + +.fini : { + KEEP (*(.fini)) +} > ps7_ram_0_S_AXI_BASEADDR + +.rodata : { + __rodata_start = .; + *(.rodata) + *(.rodata.*) + *(.gnu.linkonce.r.*) + __rodata_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.rodata1 : { + __rodata1_start = .; + *(.rodata1) + *(.rodata1.*) + __rodata1_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.sdata2 : { + __sdata2_start = .; + *(.sdata2) + *(.sdata2.*) + *(.gnu.linkonce.s2.*) + __sdata2_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.sbss2 : { + __sbss2_start = .; + *(.sbss2) + *(.sbss2.*) + *(.gnu.linkonce.sb2.*) + __sbss2_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.data : { + __data_start = .; + *(.data) + *(.data.*) + *(.gnu.linkonce.d.*) + *(.jcr) + *(.got) + *(.got.plt) + __data_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.data1 : { + __data1_start = .; + *(.data1) + *(.data1.*) + __data1_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.got : { + *(.got) +} > ps7_ram_0_S_AXI_BASEADDR + +.ctors : { + __CTOR_LIST__ = .; + ___CTORS_LIST___ = .; + KEEP (*crtbegin.o(.ctors)) + KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + ___CTORS_END___ = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.dtors : { + __DTOR_LIST__ = .; + ___DTORS_LIST___ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + ___DTORS_END___ = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.fixup : { + __fixup_start = .; + *(.fixup) + __fixup_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.eh_frame : { + *(.eh_frame) +} > ps7_ram_0_S_AXI_BASEADDR + +.eh_framehdr : { + __eh_framehdr_start = .; + *(.eh_framehdr) + __eh_framehdr_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.gcc_except_table : { + *(.gcc_except_table) +} > ps7_ram_0_S_AXI_BASEADDR + +.mmu_tbl ALIGN(0x4000): { + __mmu_tbl_start = .; + *(.mmu_tbl) + __mmu_tbl_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.ARM.exidx : { + __exidx_start = .; + *(.ARM.exidx*) + *(.gnu.linkonce.armexidix.*.*) + __exidx_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.preinit_array : { + __preinit_array_start = .; + KEEP (*(SORT(.preinit_array.*))) + KEEP (*(.preinit_array)) + __preinit_array_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.init_array : { + __init_array_start = .; + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + __init_array_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.fini_array : { + __fini_array_start = .; + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array)) + __fini_array_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.rsa_ac : { + . = ALIGN(64); + __rsa_ac_start = .; + . += _RSA_AC_SIZE; + __rsa_ac_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.ARM.attributes : { + __ARM.attributes_start = .; + *(.ARM.attributes) + __ARM.attributes_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.sdata : { + __sdata_start = .; + *(.sdata) + *(.sdata.*) + *(.gnu.linkonce.s.*) + __sdata_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.sbss (NOLOAD) : { + __sbss_start = .; + *(.sbss) + *(.sbss.*) + *(.gnu.linkonce.sb.*) + __sbss_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.tdata : { + __tdata_start = .; + *(.tdata) + *(.tdata.*) + *(.gnu.linkonce.td.*) + __tdata_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.tbss : { + __tbss_start = .; + *(.tbss) + *(.tbss.*) + *(.gnu.linkonce.tb.*) + __tbss_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.bss (NOLOAD) : { + __bss_start = .; + *(.bss) + *(.bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + __bss_end = .; +} > ps7_ram_0_S_AXI_BASEADDR + +_SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 ); + +_SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 ); + +/* Generate Stack and Heap definitions */ + +.heap (NOLOAD) : { + . = ALIGN(16); + _heap = .; + HeapBase = .; + _heap_start = .; + . += _HEAP_SIZE; + _heap_end = .; + HeapLimit = .; +} > ps7_ram_0_S_AXI_BASEADDR + +.stack (NOLOAD) : { + . = ALIGN(16); + _stack_end = .; + . += _STACK_SIZE; + _stack = .; + __stack = _stack; + . = ALIGN(16); + _irq_stack_end = .; + . += _STACK_SIZE; + __irq_stack = .; + _supervisor_stack_end = .; + . += _SUPERVISOR_STACK_SIZE; + . = ALIGN(16); + __supervisor_stack = .; + _abort_stack_end = .; + . += _ABORT_STACK_SIZE; + . = ALIGN(16); + __abort_stack = .; + _fiq_stack_end = .; + . += _FIQ_STACK_SIZE; + . = ALIGN(16); + __fiq_stack = .; + _undef_stack_end = .; + . += _UNDEF_STACK_SIZE; + . = ALIGN(16); + __undef_stack = .; +} > ps7_ram_1_S_AXI_BASEADDR + +_end = .; +} + diff --git a/quad/zybo_fsbl/src/main.c b/quad/zybo_fsbl/src/main.c new file mode 100644 index 000000000..aff88aebf --- /dev/null +++ b/quad/zybo_fsbl/src/main.c @@ -0,0 +1,1516 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file main.c +* +* The main file for the First Stage Boot Loader (FSBL). +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a jz 06/04/11 Initial release +* 2.00a mb 25/05/12 standalone based FSBL +* 3.00a np/mb 08/03/12 Added call to FSBL user hook - before handoff. +* DDR ECC initialization added +* fsbl print with verbose added +* Performance measurement added +* Flushed the UART Tx buffer +* Added the performance time for ECC DDR init +* Added clearing of ECC Error Code +* Added the watchdog timer value +* 4.00a sgd 02/28/13 Code Cleanup +* Fix for CR#681014 - ECC init in FSBL should not +* call fabric_init() +* Fix for CR#689077 - FSBL hangs at Handoff clearing the +* TX UART buffer when using UART0 +* instead of UART1 +* Fix for CR#694038 - FSBL debug logs always prints 14.3 +* as the Revision number - this is +* incorrect +* Fix for CR#694039 - FSBL prints "unsupported silicon +* version for v3.0" 3.0 Silicon +* Fix for CR#699475 - FSBL functionality is broken and +* its not able to boot in QSPI/NAND +* bootmode +* Removed DDR initialization check +* Removed DDR ECC initialization code +* Modified hand off address check to 1MB +* Added RSA authentication support +* Watchdog disabled for AES E-Fuse encryption +* 5.00a sgd 05/17/13 Fallback support for E-Fuse encryption +* Fix for CR#708728 - Issues seen while making HP +* interconnect 32 bit wide +* 6.00a kc 07/30/13 Fix for CR#708316 - PS7_init.tcl file should have +* Error mechanism for all mask_poll +* Fix for CR#691150 - ps7_init does not check for +* peripheral initialization failures +* or timeout on polls +* Fix for CR#724165 - Partition Header used by FSBL is +* not authenticated +* Fix for CR#724166 - FSBL doesn’t use PPK authenticated +* by Boot ROM for authenticating +* the Partition images +* Fix for CR#722979 - Provide customer-friendly +* changelogs in FSBL +* Fix for CR#732865 - Backward compatibility for ps7_init +* function +* </pre> +* +* @note +* FSBL runs from OCM, Based on the boot mode selected, FSBL will copy +* the partitions from the flash device. If the partition is bitstream then +* the bitstream is programmed in the Fabric and for an partition that is +* an application , FSBL will copy the application into DDR and does a +* handoff.The application should not be starting at the OCM address, +* FSBL does not remap the DDR. Application should use DDR starting from 1MB +* +* FSBL can be stitched along with bitstream and application using bootgen +* +* Refer to fsbl.h file for details on the compilation flags supported in FSBL +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "fsbl.h" +#include "qspi.h" +#include "nand.h" +#include "nor.h" +#include "sd.h" +#include "pcap.h" +#include "image_mover.h" +#include "xparameters.h" +#include "xil_cache.h" +#include "xil_exception.h" +#include "xstatus.h" +#include "fsbl_hooks.h" +#include "xtime_l.h" + +#ifdef XPAR_XWDTPS_0_BASEADDR +#include "xwdtps.h" +#endif + +#ifdef STDOUT_BASEADDRESS +#include "xuartps_hw.h" +#endif + +/************************** Constant Definitions *****************************/ + +#ifdef XPAR_XWDTPS_0_BASEADDR +#define WDT_DEVICE_ID XPAR_XWDTPS_0_DEVICE_ID +#define WDT_EXPIRE_TIME 100 +#define WDT_CRV_SHIFT 12 +#endif + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +#ifdef XPAR_XWDTPS_0_BASEADDR +XWdtPs Watchdog; /* Instance of WatchDog Timer */ +#endif +/************************** Function Prototypes ******************************/ +extern int ps7_init(); +extern char* getPS7MessageInfo(unsigned key); +#ifdef PS7_POST_CONFIG +extern int ps7_post_config(); +#endif +#ifdef PEEP_CODE +extern void init_ddr(void); +#endif + +static void Update_MultiBootRegister(void); +/* Exception handlers */ +static void RegisterHandlers(void); +static void Undef_Handler (void); +static void SVC_Handler (void); +static void PreFetch_Abort_Handler (void); +static void Data_Abort_Handler (void); +static void IRQ_Handler (void); +static void FIQ_Handler (void); + + +#ifdef XPAR_XWDTPS_0_BASEADDR +int InitWatchDog(void); +u32 ConvertTime_WdtCounter(u32 seconds); +void CheckWDTReset(void); +#endif + +u32 NextValidImageCheck(void); + +u32 DDRInitCheck(void); + +/************************** Variable Definitions *****************************/ +/* + * Base Address for the Read Functionality for Image Processing + */ +u32 FlashReadBaseAddress = 0; +/* + * Silicon Version + */ +u32 Silicon_Version; + +/* + * Boot Device flag + */ +u8 LinearBootDeviceFlag; + +u32 PcapCtrlRegVal; + +u8 SystemInitFlag; + +extern ImageMoverType MoveImage; +extern XDcfg *DcfgInstPtr; +extern u8 BitstreamFlag; +#ifdef XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR +extern u32 QspiFlashSize; +#endif +/*****************************************************************************/ +/** +* +* This is the main function for the FSBL ROM code. +* +* +* @param None. +* +* @return +* - XST_SUCCESS to indicate success +* - XST_FAILURE.to indicate failure +* +* @note +* +****************************************************************************/ +int main(void) +{ + u32 BootModeRegister = 0; + u32 HandoffAddress = 0; + u32 Status = XST_SUCCESS; + +#ifdef PEEP_CODE + /* + * PEEP DDR initialization + */ + init_ddr(); +#else + /* + * PCW initialization for MIO,PLL,CLK and DDR + */ + Status = ps7_init(); + if (Status != FSBL_PS7_INIT_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"PS7_INIT_FAIL : %s\r\n", + getPS7MessageInfo(Status)); + OutputStatus(PS7_INIT_FAIL); + /* + * Calling FsblHookFallback instead of Fallback + * since, devcfg driver is not yet initialized + */ + FsblHookFallback(); + } +#endif + + /* + * Unlock SLCR for SLCR register write + */ + SlcrUnlock(); + + /* If Performance measurement is required + * then read the Global Timer value , Please note that the + * time taken for mio, clock and ddr initialisation + * done in the ps7_init function is not accounted in the FSBL + * + */ +#ifdef FSBL_PERF + XTime tCur = 0; + FsblGetGlobalTime(tCur); +#endif + + /* + * Flush the Caches + */ + Xil_DCacheFlush(); + + /* + * Disable Data Cache + */ + Xil_DCacheDisable(); + + /* + * Register the Exception handlers + */ + RegisterHandlers(); + + /* + * Print the FSBL Banner + */ + fsbl_printf(DEBUG_GENERAL,"\n\rXilinx First Stage Boot Loader \n\r"); + fsbl_printf(DEBUG_GENERAL,"Release %d.%d/%d.%d %s-%s\r\n", + SDK_RELEASE_VER, SDK_SUB_VER, + SDK_RELEASE_YEAR, SDK_RELEASE_QUARTER, + __DATE__,__TIME__); + +#ifdef XPAR_PS7_DDR_0_S_AXI_BASEADDR + + /* + * DDR Read/write test + */ + Status = DDRInitCheck(); + if (Status == XST_FAILURE) { + fsbl_printf(DEBUG_GENERAL,"DDR_INIT_FAIL \r\n"); + /* Error Handling here */ + OutputStatus(DDR_INIT_FAIL); + /* + * Calling FsblHookFallback instead of Fallback + * since, devcfg driver is not yet initialized + */ + FsblHookFallback(); + } + + + /* + * PCAP initialization + */ + Status = InitPcap(); + if (Status == XST_FAILURE) { + fsbl_printf(DEBUG_GENERAL,"PCAP_INIT_FAIL \n\r"); + OutputStatus(PCAP_INIT_FAIL); + /* + * Calling FsblHookFallback instead of Fallback + * since, devcfg driver is not yet initialized + */ + FsblHookFallback(); + } + + fsbl_printf(DEBUG_INFO,"Devcfg driver initialized \r\n"); + + /* + * Get the Silicon Version + */ + GetSiliconVersion(); + +#ifdef XPAR_XWDTPS_0_BASEADDR + /* + * Check if WDT Reset has occurred or not + */ + CheckWDTReset(); + + /* + * Initialize the Watchdog Timer so that it is ready to use + */ + Status = InitWatchDog(); + if (Status == XST_FAILURE) { + fsbl_printf(DEBUG_GENERAL,"WATCHDOG_INIT_FAIL \n\r"); + OutputStatus(WDT_INIT_FAIL); + FsblFallback(); + } + fsbl_printf(DEBUG_INFO,"Watchdog driver initialized \r\n"); +#endif + + /* + * Get PCAP controller settings + */ + PcapCtrlRegVal = XDcfg_GetControlRegister(DcfgInstPtr); + + /* + * Check for AES source key + */ + if (PcapCtrlRegVal & PCAP_CTRL_PCFG_AES_FUSE_EFUSE_MASK) { + /* + * For E-Fuse AES encryption Watch dog Timer disabled and + * User not allowed to do system reset + */ +#ifdef XPAR_XWDTPS_0_BASEADDR + fsbl_printf(DEBUG_INFO,"Watchdog Timer Disabled\r\n"); + XWdtPs_Stop(&Watchdog); +#endif + fsbl_printf(DEBUG_INFO,"User not allowed to do " + "any system resets\r\n"); + } + + /* + * Store FSBL run state in Reboot Status Register + */ + MarkFSBLIn(); + + /* + * Read bootmode register + */ + BootModeRegister = Xil_In32(BOOT_MODE_REG); + BootModeRegister &= BOOT_MODES_MASK; + + /* + * QSPI BOOT MODE + */ +#ifdef XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR + +#ifdef MMC_SUPPORT + /* + * To support MMC boot + * QSPI boot mode detection ignored + */ + if (BootModeRegister == QSPI_MODE) { + BootModeRegister = MMC_MODE; + } +#endif + + if (BootModeRegister == QSPI_MODE) { + fsbl_printf(DEBUG_GENERAL,"Boot mode is QSPI\n\r"); + InitQspi(); + MoveImage = QspiAccess; + fsbl_printf(DEBUG_INFO,"QSPI Init Done \r\n"); + } else +#endif + + /* + * NAND BOOT MODE + */ +#ifdef XPAR_PS7_NAND_0_BASEADDR + if (BootModeRegister == NAND_FLASH_MODE) { + /* + * Boot ROM always initialize the nand at lower speed + * This is the chance to put it to an optimum speed for your nand + * device + */ + fsbl_printf(DEBUG_GENERAL,"Boot mode is NAND\n"); + + Status = InitNand(); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"NAND_INIT_FAIL \r\n"); + /* + * Error Handling here + */ + OutputStatus(NAND_INIT_FAIL); + FsblFallback(); + } + MoveImage = NandAccess; + fsbl_printf(DEBUG_INFO,"NAND Init Done \r\n"); + } else +#endif + + /* + * NOR BOOT MODE + */ + if (BootModeRegister == NOR_FLASH_MODE) { + fsbl_printf(DEBUG_GENERAL,"Boot mode is NOR\n\r"); + /* + * Boot ROM always initialize the nor at lower speed + * This is the chance to put it to an optimum speed for your nor + * device + */ + InitNor(); + fsbl_printf(DEBUG_INFO,"NOR Init Done \r\n"); + MoveImage = NorAccess; + } else + + /* + * SD BOOT MODE + */ +#ifdef XPAR_PS7_SD_0_S_AXI_BASEADDR + + if (BootModeRegister == SD_MODE) { + fsbl_printf(DEBUG_GENERAL,"Boot mode is SD\r\n"); + + /* + * SD initialization returns file open error or success + */ + Status = InitSD("BOOT.BIN"); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"SD_INIT_FAIL\r\n"); + OutputStatus(SD_INIT_FAIL); + FsblFallback(); + } + MoveImage = SDAccess; + fsbl_printf(DEBUG_INFO,"SD Init Done \r\n"); + } else + + if (BootModeRegister == MMC_MODE) { + fsbl_printf(DEBUG_GENERAL,"Booting Device is MMC\r\n"); + + /* + * MMC initialization returns file open error or success + */ + Status = InitSD("BOOT.BIN"); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"MMC_INIT_FAIL\r\n"); + OutputStatus(SD_INIT_FAIL); + FsblFallback(); + } + MoveImage = SDAccess; + fsbl_printf(DEBUG_INFO,"MMC Init Done \r\n"); + } else + +#endif + + /* + * JTAG BOOT MODE + */ + if (BootModeRegister == JTAG_MODE) { + fsbl_printf(DEBUG_GENERAL,"Boot mode is JTAG\r\n"); + /* + * Stop the Watchdog before JTAG handoff + */ +#ifdef XPAR_XWDTPS_0_BASEADDR + XWdtPs_Stop(&Watchdog); +#endif + /* + * Clear our mark in reboot status register + */ + ClearFSBLIn(); + + /* + * SLCR lock + */ + SlcrLock(); + + FsblHandoffJtagExit(); + } else { + fsbl_printf(DEBUG_GENERAL,"ILLEGAL_BOOT_MODE \r\n"); + OutputStatus(ILLEGAL_BOOT_MODE); + /* + * fallback starts, no return + */ + FsblFallback(); + } + + fsbl_printf(DEBUG_INFO,"Flash Base Address: 0x%08x\r\n", FlashReadBaseAddress); + + /* + * Check for valid flash address + */ + if ((FlashReadBaseAddress != XPS_QSPI_LINEAR_BASEADDR) && + (FlashReadBaseAddress != XPS_NAND_BASEADDR) && + (FlashReadBaseAddress != XPS_NOR_BASEADDR) && + (FlashReadBaseAddress != XPS_SDIO0_BASEADDR)) { + fsbl_printf(DEBUG_GENERAL,"INVALID_FLASH_ADDRESS \r\n"); + OutputStatus(INVALID_FLASH_ADDRESS); + FsblFallback(); + } + + /* + * NOR and QSPI (parallel) are linear boot devices + */ + if ((FlashReadBaseAddress == XPS_NOR_BASEADDR)) { + fsbl_printf(DEBUG_INFO, "Linear Boot Device\r\n"); + LinearBootDeviceFlag = 1; + } + +#ifdef XPAR_XWDTPS_0_BASEADDR + /* + * Prevent WDT reset + */ + XWdtPs_RestartWdt(&Watchdog); +#endif + + /* + * This used only in case of E-Fuse encryption + * For image search + */ + SystemInitFlag = 1; + + /* + * Load boot image + */ + HandoffAddress = LoadBootImage(); + + fsbl_printf(DEBUG_INFO,"Handoff Address: 0x%08x\r\n",HandoffAddress); + + /* + * For Performance measurement + */ +#ifdef FSBL_PERF + XTime tEnd = 0; + fsbl_printf(DEBUG_GENERAL,"Total Execution time is "); + FsblMeasurePerfTime(tCur,tEnd); +#endif + + /* + * FSBL handoff to valid handoff address or + * exit in JTAG + */ + FsblHandoff(HandoffAddress); + +#else + OutputStatus(NO_DDR); + FsblFallback(); +#endif + + return Status; +} + +/******************************************************************************/ +/** +* +* This function reset the CPU and goes for Boot ROM fallback handling +* +* @param None +* +* @return None +* +* @note None +* +****************************************************************************/ +void FsblFallback(void) +{ + u32 RebootStatusReg; + u32 Status; + u32 HandoffAddr; + u32 BootModeRegister; + + /* + * Read bootmode register + */ + BootModeRegister = Xil_In32(BOOT_MODE_REG); + BootModeRegister &= BOOT_MODES_MASK; + + /* + * Fallback support check + */ + if (!((BootModeRegister == QSPI_MODE) || + (BootModeRegister == NAND_FLASH_MODE) || + (BootModeRegister == NOR_FLASH_MODE))) { + fsbl_printf(DEBUG_INFO,"\r\n" + "This Boot Mode Doesn't Support Fallback\r\n"); + ClearFSBLIn(); + FsblHookFallback(); + } + + /* + * update the Multiboot Register for Golden search hunt + */ + Update_MultiBootRegister(); + + /* + * Notify Boot ROM something is wrong + */ + RebootStatusReg = Xil_In32(REBOOT_STATUS_REG); + + /* + * Set the FSBL Fail mask + */ + Xil_Out32(REBOOT_STATUS_REG, RebootStatusReg | FSBL_FAIL_MASK); + + /* + * Barrier for synchronization + */ + asm( + "dsb\n\t" + "isb" + ); + + /* + * Check for AES source key + */ + if (PcapCtrlRegVal & PCAP_CTRL_PCFG_AES_FUSE_EFUSE_MASK) { + /* + * Next valid image search can happen only + * when system initialization done + */ + if (SystemInitFlag == 1) { + /* + * Clean the Fabric + */ + FabricInit(); + + /* + * Search for next valid image + */ + Status = NextValidImageCheck(); + if(Status != XST_SUCCESS){ + fsbl_printf(DEBUG_INFO,"\r\nNo Image Found\r\n"); + ClearFSBLIn(); + FsblHookFallback(); + } + + /* + * Load next valid image + */ + HandoffAddr = LoadBootImage(); + + /* + * Handoff to next image + */ + FsblHandoff(HandoffAddr); + } else { + fsbl_printf(DEBUG_INFO,"System Initialization Failed\r\n"); + fsbl_printf(DEBUG_INFO,"\r\nNo Image Search\r\n"); + ClearFSBLIn(); + FsblHookFallback(); + } + } + + /* + * Reset PS, so Boot ROM will restart + */ + Xil_Out32(PS_RST_CTRL_REG, PS_RST_MASK); +} + + +/******************************************************************************/ +/** +* +* This function hands the A9/PS to the loaded user code. +* +* @param none +* +* @return none +* +* @note This function does not return. +* +****************************************************************************/ +void FsblHandoff(u32 FsblStartAddr) +{ + u32 Status; + + /* + * Enable level shifter + */ + if(BitstreamFlag) { + /* + * FSBL will not enable the level shifters for a NON PS instantiated + * Bitstream + * CR# 671028 + * This flag can be set during compilation for a NON PS instantiated + * bitstream + */ +#ifndef NON_PS_INSTANTIATED_BITSTREAM +#ifdef PS7_POST_CONFIG + ps7_post_config(); + /* + * Unlock SLCR for SLCR register write + */ + SlcrUnlock(); +#else + /* + * Set Level Shifters DT618760 + */ + Xil_Out32(PS_LVL_SHFTR_EN, LVL_PL_PS); + fsbl_printf(DEBUG_INFO,"Enabling Level Shifters PL to PS " + "Address = 0x%x Value = 0x%x \n\r", + PS_LVL_SHFTR_EN, Xil_In32(PS_LVL_SHFTR_EN)); + + /* + * Enable AXI interface + */ + Xil_Out32(FPGA_RESET_REG, 0); + fsbl_printf(DEBUG_INFO,"AXI Interface enabled \n\r"); + fsbl_printf(DEBUG_INFO, "FPGA Reset Register " + "Address = 0x%x , Value = 0x%x \r\n", + FPGA_RESET_REG ,Xil_In32(FPGA_RESET_REG)); +#endif +#endif + } + + /* + * FSBL user hook call before handoff to the application + */ + Status = FsblHookBeforeHandoff(); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"FSBL_HANDOFF_HOOK_FAIL\r\n"); + OutputStatus(FSBL_HANDOFF_HOOK_FAIL); + FsblFallback(); + } + +#ifdef XPAR_XWDTPS_0_BASEADDR + XWdtPs_Stop(&Watchdog); +#endif + + /* + * Clear our mark in reboot status register + */ + ClearFSBLIn(); + + if(FsblStartAddr == 0) { + /* + * SLCR lock + */ + SlcrLock(); + + fsbl_printf(DEBUG_INFO,"No Execution Address JTAG handoff \r\n"); + FsblHandoffJtagExit(); + } else { + fsbl_printf(DEBUG_GENERAL,"SUCCESSFUL_HANDOFF\r\n"); + OutputStatus(SUCCESSFUL_HANDOFF); + FsblHandoffExit(FsblStartAddr); + } + + OutputStatus(ILLEGAL_RETURN); + + FsblFallback(); +} + +/******************************************************************************/ +/** +* +* This function outputs the status for the provided State in the boot process. +* +* @param State is where in the boot process the output is desired. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void OutputStatus(u32 State) +{ +#ifdef STDOUT_BASEADDRESS + u32 UartReg = 0; + + fsbl_printf(DEBUG_GENERAL,"FSBL Status = 0x%.4x\r\n", State); + /* + * The TX buffer needs to be flushed out + * If this is not done some of the prints will not appear on the + * serial output + */ + UartReg = Xil_In32(STDOUT_BASEADDRESS + XUARTPS_SR_OFFSET); + while ((UartReg & XUARTPS_SR_TXEMPTY) != XUARTPS_SR_TXEMPTY) { + UartReg = Xil_In32(STDOUT_BASEADDRESS + XUARTPS_SR_OFFSET); + } +#endif +} + +/******************************************************************************/ +/** +* +* This function handles the error and lockdown processing and outputs the status +* for the provided State in the boot process. +* +* This function is called upon exceptions. +* +* @param State - where in the boot process the error occured. +* +* @return None. +* +* @note This function does not return, the PS block is reset +* +****************************************************************************/ +void ErrorLockdown(u32 State) +{ + /* + * Store the error status + */ + OutputStatus(State); + + /* + * Fall back + */ + FsblFallback(); +} + +/******************************************************************************/ +/** +* +* This function copies a memory region to another memory region +* +* @param s1 is starting address for destination +* @param s2 is starting address for the source +* @param n is the number of bytes to copy +* +* @return Starting address for destination +* +****************************************************************************/ +void *(memcpy_rom)(void * s1, const void * s2, u32 n) +{ + char *dst = (char *)s1; + const char *src = (char *)s2; + + /* + * Loop and copy + */ + while (n-- != 0) + *dst++ = *src++; + return s1; +} +/******************************************************************************/ +/** +* +* This function copies a string to another, the source string must be null- +* terminated. +* +* @param Dest is starting address for the destination string +* @param Src is starting address for the source string +* +* @return Starting address for the destination string +* +****************************************************************************/ +char *strcpy_rom(char *Dest, const char *Src) +{ + unsigned i; + for (i=0; Src[i] != '\0'; ++i) + Dest[i] = Src[i]; + Dest[i] = '\0'; + return Dest; +} + + +/******************************************************************************/ +/** +* +* This function sets FSBL is running mask in reboot status register +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void MarkFSBLIn(void) +{ + Xil_Out32(REBOOT_STATUS_REG, + Xil_In32(REBOOT_STATUS_REG) | FSBL_IN_MASK); +} + + +/******************************************************************************/ +/** +* +* This function clears FSBL is running mask in reboot status register +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void ClearFSBLIn(void) +{ + Xil_Out32(REBOOT_STATUS_REG, + (Xil_In32(REBOOT_STATUS_REG)) & ~(FSBL_FAIL_MASK)); +} + +/******************************************************************************/ +/** +* +* This function Registers the Exception Handlers +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +static void RegisterHandlers(void) +{ + Xil_ExceptionInit(); + + /* + * Initialize the vector table. Register the stub Handler for each + * exception. + */ + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_UNDEFINED_INT, + (Xil_ExceptionHandler)Undef_Handler, + (void *) 0); + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_SWI_INT, + (Xil_ExceptionHandler)SVC_Handler, + (void *) 0); + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_PREFETCH_ABORT_INT, + (Xil_ExceptionHandler)PreFetch_Abort_Handler, + (void *) 0); + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_DATA_ABORT_INT, + (Xil_ExceptionHandler)Data_Abort_Handler, + (void *) 0); + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT, + (Xil_ExceptionHandler)IRQ_Handler,(void *) 0); + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_FIQ_INT, + (Xil_ExceptionHandler)FIQ_Handler,(void *) 0); + + Xil_ExceptionEnable(); + +} + +static void Undef_Handler (void) +{ + fsbl_printf(DEBUG_GENERAL,"UNDEFINED_HANDLER\r\n"); + ErrorLockdown (EXCEPTION_ID_UNDEFINED_INT); +} + +static void SVC_Handler (void) +{ + fsbl_printf(DEBUG_GENERAL,"SVC_HANDLER \r\n"); + ErrorLockdown (EXCEPTION_ID_SWI_INT); +} + +static void PreFetch_Abort_Handler (void) +{ + fsbl_printf(DEBUG_GENERAL,"PREFETCH_ABORT_HANDLER \r\n"); + ErrorLockdown (EXCEPTION_ID_PREFETCH_ABORT_INT); +} + +static void Data_Abort_Handler (void) +{ + fsbl_printf(DEBUG_GENERAL,"DATA_ABORT_HANDLER \r\n"); + ErrorLockdown (EXCEPTION_ID_DATA_ABORT_INT); +} + +static void IRQ_Handler (void) +{ + fsbl_printf(DEBUG_GENERAL,"IRQ_HANDLER \r\n"); + ErrorLockdown (EXCEPTION_ID_IRQ_INT); +} + +static void FIQ_Handler (void) +{ + fsbl_printf(DEBUG_GENERAL,"FIQ_HANDLER \r\n"); + ErrorLockdown (EXCEPTION_ID_FIQ_INT); +} + + +/******************************************************************************/ +/** +* +* This function Updates the Multi boot Register to enable golden image +* search for boot rom +* +* @param None +* +* @return +* return none +* +****************************************************************************/ +static void Update_MultiBootRegister(void) +{ + u32 MultiBootReg = 0; + + if (Silicon_Version != SILICON_VERSION_1) { + /* + * Read the mulitboot register + */ + MultiBootReg = XDcfg_ReadReg(DcfgInstPtr->Config.BaseAddr, + XDCFG_MULTIBOOT_ADDR_OFFSET); + + /* + * Incrementing multiboot register by one + */ + MultiBootReg++; + + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, + XDCFG_MULTIBOOT_ADDR_OFFSET, + MultiBootReg); + + fsbl_printf(DEBUG_INFO,"Updated MultiBootReg = 0x%08x\r\n", + MultiBootReg); + } +} + + +/****************************************************************************** +* +* This function reset the CPU and goes for Boot ROM fallback handling +* +* @param None +* +* @return None +* +* @note None +* +*******************************************************************************/ + +u32 GetResetReason(void) +{ + u32 Regval; + + /* We are using REBOOT_STATUS_REG, we have to use bits 23:16 */ + /* for storing the RESET_REASON register value*/ + Regval = ((Xil_In32(REBOOT_STATUS_REG) >> 16) & 0xFF); + + return Regval; +} + + +/****************************************************************************** +* +* This function Gets the ticks from the Global Timer +* +* @param Current time +* +* @return +* None +* +* @note None +* +*******************************************************************************/ +#ifdef FSBL_PERF +void FsblGetGlobalTime (XTime tCur) +{ + XTime_GetTime(&tCur); +} + + +/****************************************************************************** +* +* This function Measures the execution time +* +* @param Current time , End time +* +* @return +* None +* +* @note None +* +*******************************************************************************/ +void FsblMeasurePerfTime (XTime tCur, XTime tEnd) +{ + double tDiff = 0.0; + double tPerfSeconds; + XTime_GetTime(&tEnd); + tDiff = (double)tEnd - (double)tCur; + + /* + * Convert tPerf into Seconds + */ + tPerfSeconds = tDiff/COUNTS_PER_SECOND; + + /* + * Convert tPerf into Seconds + */ + tPerfSeconds = tDiff/COUNTS_PER_SECOND; + +#if defined(FSBL_DEBUG) || defined(FSBL_DEBUG_INFO) + printf("%f seconds \r\n",tPerfSeconds); +#endif + +} +#endif + +/****************************************************************************** +* +* This function initializes the Watchdog driver and starts the timer +* +* @param None +* +* @return +* - XST_SUCCESS if the Watchdog driver is initialized +* - XST_FAILURE if Watchdog driver initialization fails +* +* @note None +* +*******************************************************************************/ +#ifdef XPAR_XWDTPS_0_BASEADDR +int InitWatchDog(void) +{ + u32 Status = XST_SUCCESS; + XWdtPs_Config *ConfigPtr; /* Config structure of the WatchDog Timer */ + u32 CounterValue = 1; + + ConfigPtr = XWdtPs_LookupConfig(WDT_DEVICE_ID); + Status = XWdtPs_CfgInitialize(&Watchdog, + ConfigPtr, + ConfigPtr->BaseAddress); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO,"Watchdog Driver init Failed \n\r"); + return XST_FAILURE; + } + + /* + * Setting the divider value + */ + XWdtPs_SetControlValue(&Watchdog, + XWDTPS_CLK_PRESCALE, + XWDTPS_CCR_PSCALE_4096); + /* + * Convert time to Watchdog counter reset value + */ + CounterValue = ConvertTime_WdtCounter(WDT_EXPIRE_TIME); + + /* + * Set the Watchdog counter reset value + */ + XWdtPs_SetControlValue(&Watchdog, + XWDTPS_COUNTER_RESET, + CounterValue); + /* + * enable reset output, as we are only using this as a basic counter + */ + XWdtPs_EnableOutput(&Watchdog, XWDTPS_RESET_SIGNAL); + + /* + * Start the Watchdog timer + */ + XWdtPs_Start(&Watchdog); + + XWdtPs_RestartWdt(&Watchdog); + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* +* This function checks whether WDT reset has happened during FSBL run +* +* If WDT reset happened during FSBL run, then need to fallback +* +* @param None. +* +* @return +* None +* +* @note None +* +****************************************************************************/ +void CheckWDTReset(void) +{ + u32 ResetReason; + u32 RebootStatusRegister; + + RebootStatusRegister = Xil_In32(REBOOT_STATUS_REG); + + /* + * For 1.0 Silicon the reason for Reset is in the ResetReason Register + * Hence this register can be read to know the cause for previous reset + * that happened. + * Check if that reset is a Software WatchDog reset that happened + */ + if (Silicon_Version == SILICON_VERSION_1) { + ResetReason = Xil_In32(RESET_REASON_REG); + } else { + ResetReason = GetResetReason(); + } + /* + * If the FSBL_IN_MASK Has not been cleared, WDT happened + * before FSBL exits + */ + if ((ResetReason & RESET_REASON_SWDT) == RESET_REASON_SWDT ) { + if ((RebootStatusRegister & FSBL_FAIL_MASK) == FSBL_IN_MASK) { + /* + * Clear the SWDT Reset bit + */ + ResetReason &= ~RESET_REASON_SWDT; + if (Silicon_Version == SILICON_VERSION_1) { + /* + * for 1.0 Silicon we need to write + * 1 to the RESET REASON Clear register + */ + Xil_Out32(RESET_REASON_CLR, 1); + } else { + Xil_Out32(REBOOT_STATUS_REG, ResetReason); + } + + fsbl_printf(DEBUG_GENERAL,"WDT_RESET_OCCURED \n\r"); + } + } +} + + +/****************************************************************************** +* +* This function converts time into Watchdog counter value +* +* @param watchdog expire time in seconds +* +* @return +* Counter value for Watchdog +* +* @note None +* +*******************************************************************************/ +u32 ConvertTime_WdtCounter(u32 seconds) +{ + double time = 0.0; + double CounterValue; + u32 Crv = 0; + u32 Prescaler,PrescalerValue; + + Prescaler = XWdtPs_GetControlValue(&Watchdog, XWDTPS_CLK_PRESCALE); + + if (Prescaler == XWDTPS_CCR_PSCALE_0008) + PrescalerValue = 8; + if (Prescaler == XWDTPS_CCR_PSCALE_0064) + PrescalerValue = 64; + if (Prescaler == XWDTPS_CCR_PSCALE_4096) + PrescalerValue = 4096; + + time = (double)(PrescalerValue) / (double)XPAR_PS7_WDT_0_WDT_CLK_FREQ_HZ; + + CounterValue = seconds / time; + + Crv = (u32)CounterValue; + Crv >>= WDT_CRV_SHIFT; + + return Crv; +} + +#endif + + +/****************************************************************************** +* +* This function Gets the Silicon Version stores in global variable +* +* @param None +* +* @return None +* +* @note None +* +*******************************************************************************/ +void GetSiliconVersion(void) +{ + /* + * Get the silicon version + */ + Silicon_Version = XDcfg_GetPsVersion(DcfgInstPtr); + if(Silicon_Version == SILICON_VERSION_3_1) { + fsbl_printf(DEBUG_GENERAL,"Silicon Version 3.1\r\n"); + } else { + fsbl_printf(DEBUG_GENERAL,"Silicon Version %d.0\r\n", + Silicon_Version + 1); + } +} + + +/****************************************************************************** +* +* This function HeaderChecksum will calculates the header checksum and +* compares with checksum read from flash +* +* @param FlashOffsetAddress Flash offset address +* +* @return +* - XST_SUCCESS if ID matches +* - XST_FAILURE if ID mismatches +* +* @note None +* +*******************************************************************************/ +u32 HeaderChecksum(u32 FlashOffsetAddress){ + u32 Checksum = 0; + u32 Count; + u32 TempValue = 0; + + for (Count = 0; Count < IMAGE_HEADER_CHECKSUM_COUNT; Count++) { + /* + * Read the word from the header + */ + MoveImage(FlashOffsetAddress + IMAGE_WIDTH_CHECK_OFFSET + (Count*4), (u32)&TempValue, 4); + + /* + * Update checksum + */ + Checksum += TempValue; + } + + /* + * Invert checksum, last bit of error checking + */ + Checksum ^= 0xFFFFFFFF; + MoveImage(FlashOffsetAddress + IMAGE_CHECKSUM_OFFSET, (u32)&TempValue, 4); + + /* + * Validate the checksum + */ + if (TempValue != Checksum){ + fsbl_printf(DEBUG_INFO, "Checksum = %8.8x\r\n", Checksum); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/****************************************************************************** +* +* This function ImageCheckID will do check for XLNX pattern +* +* @param FlashOffsetAddress Flash offset address +* +* @return +* - XST_SUCCESS if ID matches +* - XST_FAILURE if ID mismatches +* +* @note None +* +*******************************************************************************/ +u32 ImageCheckID(u32 FlashOffsetAddress){ + u32 ID; + + /* + * Read in the header info + */ + MoveImage(FlashOffsetAddress + IMAGE_IDENT_OFFSET, (u32)&ID, 4); + + /* + * Check the ID, make sure image is XLNX format + */ + if (ID != IMAGE_IDENT){ + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/****************************************************************************** +* +* This function NextValidImageCheck search for valid boot image +* +* @param None +* +* @return +* - XST_SUCCESS if valid image found +* - XST_FAILURE if no image found +* +* @note None +* +*******************************************************************************/ +u32 NextValidImageCheck(void) +{ + u32 ImageBaseAddr; + u32 MultiBootReg; + u32 BootDevMaxSize=0; + + fsbl_printf(DEBUG_GENERAL, "Searching For Next Valid Image"); + + /* + * Setting variable with maximum flash size based on boot mode + */ +#ifdef XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR + if (FlashReadBaseAddress == XPS_QSPI_LINEAR_BASEADDR) { + BootDevMaxSize = QspiFlashSize; + } +#endif + + if (FlashReadBaseAddress == XPS_NAND_BASEADDR) { + BootDevMaxSize = NAND_FLASH_SIZE; + } + + if (FlashReadBaseAddress == XPS_NOR_BASEADDR) { + BootDevMaxSize = NOR_FLASH_SIZE; + } + + /* + * Read the multiboot register + */ + MultiBootReg = XDcfg_ReadReg(DcfgInstPtr->Config.BaseAddr, + XDCFG_MULTIBOOT_ADDR_OFFSET); + + /* + * Compute the image start address + */ + ImageBaseAddr = (MultiBootReg & PCAP_MBOOT_REG_REBOOT_OFFSET_MASK) + * GOLDEN_IMAGE_OFFSET; + + /* + * Valid image search continue till end of the flash + * With increment 32KB in each iteration + */ + while (ImageBaseAddr < BootDevMaxSize) { + + fsbl_printf(DEBUG_INFO,"."); + + /* + * Valid image search using XLNX pattern at fixed offset + * and header checksum + */ + if ((ImageCheckID(ImageBaseAddr) == XST_SUCCESS) && + (HeaderChecksum(ImageBaseAddr) == XST_SUCCESS)) { + + fsbl_printf(DEBUG_GENERAL, "\r\nImage found, offset: 0x%.8x\r\n", + ImageBaseAddr); + /* + * Update multiboot register + */ + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, + XDCFG_MULTIBOOT_ADDR_OFFSET, + MultiBootReg); + + return XST_SUCCESS; + } + + /* + * Increment mulitboot count + */ + MultiBootReg++; + + /* + * Compute the image start address + */ + ImageBaseAddr = (MultiBootReg & PCAP_MBOOT_REG_REBOOT_OFFSET_MASK) + * GOLDEN_IMAGE_OFFSET; + } + + return XST_FAILURE; +} + +/******************************************************************************/ +/** +* +* This function Checks for the ddr initialization completion +* +* @param None. +* +* @return +* - XST_SUCCESS if the initialization is successful +* - XST_FAILURE if the initialization is NOT successful +* +* @note None. +* +****************************************************************************/ +u32 DDRInitCheck(void) +{ + u32 ReadVal; + + /* + * Write and Read from the DDR location for sanity checks + */ + Xil_Out32(DDR_START_ADDR, DDR_TEST_PATTERN); + ReadVal = Xil_In32(DDR_START_ADDR); + if (ReadVal != DDR_TEST_PATTERN) { + return XST_FAILURE; + } + + /* + * Write and Read from the DDR location for sanity checks + */ + Xil_Out32(DDR_START_ADDR + DDR_TEST_OFFSET, DDR_TEST_PATTERN); + ReadVal = Xil_In32(DDR_START_ADDR + DDR_TEST_OFFSET); + if (ReadVal != DDR_TEST_PATTERN) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} diff --git a/quad/zybo_fsbl/src/md5.c b/quad/zybo_fsbl/src/md5.c new file mode 100644 index 000000000..1aa081900 --- /dev/null +++ b/quad/zybo_fsbl/src/md5.c @@ -0,0 +1,484 @@ +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ +/*****************************************************************************/ +/** +* +* @file md5.c +* +* Contains code to calculate checksum using md5 algorithm +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 5.00a sgd 05/17/13 Initial release +* +* +* </pre> +* +* @note +* +******************************************************************************/ +/****************************** Include Files *********************************/ + +#include "md5.h" + +/******************************************************************************/ +/** +* +* This function sets the memory +* +* @param dest +* +* @param ch +* +* @param count +* +* @return None +* +* @note None +* +****************************************************************************/ +inline void * _memset( void *dest, int ch, u32 count ) +{ + register char *dst8 = (char*)dest; + + while( count-- ) + *dst8++ = ch; + + return dest; +} + +/******************************************************************************/ +/** +* +* This function copy the memory +* +* @param dest +* +* @param ch +* +* @param count +* +* @return None +* +* @note None +* +****************************************************************************/ +inline void * _memcpy( void *dest, const void *src, + u32 count, boolean doByteSwap ) +{ + register char * dst8 = (char*)dest; + register char * src8 = (char*)src; + + if( doByteSwap == FALSE ) { + while( count-- ) + *dst8++ = *src8++; + } else { + count /= sizeof( u32 ); + + while( count-- ) { + dst8[ 0 ] = src8[ 3 ]; + dst8[ 1 ] = src8[ 2 ]; + dst8[ 2 ] = src8[ 1 ]; + dst8[ 3 ] = src8[ 0 ]; + + dst8 += 4; + src8 += 4; + } + } + + return dest; +} + +/******************************************************************************/ +/** +* +* This function is the core of the MD5 algorithm, +* this alters an existing MD5 hash to +* reflect the addition of 16 longwords of new data. MD5Update blocks +* the data and converts bytes into longwords for this routine. +* +* Use binary integer part of the sine of integers (Radians) as constants. +* Calculated as: +* +* for( i = 0; i < 63; i++ ) +* k[ i ] := floor( abs( sin( i + 1 ) ) × pow( 2, 32 ) ) +* +* Following number is the per-round shift amount. +* +* @param dest +* +* @param ch +* +* @param count +* +* @return None +* +* @note None +* +****************************************************************************/ +void MD5Transform( u32 *buffer, u32 *intermediate ) +{ + register u32 a, b, c, d; + + a = buffer[ 0 ]; + b = buffer[ 1 ]; + c = buffer[ 2 ]; + d = buffer[ 3 ]; + + MD5_STEP( F1, a, b, c, d, intermediate[ 0 ] + 0xd76aa478, 7 ); + MD5_STEP( F1, d, a, b, c, intermediate[ 1 ] + 0xe8c7b756, 12 ); + MD5_STEP( F1, c, d, a, b, intermediate[ 2 ] + 0x242070db, 17 ); + MD5_STEP( F1, b, c, d, a, intermediate[ 3 ] + 0xc1bdceee, 22 ); + MD5_STEP( F1, a, b, c, d, intermediate[ 4 ] + 0xf57c0faf, 7 ); + MD5_STEP( F1, d, a, b, c, intermediate[ 5 ] + 0x4787c62a, 12 ); + MD5_STEP( F1, c, d, a, b, intermediate[ 6 ] + 0xa8304613, 17 ); + MD5_STEP( F1, b, c, d, a, intermediate[ 7 ] + 0xfd469501, 22 ); + MD5_STEP( F1, a, b, c, d, intermediate[ 8 ] + 0x698098d8, 7 ); + MD5_STEP( F1, d, a, b, c, intermediate[ 9 ] + 0x8b44f7af, 12 ); + MD5_STEP( F1, c, d, a, b, intermediate[ 10 ] + 0xffff5bb1, 17 ); + MD5_STEP( F1, b, c, d, a, intermediate[ 11 ] + 0x895cd7be, 22 ); + MD5_STEP( F1, a, b, c, d, intermediate[ 12 ] + 0x6b901122, 7 ); + MD5_STEP( F1, d, a, b, c, intermediate[ 13 ] + 0xfd987193, 12 ); + MD5_STEP( F1, c, d, a, b, intermediate[ 14 ] + 0xa679438e, 17 ); + MD5_STEP( F1, b, c, d, a, intermediate[ 15 ] + 0x49b40821, 22 ); + + MD5_STEP( F2, a, b, c, d, intermediate[ 1 ] + 0xf61e2562, 5 ); + MD5_STEP( F2, d, a, b, c, intermediate[ 6 ] + 0xc040b340, 9 ); + MD5_STEP( F2, c, d, a, b, intermediate[ 11 ] + 0x265e5a51, 14 ); + MD5_STEP( F2, b, c, d, a, intermediate[ 0 ] + 0xe9b6c7aa, 20 ); + MD5_STEP( F2, a, b, c, d, intermediate[ 5 ] + 0xd62f105d, 5 ); + MD5_STEP( F2, d, a, b, c, intermediate[ 10 ] + 0x02441453, 9 ); + MD5_STEP( F2, c, d, a, b, intermediate[ 15 ] + 0xd8a1e681, 14 ); + MD5_STEP( F2, b, c, d, a, intermediate[ 4 ] + 0xe7d3fbc8, 20 ); + MD5_STEP( F2, a, b, c, d, intermediate[ 9 ] + 0x21e1cde6, 5 ); + MD5_STEP( F2, d, a, b, c, intermediate[ 14 ] + 0xc33707d6, 9 ); + MD5_STEP( F2, c, d, a, b, intermediate[ 3 ] + 0xf4d50d87, 14 ); + MD5_STEP( F2, b, c, d, a, intermediate[ 8 ] + 0x455a14ed, 20 ); + MD5_STEP( F2, a, b, c, d, intermediate[ 13 ] + 0xa9e3e905, 5 ); + MD5_STEP( F2, d, a, b, c, intermediate[ 2 ] + 0xfcefa3f8, 9 ); + MD5_STEP( F2, c, d, a, b, intermediate[ 7 ] + 0x676f02d9, 14 ); + MD5_STEP( F2, b, c, d, a, intermediate[ 12 ] + 0x8d2a4c8a, 20 ); + + MD5_STEP( F3, a, b, c, d, intermediate[ 5 ] + 0xfffa3942, 4 ); + MD5_STEP( F3, d, a, b, c, intermediate[ 8 ] + 0x8771f681, 11 ); + MD5_STEP( F3, c, d, a, b, intermediate[ 11 ] + 0x6d9d6122, 16 ); + MD5_STEP( F3, b, c, d, a, intermediate[ 14 ] + 0xfde5380c, 23 ); + MD5_STEP( F3, a, b, c, d, intermediate[ 1 ] + 0xa4beea44, 4 ); + MD5_STEP( F3, d, a, b, c, intermediate[ 4 ] + 0x4bdecfa9, 11 ); + MD5_STEP( F3, c, d, a, b, intermediate[ 7 ] + 0xf6bb4b60, 16 ); + MD5_STEP( F3, b, c, d, a, intermediate[ 10 ] + 0xbebfbc70, 23 ); + MD5_STEP( F3, a, b, c, d, intermediate[ 13 ] + 0x289b7ec6, 4 ); + MD5_STEP( F3, d, a, b, c, intermediate[ 0 ] + 0xeaa127fa, 11 ); + MD5_STEP( F3, c, d, a, b, intermediate[ 3 ] + 0xd4ef3085, 16 ); + MD5_STEP( F3, b, c, d, a, intermediate[ 6 ] + 0x04881d05, 23 ); + MD5_STEP( F3, a, b, c, d, intermediate[ 9 ] + 0xd9d4d039, 4 ); + MD5_STEP( F3, d, a, b, c, intermediate[ 12 ] + 0xe6db99e5, 11 ); + MD5_STEP( F3, c, d, a, b, intermediate[ 15 ] + 0x1fa27cf8, 16 ); + MD5_STEP( F3, b, c, d, a, intermediate[ 2 ] + 0xc4ac5665, 23 ); + + MD5_STEP( F4, a, b, c, d, intermediate[ 0 ] + 0xf4292244, 6 ); + MD5_STEP( F4, d, a, b, c, intermediate[ 7 ] + 0x432aff97, 10 ); + MD5_STEP( F4, c, d, a, b, intermediate[ 14 ] + 0xab9423a7, 15 ); + MD5_STEP( F4, b, c, d, a, intermediate[ 5 ] + 0xfc93a039, 21 ); + MD5_STEP( F4, a, b, c, d, intermediate[ 12 ] + 0x655b59c3, 6 ); + MD5_STEP( F4, d, a, b, c, intermediate[ 3 ] + 0x8f0ccc92, 10 ); + MD5_STEP( F4, c, d, a, b, intermediate[ 10 ] + 0xffeff47d, 15 ); + MD5_STEP( F4, b, c, d, a, intermediate[ 1 ] + 0x85845dd1, 21 ); + MD5_STEP( F4, a, b, c, d, intermediate[ 8 ] + 0x6fa87e4f, 6 ); + MD5_STEP( F4, d, a, b, c, intermediate[ 15 ] + 0xfe2ce6e0, 10 ); + MD5_STEP( F4, c, d, a, b, intermediate[ 6 ] + 0xa3014314, 15 ); + MD5_STEP( F4, b, c, d, a, intermediate[ 13 ] + 0x4e0811a1, 21 ); + MD5_STEP( F4, a, b, c, d, intermediate[ 4 ] + 0xf7537e82, 6 ); + MD5_STEP( F4, d, a, b, c, intermediate[ 11 ] + 0xbd3af235, 10 ); + MD5_STEP( F4, c, d, a, b, intermediate[ 2 ] + 0x2ad7d2bb, 15 ); + MD5_STEP( F4, b, c, d, a, intermediate[ 9 ] + 0xeb86d391, 21 ); + + buffer[ 0 ] += a; + buffer[ 1 ] += b; + buffer[ 2 ] += c; + buffer[ 3 ] += d; + +} + +/******************************************************************************/ +/** +* +* This function Start MD5 accumulation +* Set bit count to 0 and buffer to mysterious initialization constants +* +* @param +* +* @return None +* +* @note None +* +****************************************************************************/ +inline void MD5Init( MD5Context *context ) +{ + + context->buffer[ 0 ] = 0x67452301; + context->buffer[ 1 ] = 0xefcdab89; + context->buffer[ 2 ] = 0x98badcfe; + context->buffer[ 3 ] = 0x10325476; + + context->bits[ 0 ] = 0; + context->bits[ 1 ] = 0; + +} + + +/******************************************************************************/ +/** +* +* This function updates context to reflect the concatenation of another +* buffer full of bytes +* +* @param +* +* @param +* +* @param +* +* @param +* +* @return None +* +* @note None +* +****************************************************************************/ +inline void MD5Update( MD5Context *context, u8 *buffer, + u32 len, boolean doByteSwap ) +{ + register u32 temp; + register u8 * p; + + /* + * Update bitcount + */ + + temp = context->bits[ 0 ]; + + if( ( context->bits[ 0 ] = temp + ( (u32)len << 3 ) ) < temp ) { + /* + * Carry from low to high + */ + context->bits[ 1 ]++; + } + + context->bits[ 1 ] += len >> 29; + + /* + * Bytes already in shsInfo->data + */ + + temp = ( temp >> 3 ) & 0x3f; + + /* + * Handle any leading odd-sized chunks + */ + + if( temp ) { + p = (u8 *)context->intermediate + temp; + + temp = MD5_SIGNATURE_BYTE_SIZE - temp; + + if( len < temp ) { + _memcpy( p, buffer, len, doByteSwap ); + return; + } + + _memcpy( p, buffer, temp, doByteSwap ); + + MD5Transform( context->buffer, (u32 *)context->intermediate ); + + buffer += temp; + len -= temp; + + } + + /* + * Process data in 64-byte, 512 bit, chunks + */ + + while( len >= MD5_SIGNATURE_BYTE_SIZE ) { + _memcpy( context->intermediate, buffer, MD5_SIGNATURE_BYTE_SIZE, + doByteSwap ); + + MD5Transform( context->buffer, (u32 *)context->intermediate ); + + buffer += MD5_SIGNATURE_BYTE_SIZE; + len -= MD5_SIGNATURE_BYTE_SIZE; + + } + + /* + * Handle any remaining bytes of data + */ + _memcpy( context->intermediate, buffer, len, doByteSwap ); + +} + +/******************************************************************************/ +/** +* +* This function final wrap-up - pad to 64-byte boundary with the bit pattern +* 1 0* (64-bit count of bits processed, MSB-first +* +* @param +* +* @param +* +* @param +* +* @param +* +* @return None +* +* @note None +* +****************************************************************************/ +inline void MD5Final( MD5Context *context, u8 *digest, + boolean doByteSwap ) +{ + u32 count; + u8 * p; + + /* + * Compute number of bytes mod 64 + */ + count = ( context->bits[ 0 ] >> 3 ) & 0x3F; + + /* + * Set the first char of padding to 0x80. This is safe since there is + * always at least one byte free + */ + p = context->intermediate + count; + *p++ = 0x80; + + /* + * Bytes of padding needed to make 64 bytes + */ + count = MD5_SIGNATURE_BYTE_SIZE - 1 - count; + + /* + * Pad out to 56 mod 64 + */ + if( count < 8 ) { + /* + * Two lots of padding: Pad the first block to 64 bytes + */ + _memset( p, 0, count ); + + MD5Transform( context->buffer, (u32 *)context->intermediate ); + + /* + * Now fill the next block with 56 bytes + */ + _memset( context->intermediate, 0, 56 ); + } else { + /* + * Pad block to 56 bytes + */ + _memset( p, 0, count - 8 ); + } + + /* + * Append length in bits and transform + */ + ( (u32 *)context->intermediate )[ 14 ] = context->bits[ 0 ]; + ( (u32 *)context->intermediate )[ 15 ] = context->bits[ 1 ]; + + MD5Transform( context->buffer, (u32 *)context->intermediate ); + + /* + * Now return the digest + */ + _memcpy( digest, context->buffer, 16, doByteSwap ); +} + +/******************************************************************************/ +/** +* +* This function calculate and store in 'digest' the MD5 digest of 'len' bytes at +* 'input'. 'digest' must have enough space to hold 16 bytes +* +* @param +* +* @param +* +* @param +* +* @param +* +* @return None +* +* @note None +* +****************************************************************************/ +void md5( u8 *input, u32 len, u8 *digest, boolean doByteSwap ) +{ + MD5Context context; + + MD5Init( &context ); + + MD5Update( &context, input, len, doByteSwap ); + + MD5Final( &context, digest, doByteSwap ); +} diff --git a/quad/zybo_fsbl/src/md5.h b/quad/zybo_fsbl/src/md5.h new file mode 100644 index 000000000..a00c17b1a --- /dev/null +++ b/quad/zybo_fsbl/src/md5.h @@ -0,0 +1,129 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file md5.h +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 5.00a sgd 05/17/13 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef ___MD5_H___ +#define ___MD5_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + +#define MD5_SIGNATURE_BYTE_SIZE 64 + +/**************************** Type Definitions *******************************/ + +typedef u8 boolean; +typedef u8 signature[ MD5_SIGNATURE_BYTE_SIZE ]; + +struct MD5Context + { + u32 buffer[ 4 ]; + u32 bits[ 2 ]; + signature intermediate; + }; +typedef struct MD5Context MD5Context; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/* + * The four core functions - F1 is optimized somewhat + */ +#define F1( x, y, z ) ( z ^ ( x & ( y ^ z ) ) ) +#define F2( x, y, z ) F1( z, x, y ) +#define F3( x, y, z ) ( x ^ y ^ z ) +#define F4( x, y, z ) ( y ^ ( x | ~z ) ) + + +/* + * This is the central step in the MD5 algorithm + */ +#define MD5_STEP( f, w, x, y, z, data, s ) \ + ( w += f( x, y, z ) + data, w = w << s | w >> ( 32 - s ), w += x ) + + +/************************** Function Prototypes ******************************/ + +void * _memset( void *dest, int ch, u32 count ); + +void * _memcpy( void *dest, const void *src, u32 count, boolean doByteSwap ); + +void MD5Transform( u32 *buffer, u32 *intermediate ); + +void MD5Init( MD5Context *context ); + +void MD5Update( MD5Context *context, u8 *buffer, u32 len, boolean doByteSwap ); + +void MD5Final( MD5Context *context, u8 *digest, boolean doByteSwap ); + +void md5( u8 *input, u32 len, u8 *digest, boolean doByteSwap ); + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + + +#endif /* ___MD5_H___ */ diff --git a/quad/zybo_fsbl/src/mmc.c b/quad/zybo_fsbl/src/mmc.c new file mode 100644 index 000000000..8543b10c4 --- /dev/null +++ b/quad/zybo_fsbl/src/mmc.c @@ -0,0 +1,1181 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file mmc.c +* +* SD interface to FatFS +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a bh 05/28/11 Initial release +* 1.00a nm 03/20/12 Changed the SD base clock divider from + 0x40 to 0x04. +* 3.00a mb 08/16/12 Added the flag XPAR_PS7_SD_0_S_AXI_BASEADDR +* 3.00a sgd 08/16/12 SD Boot time improvement +* Added SD high speed and 4bit support check +* 4.00a sgd 02/28/13 Code cleanup +* 5.00a sgd 05/17/13 Added MMC support +* To support MMC, added two separate functions +* sd_init for SD initialization +* mmc_init for MMC initialization +* +* </pre> +* +* @note +* +******************************************************************************/ +#include "xparameters.h" +#include "fsbl.h" +#ifdef XPAR_PS7_SD_0_S_AXI_BASEADDR + +#include "diskio.h" /* Common include file for FatFs and disk I/O layer */ +#include "ff.h" +#include "xil_types.h" +#include "sd_hardware.h" +#include "sleep.h" +#ifndef PEEP_CODE +#include "ps7_init.h" +#endif + +/* + * Map logical volume to physical drive + partition. + * Logical X [0-3] to Physical 0, partition X + */ +#if _MULTI_PARTITION +const PARTITION VolToPart[] = { + {0, 0}, {0, 1}, {0, 2}, {0, 3} }; +#endif + +static DSTATUS Stat; /* Disk status */ +static BYTE CardType; /* b0:MMC, b1:SDv1, b2:SDv2, b3:Block addressing */ + +/* Block Count variable */ +static u16 blkcnt; +/* Block Size variable */ +static u16 blksize; + +/* ADMA2 descriptor table */ +static u32 desc_table[4]; + +#define sd_out32(OutAddress, Value) Xil_Out32((XPAR_PS7_SD_0_S_AXI_BASEADDR) + (OutAddress), (Value)) +#define sd_out16(OutAddress, Value) Xil_Out16((XPAR_PS7_SD_0_S_AXI_BASEADDR) + (OutAddress), (Value)) +#define sd_out8(OutAddress, Value) Xil_Out8((XPAR_PS7_SD_0_S_AXI_BASEADDR) + (OutAddress), (Value)) + +#define sd_in32(InAddress) Xil_In32((XPAR_PS7_SD_0_S_AXI_BASEADDR) + (InAddress)) +#define sd_in16(InAddress) Xil_In16((XPAR_PS7_SD_0_S_AXI_BASEADDR) + (InAddress)) +#define sd_in8(InAddress) Xil_In8((XPAR_PS7_SD_0_S_AXI_BASEADDR) + (InAddress)) + +#ifdef MMC_SUPPORT + +#define MMC_CLK_52M 52000000 +#define MMC_CLK_26M 26000000 +#define MMC_HS_SUPPORT 0x1 +#define MMC_4BIT_SUPPORT 0x1 +#define EXT_CSD_BUS_WIDTH 183 +#define EXT_CSD_HS_TIMING 185 +#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 +#define MMC_OCR_REG_VALUE ((0x1 << 30) | (0x1FF << 15)) + +static DRESULT mmc_init(void); +#else + +static DRESULT sd_init(void); + +#endif +/******************************************************************************/ +/** +* +* This function Initializes the SD controller +* +* @param None +* +* @return None +* +* @note None +* +****************************************************************************/ +static void init_port(void) +{ + unsigned clk; + unsigned clk_div; + + Stat = STA_NOINIT; + + /* + * Power off the card + */ + sd_out8(SD_PWR_CTRL_R, 0); + + /* + * Disable interrupts + */ + sd_out32(SD_SIG_ENA_R, 0); + + /* + * Perform soft reset + */ + sd_out8(SD_SOFT_RST_R, SD_RST_ALL); + + /* + * Wait for reset to complete + */ + while (sd_in8(SD_SOFT_RST_R)) { + ; + } + + /* + * Power on the card + */ + sd_out8(SD_PWR_CTRL_R, SD_POWER_33|SD_POWER_ON); + + /* + * Enable ADMA2 + */ + sd_out8(SD_HOST_CTRL_R, SD_HOST_ADMA2); + + clk_div = (SDIO_FREQ/SD_CLK_400K); + /* + * Enable Internal clock and wait for it to stabilize + */ + clk = (clk_div << SD_DIV_SHIFT) | SD_CLK_INT_EN; + sd_out16(SD_CLK_CTL_R, clk); + do { + clk = sd_in16(SD_CLK_CTL_R); + } while (!(clk & SD_CLK_INT_STABLE)); + + /* + * Enable SD clock + */ + clk |= SD_CLK_SD_EN; + sd_out16(SD_CLK_CTL_R, clk); + + sd_out32(SD_SIG_ENA_R, 0xFFFFFFFF); + sd_out32(SD_INT_ENA_R, 0xFFFFFFFF); +} + + +/******************************************************************************/ +/** +* +* Module Private Functions +* +****************************************************************************/ +/* + * MMC/SD commands + */ +#define CMD0 (0) /* GO_IDLE_STATE */ +#define CMD1 (1) /* SEND_OP_COND */ +#define ACMD41 (0x80+41) /* SEND_OP_COND (SDC) */ +#define CMD2 (2) /* SEND_CID */ +#define CMD3 (3) /* RELATIVE_ADDR */ +#define CMD4 (4) /* SET_DSR */ +#define CMD5 (5) /* SLEEP_WAKE (SDC) */ +#define CMD6 (6) /* SWITCH_FUNC */ +#define ACMD6 (0x80+6) /* SET_BUS_WIDTH (SDC) */ +#define CMD7 (7) /* SELECT */ +#define CMD8 (8) /* SEND_IF_COND/SEND_EXT_CSD */ +#define CMD9 (9) /* SEND_CSD */ +#define CMD10 (10) /* SEND_CID */ +#define CMD12 (12) /* STOP_TRANSMISSION */ +#define ACMD13 (0x80+13) /* SD_STATUS (SDC) */ +#define CMD16 (16) /* SET_BLOCKLEN */ +#define CMD17 (17) /* READ_SINGLE_BLOCK */ +#define CMD18 (18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (23) /* SET_BLOCK_COUNT */ +#define ACMD23 (0x80+23) /* SET_WR_BLK_ERASE_COUNT (SDC) */ +#define CMD24 (24) /* WRITE_BLOCK */ +#define CMD25 (25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD41 (41) /* SEND_OP_COND (ACMD) */ +#define ACMD42 (0x80+42) /* SET_CLR_CARD_DETECT (ACMD) */ +#define ACMD51 (0x80+51) /* SEND_SCR */ +#define CMD52 (52) /* */ +#define CMD55 (55) /* APP_CMD */ +#define CMD58 (58) /* READ_OCR */ + +/* + * Card type flags (CardType) + */ +#define CT_MMC 0x01 /* MMC ver 3 */ +#define CT_SD1 0x02 /* SD ver 1 */ +#define CT_SD2 0x04 /* SD ver 2 */ +#define CT_SDC (CT_SD1|CT_SD2) /* SD */ +#define CT_BLOCK 0x08 /* Block addressing */ + + +/******************************************************************************/ +/** +* +* This function Determine the value of the controller transfer register +* for the provided +* +* @param cmd command index +* +* @return cmd value +* +* @note None +* +****************************************************************************/ +static int make_command (unsigned cmd) +{ + unsigned retval; + + retval = cmd << 8; + +#define RSP_NONE SD_CMD_RESP_NONE +#define RSP_R1 (SD_CMD_INDEX|SD_CMD_RESP_48 |SD_CMD_CRC) +#define RSP_R1b (SD_CMD_INDEX|SD_CMD_RESP_48_BUSY|SD_CMD_CRC) +#define RSP_R2 (SD_CMD_CRC |SD_CMD_RESP_136) +#define RSP_R3 (SD_CMD_RESP_48) +#define RSP_R6 (SD_CMD_INDEX|SD_CMD_RESP_48_BUSY|SD_CMD_CRC) + + switch(cmd) { + case CMD0: + retval |= (SD_CMD_RESP_NONE); + break; + case CMD1: + retval |= RSP_R3; + break; + case CMD2: + retval |= RSP_R2; + break; + case CMD3: + retval |= RSP_R6; + break; + case CMD4: + retval |= (SD_CMD_RESP_NONE); + break; + case CMD5: + retval |= RSP_R1b; + break; +#ifdef MMC_SUPPORT + case CMD6: + retval |= RSP_R1b; + break; +#else + case CMD6: + retval |= RSP_R1 | SD_CMD_DATA; + break; +#endif + case ACMD6: + retval |= RSP_R1; + break; + case CMD7: + retval |= RSP_R1; + break; +#ifdef MMC_SUPPORT + case CMD8: + retval |= RSP_R1 | SD_CMD_DATA; + break; +#else + case CMD8: + retval |= RSP_R1; + break; +#endif + case CMD9: + retval |= RSP_R2; + break; + case CMD10: + case CMD12: + case ACMD13: + case CMD16: + retval |= RSP_R1; + break; + case CMD17: + case CMD18: + retval |= RSP_R1|SD_CMD_DATA; + break; + case CMD23: + case ACMD23: + case CMD24: + case CMD25: + case CMD41: + retval |= RSP_R3; + break; + case ACMD42: + retval |= RSP_R1; + break; + case ACMD51: + retval |= RSP_R1|SD_CMD_DATA; + break; + case CMD52: + case CMD55: + retval |= RSP_R1; + break; + case CMD58: + break; + } + + return retval; +} + +/******************************************************************************/ +/** +* +* This function Determine the value of the controller transfer register +* for the provided +* +* @param cmd Command byte +* +* @param arg Argument +* +* @param response Response from device +* +* @return 1 on success +* 0 on timeout +* +* @note None +* +****************************************************************************/ +static BYTE send_cmd (BYTE cmd, DWORD arg, DWORD *response) +{ + u32 status; + u16 cmdreg; + + if (response) { + *response = 0; + } + + /* + * Wait until the device is willing to accept commands + */ + do { + status = sd_in32(SD_PRES_STATE_R); + } while (status & (SD_CMD_INHIBIT|SD_DATA_INHIBIT)); + + /* + * Clear all pending interrupt status + */ + sd_out32(SD_INT_STAT_R, 0xFFFFFFFF); + + /* + * 512 byte block size. + * This is only relevant for data commands. + */ + sd_out16(SD_BLOCK_SZ_R, blksize); + sd_out16(SD_BLOCK_CNT_R, blkcnt); + + /* + * Setting timeout to max value + */ + sd_out8(SD_TIMEOUT_CTL_R, 0xE); + + sd_out32(SD_ARG_R, arg); + + if (cmd!=CMD18) { + sd_out16(SD_TRNS_MODE_R, SD_TRNS_READ|SD_TRNS_DMA); + } else { + /* + * Set the transfer mode to read, DMA, multiple block + * (applicable only to data commands) + * This is all that this software supports. + */ + sd_out16(SD_TRNS_MODE_R, SD_TRNS_READ|SD_TRNS_MULTI| + SD_TRNS_ACMD12|SD_TRNS_BLK_CNT_EN|SD_TRNS_DMA); + } + + /* + * Initiate the command + */ + cmdreg = make_command(cmd); + sd_out16(SD_CMD_R, cmdreg); + + /* + * Poll until operation complete + */ + while (1) { + status = sd_in32(SD_INT_STAT_R); + if (status & SD_INT_ERROR) { + fsbl_printf(DEBUG_GENERAL,"send_cmd: Error: (0x%08x) cmd: %d arg: 0x%x\n", + status, cmd, arg); + sd_out8(SD_SOFT_RST_R, SD_RST_CMD|SD_RST_DATA); + + return 0; + } + /* + * Check for Command complete + */ + if (status & SD_INT_CMD_CMPL) { + sd_out32(SD_INT_STAT_R, SD_INT_CMD_CMPL); + break; + } + } + + status = sd_in32(SD_RSP_R); + if (response) { + *response = status; + } + + return 1; +} + + +/******************************************************************************/ +/** +* +* This function Setup ADMA2 for data transfer +* +* @param buff_ptr +* +* @return None +* +* @note None +* +****************************************************************************/ +void setup_adma2_trans(BYTE *buff_ptr) +{ + /* + * Set descriptor table + */ + desc_table[0] = ((blkcnt*blksize) << DESC_ATBR_LEN_SHIFT)| + DESC_ATBR_ACT_TRAN|DESC_ATBR_END|DESC_ATBR_VALID; + desc_table[1] = (u32)buff_ptr; + + /* + * Set ADMA system address register + */ + sd_out32(SD_ADMA_ADDR_R, (u32)&desc_table[0]); +} + + +/******************************************************************************/ +/** +* +* This function is wait for DMA transfer complete +* +* @param None +* +* @return 0 for failure +* 1 for success +* @note None +* +****************************************************************************/ +static BYTE dma_trans_cmpl(void) +{ + u32 status; + + /* + * Poll until operation complete + */ + while (1) { + status = sd_in32(SD_INT_STAT_R); + if (status & SD_INT_ERROR) { + fsbl_printf(DEBUG_GENERAL,"dma_trans_cmpl: Error: (0x%08x)\r\n", + status); + return 0; + } + + /* + * Check for Transfer complete + */ + if (status & SD_INT_TRNS_CMPL) { + sd_out32(SD_INT_STAT_R, SD_INT_TRNS_CMPL); + break; + } + } + return 1; +} + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Drive number (0) */ +) +{ + DSTATUS s = Stat; + unsigned statusreg; + + statusreg = sd_in32(SD_PRES_STATE_R); + if (!(statusreg & SD_CARD_INS)) { + s = STA_NODISK | STA_NOINIT; + } else { + s &= ~STA_NODISK; + if (statusreg & SD_CARD_WP) + s |= STA_PROTECT; + else + s &= ~STA_PROTECT; + } + Stat = s; + + return s; +} + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive number (0) */ +) +{ + DSTATUS s; + + /* + * Check if card is in the socket + */ + s = disk_status(drv); + if (s & STA_NODISK) { + fsbl_printf(DEBUG_GENERAL,"No SD card present.\n"); + return s; + } + + /* + * Initialize the host controller + */ + init_port(); + +#ifdef MMC_SUPPORT + s = mmc_init(); + if(s != RES_OK) { + fsbl_printf(DEBUG_GENERAL,"MMC Initialization Failed.\n"); + return s; + } +#else + s = sd_init(); + if(s != RES_OK) { + fsbl_printf(DEBUG_GENERAL,"SD Initialization Failed.\n"); + return s; + } +#endif + + if (CardType) /* Initialization succeeded */ + s &= ~STA_NOINIT; + else /* Initialization failed */ + s |= STA_NOINIT; + Stat = s; + + return s; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive number (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..128) */ +) +{ + DSTATUS s; + + s = disk_status(drv); + if (s & STA_NOINIT) return RES_NOTRDY; + if (!count) return RES_PARERR; + /* Convert LBA to byte address if needed */ + if (!(CardType & CT_BLOCK)) sector *= SD_BLOCK_SZ; + + blkcnt = count; + blksize= SD_BLOCK_SZ; + + /* set adma2 for transfer */ + setup_adma2_trans(buff); + + /* Multiple block read */ + send_cmd(CMD18, sector, NULL); + + /* check for dma transfer complete */ + if (!dma_trans_cmpl()) { + return RES_ERROR; + } + + return RES_OK; +} + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive number (0) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + + if (disk_status(drv) & STA_NOINIT) /* Check if card is in the socket */ + return RES_NOTRDY; + + res = RES_ERROR; + switch (ctrl) { + case CTRL_SYNC : /* Make sure that no pending write process */ + break; + + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ + break; + + case GET_BLOCK_SIZE : /* Get erase block size in unit of sector (DWORD) */ + *(DWORD*)buff = 128; + res = RES_OK; + break; + + default: + res = RES_PARERR; + break; + } + + return res; +} + +/******************************************************************************/ +/** +* +* This function is User Provided Timer Function for FatFs module +* +* @param None +* +* @return DWORD +* +* @note None +* +****************************************************************************/ +DWORD get_fattime (void) +{ + return ((DWORD)(2010 - 1980) << 25) /* Fixed to Jan. 1, 2010 */ + | ((DWORD)1 << 21) + | ((DWORD)1 << 16) + | ((DWORD)0 << 11) + | ((DWORD)0 << 5) + | ((DWORD)0 >> 1); +} + + + +#ifdef MMC_SUPPORT +/* + * MMC initialization + */ +static DRESULT mmc_init(void) +{ + BYTE ty; + DSTATUS s; + DWORD response; + unsigned rca; + u16 regval; + u16 clk_div; + u32 argument; + u8 status_data[512]; + + ty= CT_MMC; + + /* + * Enter Idle state + */ + send_cmd(CMD0, 0, NULL); + + /* + * Wait for leaving idle state (CMD1 with HCS bit) + */ + while (1) { + + argument = MMC_OCR_REG_VALUE; + + s= send_cmd(CMD1, argument, &response); + if (s == 0) { + /* + * command error; probably an SD card + */ + ty = 0; + goto fail; + } + if (response & 1<<31) { + break; + } + } + + if (response & 1<<30) { + /* + * Card supports block addressing + */ + ty |= CT_BLOCK; + } + + /* + * Get CID + */ + send_cmd(CMD2, 0, &response); + + /* + * Set RCA + */ + rca = 0x1234; + send_cmd(CMD3, rca << 16, &response); + + /* + * Send CSD + */ + send_cmd(CMD9,rca<<16,&response); + + /* + * select card + */ + send_cmd(CMD7, rca << 16, &response); + + /* + * Switch the bus width to 4bit + */ + argument = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | + (EXT_CSD_BUS_WIDTH << 16) | + (1 << 8); + send_cmd(CMD6, argument, &response); + + /* + * Delay for device to setup + */ + usleep(1000); + + /* + * Enable 4bit mode in controller + */ + regval = sd_in16(SD_HOST_CTRL_R); + regval |= SD_HOST_4BIT; + sd_out16(SD_HOST_CTRL_R, regval); + + /* + * Switch device to high speed + */ + argument = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | + (EXT_CSD_HS_TIMING << 16) | + (1 << 8); + send_cmd(CMD6, argument, &response); + + /* + * Delay for device to setup + */ + usleep(1000); + + /* + * Verify Bus width switch to high speed support + */ + blkcnt = 1; + blksize= 512; + + /* + * Set adma2 for transfer + */ + setup_adma2_trans(&status_data[0]); + + /* + * Check for high speed support switch + */ + send_cmd(CMD8, 0x0, &response); + + /* + * Check for dma transfer complete + */ + if (!dma_trans_cmpl()) { + return RES_ERROR; + } + + /* + * Check for 4bit support + */ + if (status_data[EXT_CSD_BUS_WIDTH] == MMC_4BIT_SUPPORT) { + fsbl_printf(DEBUG_INFO, "Bus Width 4Bit\r\n"); + } + + + if (status_data[EXT_CSD_HS_TIMING] == MMC_HS_SUPPORT) { + fsbl_printf(DEBUG_INFO, "High Speed Mode\r\n"); + /* + * Disable SD clock and internal clock + */ + regval = sd_in16(SD_CLK_CTL_R); + regval &= ~(SD_CLK_SD_EN|SD_CLK_INT_EN); + sd_out16(SD_CLK_CTL_R, regval); + + clk_div = (SDIO_FREQ / MMC_CLK_52M); + if (!(SDIO_FREQ % MMC_CLK_52M)) { + clk_div -=1; + } + + /* + * Enable Internal clock and wait for it to stabilize + */ + regval = (clk_div << SD_DIV_SHIFT) | SD_CLK_INT_EN; + sd_out16(SD_CLK_CTL_R, regval); + do { + regval = sd_in16(SD_CLK_CTL_R); + } while (!(regval & SD_CLK_INT_STABLE)); + + /* + * Enable SD clock + */ + regval |= SD_CLK_SD_EN; + sd_out16(SD_CLK_CTL_R, regval); + + /* + * Enable high speed mode in controller + */ + regval = sd_in16(SD_HOST_CTRL_R); + regval |= SD_HOST_HS; + sd_out16(SD_HOST_CTRL_R, regval); + } else { + /* + * Disable SD clock and internal clock + */ + regval = sd_in16(SD_CLK_CTL_R); + regval &= ~(SD_CLK_SD_EN|SD_CLK_INT_EN); + sd_out16(SD_CLK_CTL_R, regval); + + /* + * Calculating clock divisor + */ + clk_div = (SDIO_FREQ / MMC_CLK_26M); + if (!(SDIO_FREQ % MMC_CLK_26M)) { + clk_div -=1; + } + + /* + * Enable Internal clock and wait for it to stabilize + */ + regval = (clk_div << SD_DIV_SHIFT) | SD_CLK_INT_EN; + sd_out16(SD_CLK_CTL_R, regval); + do { + regval = sd_in16(SD_CLK_CTL_R); + } while (!(regval & SD_CLK_INT_STABLE)); + + /* + * Enable SD clock + */ + regval |= SD_CLK_SD_EN; + sd_out16(SD_CLK_CTL_R, regval); + } + + /* + * Set R/W block length to 512 + */ + send_cmd(CMD16, SD_BLOCK_SZ, &response); + +fail: + CardType = ty; + + return RES_OK; +} + +#else +/* + * SD initialization + */ +DRESULT sd_init(void) +{ + BYTE ty; + DSTATUS s; + DWORD response; + unsigned rca; + u16 regval; + u8 status_data[64]; + u8 sd_4bit_flag=0; + u8 sd_hs_flag=0; + u16 clk_div; + + /* + * Enter Idle state + */ + send_cmd(CMD0, 0, NULL); + + ty = CT_SD1; + /* + * SDv2? + */ + if (send_cmd(CMD8, 0x1AA, &response) == 1) { + /* + * The card can work at vdd range of 2.7-3.6V + */ + if (response == 0x1AA) { + ty = CT_SD2; + } + } + + /* + * Wait for leaving idle state (ACMD41 with HCS bit) + */ + while (1) { + /* + * ACMD41, Set Operating Continuous + */ + send_cmd(CMD55, 0, NULL); + /* 0x00ff8000 */ + s = send_cmd(CMD41, 0x40300000, &response); + if (s == 0) { + /* + * command error; probably an MMC card + * presently unsupported; abort + */ + ty = 0; + goto fail; + } + if (response & 1<<31) { + break; + } + } + if (response & 1<<30) { + /* + * Card supports block addressing + */ + ty |= CT_BLOCK; + } + + /* + * Get CID + */ + send_cmd(CMD2, 0, &response); + + /* + * Get RCA + */ + rca = 0x1234; + send_cmd(CMD3, rca << 16, &response); + rca = response >> 16; + + /* + * select card + */ + send_cmd(CMD7, rca << 16, &response); + + /* + * Getting 4bit support information + */ + blkcnt = 1; + blksize= 8; + + /* + * Set adma2 for transfer + */ + setup_adma2_trans(&status_data[0]); + + /* + * Application specific command + */ + send_cmd(CMD55, rca << 16, &response); + + /* + * Read SD Configuration Register + */ + send_cmd(ACMD51, 0, &response); + + /* + * Check for dma transfer complete + */ + if (!dma_trans_cmpl()) { + return RES_ERROR; + } + + /* + * SD 4-bit support check + */ + if (status_data[1]&SD_4BIT_SUPPORT) { + sd_4bit_flag=1; + } + + /* + * Getting high speed support support information + */ + blkcnt = 1; + blksize= 64; + + /* + * Set adma2 for transfer + */ + setup_adma2_trans(&status_data[0]); + + /* + * Check for high speed support switch + */ + send_cmd(CMD6, 0x00FFFFF0, &response); + + /* + * Check for dma transfer complete + */ + if (!dma_trans_cmpl()) { + return RES_ERROR; + } + + /* + * SD high speed support check + */ + if (status_data[13]&SD_HS_SUPPORT) { + sd_hs_flag=1; + } + + /* + * Application specific command + */ + send_cmd(CMD55, rca << 16, &response); + + /* + * Clear card detect pull-up + */ + send_cmd(ACMD42, 0, &response); + + if (sd_4bit_flag) { + /* + * Application specific command + */ + send_cmd(CMD55, rca << 16, &response); + + /* + * Set data bus width to 4-bit + */ + send_cmd(ACMD6, 2, &response); + + /* + * Enable 4bit mode in controller + */ + regval = sd_in16(SD_HOST_CTRL_R); + regval |= SD_HOST_4BIT; + sd_out16(SD_HOST_CTRL_R, regval); + } + + if (sd_hs_flag) { + /* + * Set adma2 for transfer + */ + setup_adma2_trans(&status_data[0]); + + /* + * Switch device to high speed + */ + send_cmd(CMD6, 0x80FFFFF1, &response); + + /* + * Check for DMA transfer complete + */ + if (!dma_trans_cmpl()) { + return RES_ERROR; + } + + /* + * Disable SD clock and internal clock + */ + regval = sd_in16(SD_CLK_CTL_R); + regval &= ~(SD_CLK_SD_EN|SD_CLK_INT_EN); + sd_out16(SD_CLK_CTL_R, regval); + + clk_div = (SDIO_FREQ/SD_CLK_50M); + if (!(SDIO_FREQ%SD_CLK_50M)) { + clk_div -=1; + } + + /* + * Enable Internal clock and wait for it to stabilize + */ + regval = (clk_div << SD_DIV_SHIFT) | SD_CLK_INT_EN; + sd_out16(SD_CLK_CTL_R, regval); + do { + regval = sd_in16(SD_CLK_CTL_R); + } while (!(regval & SD_CLK_INT_STABLE)); + + /* + * Enable SD clock + */ + regval |= SD_CLK_SD_EN; + sd_out16(SD_CLK_CTL_R, regval); + + /* + * Enable high speed mode in controller + */ + regval = sd_in16(SD_HOST_CTRL_R); + regval |= SD_HOST_HS; + sd_out16(SD_HOST_CTRL_R, regval); + } else { + /* + * Disable SD clock and internal clock + */ + regval = sd_in16(SD_CLK_CTL_R); + regval &= ~(SD_CLK_SD_EN|SD_CLK_INT_EN); + sd_out16(SD_CLK_CTL_R, regval); + + /* + * Calculating clock divisor + */ + clk_div = (SDIO_FREQ/SD_CLK_25M); + if (!(SDIO_FREQ%SD_CLK_25M)) { + clk_div -=1; + } + + /* + * Enable Internal clock and wait for it to stabilize + */ + regval = (clk_div << SD_DIV_SHIFT) | SD_CLK_INT_EN; + sd_out16(SD_CLK_CTL_R, regval); + do { + regval = sd_in16(SD_CLK_CTL_R); + } while (!(regval & SD_CLK_INT_STABLE)); + + /* + * Enable SD clock + */ + regval |= SD_CLK_SD_EN; + sd_out16(SD_CLK_CTL_R, regval); + } + + /* + * Set R/W block length to 512 + */ + send_cmd(CMD16, SD_BLOCK_SZ, &response); + +fail: + CardType = ty; + + return RES_OK; +} +#endif + +#endif diff --git a/quad/zybo_fsbl/src/nand.c b/quad/zybo_fsbl/src/nand.c new file mode 100644 index 000000000..7a50c35be --- /dev/null +++ b/quad/zybo_fsbl/src/nand.c @@ -0,0 +1,304 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nand.c +* +* Contains code for the NAND FLASH functionality. Bad Block management +* is simple: skip the bad blocks and keep going. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 01/10/10 Initial release +* 2.00a mb 25/05/12 fsbl changes for standalone bsp based +* 3.00a sgd 30/01/13 Code cleanup +* 5.00a sgd 17/05/13 Support for Multi Boot +* </pre> +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xparameters.h" +#include "fsbl.h" +#ifdef XPAR_PS7_NAND_0_BASEADDR +#include "nand.h" +#include "xnandps_bbm.h" + + +/************************** Constant Definitions *****************************/ + +#define NAND_DEVICE_ID XPAR_XNANDPS_0_DEVICE_ID + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +static u32 XNandPs_CalculateLength(XNandPs *NandInstPtr, + u64 Offset, + u32 Length); + +/************************** Variable Definitions *****************************/ + +extern u32 FlashReadBaseAddress; +extern u32 FlashOffsetAddress; + +XNandPs *NandInstPtr; +XNandPs NandInstance; /* XNand Instance. */ + +/******************************************************************************/ +/** +* +* This function initializes the controller for the NAND FLASH interface. +* +* @param none +* +* @return +* - XST_SUCCESS if the controller initializes correctly +* - XST_FAILURE if the controller fails to initializes correctly +* +* @note none. +* +****************************************************************************/ +u32 InitNand(void) +{ + + u32 Status; + XNandPs_Config *ConfigPtr; + + /* + * Set up pointers to instance and the config structure + */ + NandInstPtr = &NandInstance; + + /* + * Initialize the flash driver. + */ + ConfigPtr = XNandPs_LookupConfig(NAND_DEVICE_ID); + + if (ConfigPtr == NULL) { + fsbl_printf(DEBUG_GENERAL,"Nand Driver failed \n \r"); + return XST_FAILURE; + } + + Status = XNandPs_CfgInitialize(NandInstPtr, ConfigPtr, + ConfigPtr->SmcBase,ConfigPtr->FlashBase); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"NAND intialization failed \n \r"); + return XST_FAILURE; + } + + /* + * Set up base address for access + */ + FlashReadBaseAddress = XPS_NAND_BASEADDR; + + fsbl_printf(DEBUG_INFO,"InitNand: Geometry = 0x%x\r\n", + NandInstPtr->Geometry.FlashWidth); + + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_GENERAL,"InitNand: Status = 0x%.8x\r\n", + Status); + return XST_FAILURE; + } + + /* + * set up the FLASH access pointers + */ + fsbl_printf(DEBUG_INFO,"Nand driver initialized \n\r"); + + return XST_SUCCESS; +} + +/******************************************************************************/ +/** +* +* This function provides the NAND FLASH interface for the Simplified header +* functionality. This function handles bad blocks. +* +* The source address is the absolute good address, bad blocks are skipped +* without incrementing the source address. +* +* @param SourceAddress is address in FLASH data space, absolute good address +* @param DestinationAddress is address in OCM data space +* +* @return XST_SUCCESS if the transfer completes correctly +* XST_FAILURE if the transfer fails to completes correctly +* +* @note none. +* +****************************************************************************/ +u32 NandAccess(u32 SourceAddress, u32 DestinationAddress, u32 LengthBytes) +{ + u32 ActLen; + u32 BlockOffset; + u32 Block; + u32 Status; + u32 BytesLeft = LengthBytes; + u32 BlockSize = NandInstPtr->Geometry.BlockSize; + u8 *BufPtr = (u8 *)DestinationAddress; + u32 ReadLen; + u32 BlockReadLen; + u32 Offset; + u32 TmpAddress = 0 ; + u32 BlockCount = 0; + u32 BadBlocks = 0; + + /* + * First get bad blocks before the source address + */ + while (TmpAddress < SourceAddress) { + while (XNandPs_IsBlockBad(NandInstPtr, BlockCount) == + XST_SUCCESS) { + BlockCount ++; + BadBlocks ++; + } + + TmpAddress += BlockSize; + BlockCount ++; + } + + Offset = SourceAddress + BadBlocks * BlockSize; + + /* + * Calculate the actual length including bad blocks + */ + ActLen = XNandPs_CalculateLength(NandInstPtr, Offset, LengthBytes); + + /* + * Check if the actual length cross flash size + */ + if (Offset + ActLen > NandInstPtr->Geometry.DeviceSize) { + return XST_FAILURE; + } + + while (BytesLeft > 0) { + BlockOffset = Offset & (BlockSize - 1); + Block = (Offset & ~(BlockSize - 1))/BlockSize; + BlockReadLen = BlockSize - BlockOffset; + + Status = XNandPs_IsBlockBad(NandInstPtr, Block); + if (Status == XST_SUCCESS) { + /* Move to next block */ + Offset += BlockReadLen; + continue; + } + + /* + * Check if we cross block boundary + */ + if (BytesLeft < BlockReadLen) { + ReadLen = BytesLeft; + } else { + ReadLen = BlockReadLen; + } + + /* + * Read from the NAND flash + */ + Status = XNandPs_Read(NandInstPtr, Offset, ReadLen, BufPtr, NULL); + if (Status != XST_SUCCESS) { + return Status; + } + BytesLeft -= ReadLen; + Offset += ReadLen; + BufPtr += ReadLen; + } + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function returns the length including bad blocks from a given offset and +* length. +* +* @param NandInstPtr is the pointer to the XNandPs instance. +* @param Offset is the flash data address to read from. +* @param Length is number of bytes to read. +* +* @return +* - Return actual length including bad blocks. +* +* @note None. +* +******************************************************************************/ +static u32 XNandPs_CalculateLength(XNandPs *NandInstPtr, + u64 Offset, + u32 Length) +{ + u32 BlockSize = NandInstPtr->Geometry.BlockSize; + u32 CurBlockLen; + u32 CurBlock; + u32 Status; + u32 TempLen = 0; + u32 ActLen = 0; + + while (TempLen < Length) { + CurBlockLen = BlockSize - (Offset & (BlockSize - 1)); + CurBlock = (Offset & ~(BlockSize - 1))/BlockSize; + + /* + * Check if the block is bad + */ + Status = XNandPs_IsBlockBad(NandInstPtr, CurBlock); + if (Status != XST_SUCCESS) { + /* Good Block */ + TempLen += CurBlockLen; + } + ActLen += CurBlockLen; + Offset += CurBlockLen; + if (Offset >= NandInstPtr->Geometry.DeviceSize) { + break; + } + } + + return ActLen; +} + +#endif diff --git a/quad/zybo_fsbl/src/nand.h b/quad/zybo_fsbl/src/nand.h new file mode 100644 index 000000000..a7bdb08af --- /dev/null +++ b/quad/zybo_fsbl/src/nand.h @@ -0,0 +1,101 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nand.h +* +* This file contains the interface for the NAND FLASH functionality +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 01/10/10 Initial release +* 2.00a mb 30/05/12 added the flag XPAR_PS7_NAND_0_BASEADDR +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef ___NAND_H___ +#define ___NAND_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + + +#include "smc.h" + +#ifdef XPAR_PS7_NAND_0_BASEADDR + +#include "xnandps.h" +#include "xnandps_bbm.h" +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +u32 InitNand(void); + +u32 NandAccess( u32 SourceAddress, + u32 DestinationAddress, + u32 LengthWords); +#endif +/************************** Variable Definitions *****************************/ + + +#ifdef __cplusplus +} +#endif + + +#endif /* ___NAND_H___ */ + diff --git a/quad/zybo_fsbl/src/nor.c b/quad/zybo_fsbl/src/nor.c new file mode 100644 index 000000000..0dc6c14ec --- /dev/null +++ b/quad/zybo_fsbl/src/nor.c @@ -0,0 +1,153 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nor.c +* +* Contains code for the NOR FLASH functionality. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 01/10/10 Initial release +* 2.00a mb 25/05/12 mio init removed +* 3.00a sgd 30/01/13 Code cleanup +* +* </pre> +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "fsbl.h" +#include "nor.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +extern u32 FlashReadBaseAddress; + +/******************************************************************************/ +/******************************************************************************/ +/** +* +* This function initializes the controller for the NOR FLASH interface. +* +* @param None +* +* @return None +* +* @note None. +* +****************************************************************************/ +void InitNor(void) +{ + + /* + * Set up the base address for access + */ + FlashReadBaseAddress = XPS_NOR_BASEADDR; +} + +/******************************************************************************/ +/** +* +* This function provides the NOR FLASH interface for the Simplified header +* functionality. +* +* @param SourceAddress is address in FLASH data space +* @param DestinationAddress is address in OCM data space +* @param LengthBytes is the data length to transfer in bytes +* +* @return +* - XST_SUCCESS if the write completes correctly +* - XST_FAILURE if the write fails to completes correctly +* +* @note None. +* +****************************************************************************/ +u32 NorAccess(u32 SourceAddress, u32 DestinationAddress, u32 LengthBytes) +{ + u32 Data; + u32 Count; + u32 *SourceAddr; + u32 *DestAddr; + u32 LengthWords; + + /* + * check for non-word tail + * add bytes to cover the end + */ + if ((LengthBytes%4) != 0){ + + LengthBytes += (4 - (LengthBytes & 0x00000003)); + } + + LengthWords = LengthBytes >> WORD_LENGTH_SHIFT; + + SourceAddr = (u32 *)(SourceAddress + FlashReadBaseAddress); + DestAddr = (u32 *)(DestinationAddress); + + /* + * Word transfers, endianism isn't an issue + */ + for (Count=0; Count < LengthWords; Count++){ + + Data = Xil_In32((u32)(SourceAddr++)); + Xil_Out32((u32)(DestAddr++), Data); + } + + return XST_SUCCESS; +} + diff --git a/quad/zybo_fsbl/src/nor.h b/quad/zybo_fsbl/src/nor.h new file mode 100644 index 000000000..8e5fe0b6a --- /dev/null +++ b/quad/zybo_fsbl/src/nor.h @@ -0,0 +1,98 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file nor.h +* +* This file contains the interface for the NOR FLASH functionality +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 01/10/10 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef ___NOR_H___ +#define ___NOR_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + + +#include "smc.h" + +/************************** Constant Definitions *****************************/ + +#define XPS_NOR_BASEADDR XPS_PARPORT0_BASEADDR + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + + +void InitNor(void); + +u32 NorAccess( u32 SourceAddress, + u32 DestinationAddress, + u32 LengthBytes); + +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif + + +#endif /* ___NOR_H___ */ + diff --git a/quad/zybo_fsbl/src/pcap.c b/quad/zybo_fsbl/src/pcap.c new file mode 100644 index 000000000..50bebab38 --- /dev/null +++ b/quad/zybo_fsbl/src/pcap.c @@ -0,0 +1,655 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file pcap.c +* +* Contains code for enabling and accessing the PCAP +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 02/10/10 Initial release +* 2.00a jz 05/28/11 Add SD support +* 2.00a mb 25/05/12 using the EDK provided devcfg driver +* Nand/SD encryption and review comments +* 3.00a mb 16/08/12 Added the poll function +* Removed the FPGA_RST_CTRL define +* Added the flag for NON PS instantiated bitstream +* 4.00a sgd 02/28/13 Fix for CR#681014 - ECC init in FSBL should not call +* fabric_init() +* Fix for CR#689026 - FSBL doesn't hold PL resets active +* during bit download +* Fix for CR#699475 - FSBL functionality is broken and +* its not able to boot in QSPI/NAND +* bootmode +* Fix for CR#705664 - FSBL fails to decrypt the +* bitstream when the image is AES +* encrypted using non-zero key value +* 6.00a kc 08/30/13 Fix for CR#722979 - Provide customer-friendly +* changelogs in FSBL +* +* </pre> +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "pcap.h" +#include "nand.h" /* For NAND geometry information */ +#include "fsbl.h" +#include "image_mover.h" /* For MoveImage */ +#include "xparameters.h" +#include "xil_exception.h" +#include "xdevcfg.h" +#include "sleep.h" + +#ifdef XPAR_XWDTPS_0_BASEADDR +#include "xwdtps.h" +#endif +/************************** Constant Definitions *****************************/ +/* + * The following constants map to the XPAR parameters created in the + * xparameters.h file. They are only defined here such that a user can easily + * change all the needed parameters in one place. + */ + +#define DCFG_DEVICE_ID XPAR_XDCFG_0_DEVICE_ID + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +extern int XDcfgPollDone(u32 MaskValue, u32 MaxCount); + +/************************** Variable Definitions *****************************/ +/* Devcfg driver instance */ +static XDcfg DcfgInstance; +XDcfg *DcfgInstPtr; + +#ifdef XPAR_XWDTPS_0_BASEADDR +extern XWdtPs Watchdog; /* Instance of WatchDog Timer */ +#endif + +/******************************************************************************/ +/** +* +* This function transfer data using PCAP +* +* @param SourceDataPtr is a pointer to where the data is read from +* @param DestinationDataPtr is a pointer to where the data is written to +* @param SourceLength is the length of the data to be moved in words +* @param DestinationLength is the length of the data to be moved in words +* @param SecureTransfer indicated the encryption key location, 0 for +* non-encrypted +* +* @return +* - XST_SUCCESS if the transfer is successful +* - XST_FAILURE if the transfer fails +* +* @note None +* +****************************************************************************/ +u32 PcapDataTransfer(u32 *SourceDataPtr, u32 *DestinationDataPtr, + u32 SourceLength, u32 DestinationLength, u32 SecureTransfer) +{ + u32 Status; + u32 PcapTransferType = XDCFG_CONCURRENT_NONSEC_READ_WRITE; + + /* + * Check for secure transfer + */ + if (SecureTransfer) { + PcapTransferType = XDCFG_CONCURRENT_SECURE_READ_WRITE; + } + +#ifdef FSBL_PERF + XTime tXferCur = 0; + FsblGetGlobalTime(tXferCur); +#endif + + /* + * Clear the PCAP status registers + */ + Status = ClearPcapStatus(); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO,"PCAP_CLEAR_STATUS_FAIL \r\n"); + return XST_FAILURE; + } + +#ifdef XPAR_XWDTPS_0_BASEADDR + /* + * Prevent WDT reset + */ + XWdtPs_RestartWdt(&Watchdog); +#endif + + /* + * PCAP single DMA transfer setup + */ + SourceDataPtr = (u32*)((u32)SourceDataPtr | PCAP_LAST_TRANSFER); + DestinationDataPtr = (u32*)((u32)DestinationDataPtr | PCAP_LAST_TRANSFER); + + /* + * Transfer using Device Configuration + */ + Status = XDcfg_Transfer(DcfgInstPtr, (u8 *)SourceDataPtr, + SourceLength, + (u8 *)DestinationDataPtr, + DestinationLength, PcapTransferType); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO,"Status of XDcfg_Transfer = %d \r \n",Status); + return XST_FAILURE; + } + + /* + * Dump the PCAP registers + */ + PcapDumpRegisters(); + + /* + * Poll for the DMA done + */ + Status = XDcfgPollDone(XDCFG_IXR_DMA_DONE_MASK, MAX_COUNT); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO,"PCAP_DMA_DONE_FAIL \r\n"); + return XST_FAILURE; + } + + fsbl_printf(DEBUG_INFO,"DMA Done ! \n\r"); + + /* + * For Performance measurement + */ +#ifdef FSBL_PERF + XTime tXferEnd = 0; + fsbl_printf(DEBUG_GENERAL,"Time taken is "); + FsblMeasurePerfTime(tXferCur,tXferEnd); +#endif + + return XST_SUCCESS; +} + + +/******************************************************************************/ +/** +* +* This function loads PL partition using PCAP +* +* @param SourceDataPtr is a pointer to where the data is read from +* @param DestinationDataPtr is a pointer to where the data is written to +* @param SourceLength is the length of the data to be moved in words +* @param DestinationLength is the length of the data to be moved in words +* @param SecureTransfer indicated the encryption key location, 0 for +* non-encrypted +* +* @return +* - XST_SUCCESS if the transfer is successful +* - XST_FAILURE if the transfer fails +* +* @note None +* +****************************************************************************/ +u32 PcapLoadPartition(u32 *SourceDataPtr, u32 *DestinationDataPtr, + u32 SourceLength, u32 DestinationLength, u32 SecureTransfer) +{ + u32 Status; + u32 PcapTransferType = XDCFG_NON_SECURE_PCAP_WRITE; + + /* + * Check for secure transfer + */ + if (SecureTransfer) { + PcapTransferType = XDCFG_SECURE_PCAP_WRITE; + } + +#ifdef FSBL_PERF + XTime tXferCur = 0; + FsblGetGlobalTime(tXferCur); +#endif + + /* + * Clear the PCAP status registers + */ + Status = ClearPcapStatus(); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO,"PCAP_CLEAR_STATUS_FAIL \r\n"); + return XST_FAILURE; + } + + /* + * For Bitstream case destination address will be 0xFFFFFFFF + */ + DestinationDataPtr = (u32*)XDCFG_DMA_INVALID_ADDRESS; + + /* + * New Bitstream download initialization sequence + */ + FabricInit(); + + +#ifdef XPAR_XWDTPS_0_BASEADDR + /* + * Prevent WDT reset + */ + XWdtPs_RestartWdt(&Watchdog); +#endif + + /* + * PCAP single DMA transfer setup + */ + SourceDataPtr = (u32*)((u32)SourceDataPtr | PCAP_LAST_TRANSFER); + DestinationDataPtr = (u32*)((u32)DestinationDataPtr | PCAP_LAST_TRANSFER); + + /* + * Transfer using Device Configuration + */ + Status = XDcfg_Transfer(DcfgInstPtr, (u8 *)SourceDataPtr, + SourceLength, + (u8 *)DestinationDataPtr, + DestinationLength, PcapTransferType); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO,"Status of XDcfg_Transfer = %d \r \n",Status); + return XST_FAILURE; + } + + + /* + * Dump the PCAP registers + */ + PcapDumpRegisters(); + + + /* + * Poll for the DMA done + */ + Status = XDcfgPollDone(XDCFG_IXR_DMA_DONE_MASK, MAX_COUNT); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO,"PCAP_DMA_DONE_FAIL \r\n"); + return XST_FAILURE; + } + + fsbl_printf(DEBUG_INFO,"DMA Done ! \n\r"); + + /* + * Poll for FPGA Done + */ + Status = XDcfgPollDone(XDCFG_IXR_PCFG_DONE_MASK, MAX_COUNT); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO,"PCAP_FPGA_DONE_FAIL\r\n"); + return XST_FAILURE; + } + + fsbl_printf(DEBUG_INFO,"FPGA Done ! \n\r"); + + /* + * For Performance measurement + */ +#ifdef FSBL_PERF + XTime tXferEnd = 0; + fsbl_printf(DEBUG_GENERAL,"Time taken is "); + FsblMeasurePerfTime(tXferCur,tXferEnd); +#endif + + return XST_SUCCESS; +} + +/******************************************************************************/ +/** +* +* This function Initializes the PCAP driver. +* +* @param none +* +* @return +* - XST_SUCCESS if the pcap driver initialization is successful +* - XST_FAILURE if the pcap driver initialization fails +* +* @note none +* +****************************************************************************/ +int InitPcap(void) +{ + XDcfg_Config *ConfigPtr; + int Status = XST_SUCCESS; + DcfgInstPtr = &DcfgInstance; + + /* + * Initialize the Device Configuration Interface driver. + */ + ConfigPtr = XDcfg_LookupConfig(DCFG_DEVICE_ID); + + Status = XDcfg_CfgInitialize(DcfgInstPtr, ConfigPtr, + ConfigPtr->BaseAddr); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO, "XDcfg_CfgInitialize failed \n\r"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +/******************************************************************************/ +/** +* +* This function programs the Fabric for use. +* +* @param None +* +* @return None +* - XST_SUCCESS if the Fabric initialization is successful +* - XST_FAILURE if the Fabric initialization fails +* @note None +* +****************************************************************************/ +void FabricInit(void) +{ + u32 PcapReg; + u32 StatusReg; + + /* + * Set Level Shifters DT618760 - PS to PL enabling + */ + Xil_Out32(PS_LVL_SHFTR_EN, LVL_PS_PL); + fsbl_printf(DEBUG_INFO,"Level Shifter Value = 0x%x \r\n", + Xil_In32(PS_LVL_SHFTR_EN)); + + /* + * Get DEVCFG controller settings + */ + PcapReg = XDcfg_ReadReg(DcfgInstPtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET); + + /* + * Setting PCFG_PROG_B signal to high + */ + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (PcapReg | XDCFG_CTRL_PCFG_PROG_B_MASK)); + + /* + * 5msec delay + */ + usleep(5000); + /* + * Setting PCFG_PROG_B signal to low + */ + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (PcapReg & ~XDCFG_CTRL_PCFG_PROG_B_MASK)); + + /* + * 5msec delay + */ + usleep(5000); + /* + * Polling the PCAP_INIT status for Reset + */ + while(XDcfg_GetStatusRegister(DcfgInstPtr) & + XDCFG_STATUS_PCFG_INIT_MASK); + + /* + * Setting PCFG_PROG_B signal to high + */ + XDcfg_WriteReg(DcfgInstPtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (PcapReg | XDCFG_CTRL_PCFG_PROG_B_MASK)); + + /* + * Polling the PCAP_INIT status for Set + */ + while(!(XDcfg_GetStatusRegister(DcfgInstPtr) & + XDCFG_STATUS_PCFG_INIT_MASK)); + + /* + * Get Device configuration status + */ + StatusReg = XDcfg_GetStatusRegister(DcfgInstPtr); + fsbl_printf(DEBUG_INFO,"Devcfg Status register = 0x%x \r\n",StatusReg); + + fsbl_printf(DEBUG_INFO,"PCAP:Fabric is Initialized done\r\n"); +} + +/******************************************************************************/ +/** +* +* This function Clears the PCAP status registers. +* +* @param None +* +* @return +* - XST_SUCCESS if the pcap status registers are cleared +* - XST_FAILURE if errors are there +* - XST_DEVICE_BUSY if Pcap device is busy +* @note None +* +****************************************************************************/ +u32 ClearPcapStatus(void) +{ + + u32 StatusReg; + u32 IntStatusReg; + + /* + * Clear it all, so if Boot ROM comes back, it can proceed + */ + XDcfg_IntrClear(DcfgInstPtr, 0xFFFFFFFF); + + /* + * Get PCAP Interrupt Status Register + */ + IntStatusReg = XDcfg_IntrGetStatus(DcfgInstPtr); + if (IntStatusReg & FSBL_XDCFG_IXR_ERROR_FLAGS_MASK) { + fsbl_printf(DEBUG_INFO,"FATAL errors in PCAP %x\r\n", + IntStatusReg); + return XST_FAILURE; + } + + /* + * Read the PCAP status register for DMA status + */ + StatusReg = XDcfg_GetStatusRegister(DcfgInstPtr); + + fsbl_printf(DEBUG_INFO,"PCAP:StatusReg = 0x%.8x\r\n", StatusReg); + + /* + * If the queue is full, return w/ XST_DEVICE_BUSY + */ + if ((StatusReg & XDCFG_STATUS_DMA_CMD_Q_F_MASK) == + XDCFG_STATUS_DMA_CMD_Q_F_MASK) { + + fsbl_printf(DEBUG_INFO,"PCAP_DEVICE_BUSY\r\n"); + return XST_DEVICE_BUSY; + } + + fsbl_printf(DEBUG_INFO,"PCAP:device ready\r\n"); + + /* + * There are unacknowledged DMA commands outstanding + */ + if ((StatusReg & XDCFG_STATUS_DMA_CMD_Q_E_MASK) != + XDCFG_STATUS_DMA_CMD_Q_E_MASK) { + + IntStatusReg = XDcfg_IntrGetStatus(DcfgInstPtr); + + if ((IntStatusReg & XDCFG_IXR_DMA_DONE_MASK) != + XDCFG_IXR_DMA_DONE_MASK){ + /* + * Error state, transfer cannot occur + */ + fsbl_printf(DEBUG_INFO,"PCAP:IntStatus indicates error\r\n"); + return XST_FAILURE; + } + else { + /* + * clear out the status + */ + XDcfg_IntrClear(DcfgInstPtr, XDCFG_IXR_DMA_DONE_MASK); + } + } + + if ((StatusReg & XDCFG_STATUS_DMA_DONE_CNT_MASK) != 0) { + XDcfg_IntrClear(DcfgInstPtr, StatusReg & + XDCFG_STATUS_DMA_DONE_CNT_MASK); + } + + fsbl_printf(DEBUG_INFO,"PCAP:Clear done\r\n"); + + return XST_SUCCESS; +} + +/******************************************************************************/ +/** +* +* This function prints PCAP register status. +* +* @param none +* +* @return none +* +* @note none +* +****************************************************************************/ +void PcapDumpRegisters (void) { + + fsbl_printf(DEBUG_INFO,"PCAP register dump:\r\n"); + + fsbl_printf(DEBUG_INFO,"PCAP CTRL 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_CTRL_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_CTRL_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP LOCK 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_LOCK_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_LOCK_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP CONFIG 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_CFG_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_CFG_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP ISR 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_INT_STS_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_INT_STS_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP IMR 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_INT_MASK_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_INT_MASK_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP STATUS 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_STATUS_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_STATUS_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP DMA SRC ADDR 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_DMA_SRC_ADDR_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_DMA_SRC_ADDR_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP DMA DEST ADDR 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_DMA_DEST_ADDR_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_DMA_DEST_ADDR_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP DMA SRC LEN 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_DMA_SRC_LEN_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_DMA_SRC_LEN_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP DMA DEST LEN 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_DMA_DEST_LEN_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_DMA_DEST_LEN_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP ROM SHADOW CTRL 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_ROM_SHADOW_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_ROM_SHADOW_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP MBOOT 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_MULTIBOOT_ADDR_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_MULTIBOOT_ADDR_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP SW ID 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_SW_ID_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_SW_ID_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP UNLOCK 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_UNLOCK_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_UNLOCK_OFFSET)); + fsbl_printf(DEBUG_INFO,"PCAP MCTRL 0x%x: 0x%08x\r\n", + XPS_DEV_CFG_APB_BASEADDR + XDCFG_MCTRL_OFFSET, + Xil_In32(XPS_DEV_CFG_APB_BASEADDR + XDCFG_MCTRL_OFFSET)); +} + +/******************************************************************************/ +/** +* +* This function Polls for the DMA done or FPGA done. +* +* @param none +* +* @return +* - XST_SUCCESS if polling for DMA/FPGA done is successful +* - XST_FAILURE if polling for DMA/FPGA done fails +* +* @note none +* +****************************************************************************/ +int XDcfgPollDone(u32 MaskValue, u32 MaxCount) +{ + int Count = MaxCount; + u32 IntrStsReg = 0; + + /* + * poll for the DMA done + */ + IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr); + while ((IntrStsReg & MaskValue) != + MaskValue) { + IntrStsReg = XDcfg_IntrGetStatus(DcfgInstPtr); + Count -=1; + + if (IntrStsReg & FSBL_XDCFG_IXR_ERROR_FLAGS_MASK) { + fsbl_printf(DEBUG_INFO,"FATAL errors in PCAP %x\r\n", + IntrStsReg); + PcapDumpRegisters(); + return XST_FAILURE; + } + + if(!Count) { + fsbl_printf(DEBUG_GENERAL,"PCAP transfer timed out \r\n"); + return XST_FAILURE; + } + if (Count > (MAX_COUNT-100)) { + fsbl_printf(DEBUG_GENERAL,"."); + } + } + + fsbl_printf(DEBUG_GENERAL,"\n\r"); + + XDcfg_IntrClear(DcfgInstPtr, IntrStsReg & MaskValue); + + return XST_SUCCESS; +} + diff --git a/quad/zybo_fsbl/src/pcap.h b/quad/zybo_fsbl/src/pcap.h new file mode 100644 index 000000000..b0242d78f --- /dev/null +++ b/quad/zybo_fsbl/src/pcap.h @@ -0,0 +1,110 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file pcap.h +* +* This file contains the interface for intiializing and accessing the PCAP +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 02/10/10 Initial release +* 2.00a mb 16/08/12 Added the macros and function prototypes +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef ___PCAP_H___ +#define ___PCAP_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xdevcfg.h" + +/************************** Function Prototypes ******************************/ + + +/* Multiboot register offset mask */ +#define PCAP_MBOOT_REG_REBOOT_OFFSET_MASK 0x1FFF +#define PCAP_CTRL_PCFG_AES_FUSE_EFUSE_MASK 0x1000 + +#define PCAP_LAST_TRANSFER 1 +#define MAX_COUNT 1000000000 +#define LVL_PL_PS 0x0000000F +#define LVL_PS_PL 0x0000000A + +/* Fix for #672779 */ +#define FSBL_XDCFG_IXR_ERROR_FLAGS_MASK (XDCFG_IXR_AXI_WERR_MASK | \ + XDCFG_IXR_AXI_RTO_MASK | \ + XDCFG_IXR_AXI_RERR_MASK | \ + XDCFG_IXR_RX_FIFO_OV_MASK | \ + XDCFG_IXR_DMA_CMD_ERR_MASK |\ + XDCFG_IXR_DMA_Q_OV_MASK | \ + XDCFG_IXR_P2D_LEN_ERR_MASK |\ + XDCFG_IXR_PCFG_HMAC_ERR_MASK) + +int InitPcap(void); +void PcapDumpRegisters(void); +u32 ClearPcapStatus(void); +void FabricInit(void); +int XDcfgPollDone(u32 MaskValue, u32 MaxCount); +u32 PcapLoadPartition(u32 *SourceData, u32 *DestinationData, u32 SourceLength, + u32 DestinationLength, u32 Flags); +u32 PcapDataTransfer(u32 *SourceData, u32 *DestinationData, u32 SourceLength, + u32 DestinationLength, u32 Flags); +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif + + +#endif /* ___PCAP_H___ */ + diff --git a/quad/zybo_fsbl/src/ps7_init.c b/quad/zybo_fsbl/src/ps7_init.c new file mode 100644 index 000000000..182b94b57 --- /dev/null +++ b/quad/zybo_fsbl/src/ps7_init.c @@ -0,0 +1,12655 @@ + /****************************************************************************** + * + * (c) Copyright 2010-2012 Xilinx, Inc. All rights reserved. + * + * This file contains confidential and proprietary information of Xilinx, Inc. + * and is protected under U.S. and international copyright and other + * intellectual property laws. + * + * DISCLAIMER + * This disclaimer is not a license and does not grant any rights to the + * materials distributed herewith. Except as otherwise provided in a valid + * license issued to you by Xilinx, and to the maximum extent permitted by + * applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE \"AS IS\" AND WITH ALL + * FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, + * IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF + * MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; + * and (2) Xilinx shall not be liable (whether in contract or tort, including + * negligence, or under any other theory of liability) for any loss or damage + * of any kind or nature related to, arising under or in connection with these + * materials, including for any direct, or any indirect, special, incidental, + * or consequential loss or damage (including loss of data, profits, goodwill, + * or any type of loss or damage suffered as a result of any action brought by + * a third party) even if such damage or loss was reasonably foreseeable or + * Xilinx had been advised of the possibility of the same. + * + * CRITICAL APPLICATIONS + * Xilinx products are not designed or intended to be fail-safe, or for use in + * any application requiring fail-safe performance, such as life-support or + * safety devices or systems, Class III medical devices, nuclear facilities, + * applications related to the deployment of airbags, or any other applications + * that could lead to death, personal injury, or severe property or + * environmental damage (individually and collectively, \"Critical + * Applications\"). Customer assumes the sole risk and liability of any use of + * Xilinx products in Critical Applications, subject only to applicable laws + * and regulations governing limitations on product liability. + * + * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE + * AT ALL TIMES. + * + ******************************************************************************/ + /****************************************************************************/ + /** + * + * @file ps7_init.c + * + * This file is automatically generated + * + *****************************************************************************/ + + #include "ps7_init.h" + +unsigned long ps7_pll_init_data_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000110[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x177 + // .. .. ==> 0XF8000110[21:12] = 0x00000177U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00177000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x001772C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1a + // .. .. .. ==> 0XF8000100[18:12] = 0x0000001AU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001A000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x0001A000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000100[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000100[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000100[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. ARM_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000001U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000100[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. .. SRCSEL = 0x0 + // .. .. .. ==> 0XF8000120[5:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. .. DIVISOR = 0x2 + // .. .. .. ==> 0XF8000120[13:8] = 0x00000002U + // .. .. .. ==> MASK : 0x00003F00U VAL : 0x00000200U + // .. .. .. CPU_6OR4XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[24:24] = 0x00000001U + // .. .. .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. .. .. CPU_3OR2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[25:25] = 0x00000001U + // .. .. .. ==> MASK : 0x02000000U VAL : 0x02000000U + // .. .. .. CPU_2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[26:26] = 0x00000001U + // .. .. .. ==> MASK : 0x04000000U VAL : 0x04000000U + // .. .. .. CPU_1XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[27:27] = 0x00000001U + // .. .. .. ==> MASK : 0x08000000U VAL : 0x08000000U + // .. .. .. CPU_PERI_CLKACT = 0x1 + // .. .. .. ==> 0XF8000120[28:28] = 0x00000001U + // .. .. .. ==> MASK : 0x10000000U VAL : 0x10000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000120, 0x1F003F30U ,0x1F000200U), + // .. .. FINISH: ARM PLL INIT + // .. .. START: DDR PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000114[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x1db + // .. .. ==> 0XF8000114[21:12] = 0x000001DBU + // .. .. ==> MASK : 0x003FF000U VAL : 0x001DB000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x001DB2C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x15 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000015U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00015000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00015000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000104[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000104[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000104[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. DDR_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[1:1] = 0x00000001U + // .. .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000002U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000104[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. .. DDR_3XCLKACT = 0x1 + // .. .. .. ==> 0XF8000124[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. DDR_2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000124[1:1] = 0x00000001U + // .. .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. .. DDR_3XCLK_DIVISOR = 0x2 + // .. .. .. ==> 0XF8000124[25:20] = 0x00000002U + // .. .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. .. DDR_2XCLK_DIVISOR = 0x3 + // .. .. .. ==> 0XF8000124[31:26] = 0x00000003U + // .. .. .. ==> MASK : 0xFC000000U VAL : 0x0C000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000124, 0xFFF00003U ,0x0C200003U), + // .. .. FINISH: DDR PLL INIT + // .. .. START: IO PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000118[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000118[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x1f4 + // .. .. ==> 0XF8000118[21:12] = 0x000001F4U + // .. .. ==> MASK : 0x003FF000U VAL : 0x001F4000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001F42C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x14 + // .. .. .. ==> 0XF8000108[18:12] = 0x00000014U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00014000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x00014000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000108[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000108[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000108[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. IO_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[2:2] = 0x00000001U + // .. .. .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000004U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000108[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. FINISH: IO PLL INIT + // .. FINISH: PLL SLCR REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_clock_init_data_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0x34 + // .. ==> 0XF8000128[13:8] = 0x00000034U + // .. ==> MASK : 0x00003F00U VAL : 0x00003400U + // .. DIVISOR1 = 0x2 + // .. ==> 0XF8000128[25:20] = 0x00000002U + // .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00203401U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x5 + // .. ==> 0XF800014C[13:8] = 0x00000005U + // .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000501U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000150[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF8000150[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x14 + // .. ==> 0XF8000150[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00001401U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000154[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000154[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000154[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x14 + // .. ==> 0XF8000154[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00001403U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000168[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000168[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x5 + // .. ==> 0XF8000168[13:8] = 0x00000005U + // .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. + EMIT_MASKWRITE(0XF8000168, 0x00003F31U ,0x00000501U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000170[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xa + // .. ==> 0XF8000170[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00100A00U), + // .. SRCSEL = 0x3 + // .. ==> 0XF8000180[5:4] = 0x00000003U + // .. ==> MASK : 0x00000030U VAL : 0x00000030U + // .. DIVISOR0 = 0x6 + // .. ==> 0XF8000180[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00100630U), + // .. SRCSEL = 0x2 + // .. ==> 0XF8000190[5:4] = 0x00000002U + // .. ==> MASK : 0x00000030U VAL : 0x00000020U + // .. DIVISOR0 = 0x35 + // .. ==> 0XF8000190[13:8] = 0x00000035U + // .. ==> MASK : 0x00003F00U VAL : 0x00003500U + // .. DIVISOR1 = 0x2 + // .. ==> 0XF8000190[25:20] = 0x00000002U + // .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00203520U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xa + // .. ==> 0XF80001A0[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00100A00U), + // .. CLK_621_TRUE = 0x1 + // .. ==> 0XF80001C4[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XF80001C4, 0x00000001U ,0x00000001U), + // .. DMA_CPU_2XCLKACT = 0x1 + // .. ==> 0XF800012C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. USB0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. USB1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. GEM0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[6:6] = 0x00000001U + // .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. GEM1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. SDI0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[10:10] = 0x00000001U + // .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. SDI1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. SPI0_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. SPI1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[15:15] = 0x00000000U + // .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. CAN0_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. CAN1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. I2C0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[18:18] = 0x00000001U + // .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. I2C1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. UART0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[20:20] = 0x00000001U + // .. ==> MASK : 0x00100000U VAL : 0x00100000U + // .. UART1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[21:21] = 0x00000001U + // .. ==> MASK : 0x00200000U VAL : 0x00200000U + // .. GPIO_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[22:22] = 0x00000001U + // .. ==> MASK : 0x00400000U VAL : 0x00400000U + // .. LQSPI_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[23:23] = 0x00000001U + // .. ==> MASK : 0x00800000U VAL : 0x00800000U + // .. SMC_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[24:24] = 0x00000001U + // .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. + EMIT_MASKWRITE(0XF800012C, 0x01FFCCCDU ,0x01FC044DU), + // .. FINISH: CLOCK CONTROL SLCR REGISTERS + // .. START: THIS SHOULD BE BLANK + // .. FINISH: THIS SHOULD BE BLANK + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_ddr_init_data_1_0[] = { + // START: top + // .. START: DDR INITIALIZATION + // .. .. START: LOCK DDR + // .. .. reg_ddrc_soft_rstb = 0 + // .. .. ==> 0XF8006000[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_powerdown_en = 0x0 + // .. .. ==> 0XF8006000[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_ddrc_data_bus_width = 0x0 + // .. .. ==> 0XF8006000[3:2] = 0x00000000U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000000U + // .. .. reg_ddrc_burst8_refresh = 0x0 + // .. .. ==> 0XF8006000[6:4] = 0x00000000U + // .. .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. .. reg_ddrc_rdwr_idle_gap = 0x1 + // .. .. ==> 0XF8006000[13:7] = 0x00000001U + // .. .. ==> MASK : 0x00003F80U VAL : 0x00000080U + // .. .. reg_ddrc_dis_rd_bypass = 0x0 + // .. .. ==> 0XF8006000[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. reg_ddrc_dis_act_bypass = 0x0 + // .. .. ==> 0XF8006000[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. reg_ddrc_dis_auto_refresh = 0x0 + // .. .. ==> 0XF8006000[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006000, 0x0001FFFFU ,0x00000080U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x7f + // .. .. ==> 0XF8006004[11:0] = 0x0000007FU + // .. .. ==> MASK : 0x00000FFFU VAL : 0x0000007FU + // .. .. reg_ddrc_active_ranks = 0x1 + // .. .. ==> 0XF8006004[13:12] = 0x00000001U + // .. .. ==> MASK : 0x00003000U VAL : 0x00001000U + // .. .. reg_ddrc_addrmap_cs_bit0 = 0x0 + // .. .. ==> 0XF8006004[18:14] = 0x00000000U + // .. .. ==> MASK : 0x0007C000U VAL : 0x00000000U + // .. .. reg_ddrc_wr_odt_block = 0x1 + // .. .. ==> 0XF8006004[20:19] = 0x00000001U + // .. .. ==> MASK : 0x00180000U VAL : 0x00080000U + // .. .. reg_ddrc_diff_rank_rd_2cycle_gap = 0x0 + // .. .. ==> 0XF8006004[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_cs_bit1 = 0x0 + // .. .. ==> 0XF8006004[26:22] = 0x00000000U + // .. .. ==> MASK : 0x07C00000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_open_bank = 0x0 + // .. .. ==> 0XF8006004[27:27] = 0x00000000U + // .. .. ==> MASK : 0x08000000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_4bank_ram = 0x0 + // .. .. ==> 0XF8006004[28:28] = 0x00000000U + // .. .. ==> MASK : 0x10000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006004, 0x1FFFFFFFU ,0x0008107FU), + // .. .. reg_ddrc_hpr_min_non_critical_x32 = 0xf + // .. .. ==> 0XF8006008[10:0] = 0x0000000FU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000000FU + // .. .. reg_ddrc_hpr_max_starve_x32 = 0xf + // .. .. ==> 0XF8006008[21:11] = 0x0000000FU + // .. .. ==> MASK : 0x003FF800U VAL : 0x00007800U + // .. .. reg_ddrc_hpr_xact_run_length = 0xf + // .. .. ==> 0XF8006008[25:22] = 0x0000000FU + // .. .. ==> MASK : 0x03C00000U VAL : 0x03C00000U + // .. .. + EMIT_MASKWRITE(0XF8006008, 0x03FFFFFFU ,0x03C0780FU), + // .. .. reg_ddrc_lpr_min_non_critical_x32 = 0x1 + // .. .. ==> 0XF800600C[10:0] = 0x00000001U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000001U + // .. .. reg_ddrc_lpr_max_starve_x32 = 0x2 + // .. .. ==> 0XF800600C[21:11] = 0x00000002U + // .. .. ==> MASK : 0x003FF800U VAL : 0x00001000U + // .. .. reg_ddrc_lpr_xact_run_length = 0x8 + // .. .. ==> 0XF800600C[25:22] = 0x00000008U + // .. .. ==> MASK : 0x03C00000U VAL : 0x02000000U + // .. .. + EMIT_MASKWRITE(0XF800600C, 0x03FFFFFFU ,0x02001001U), + // .. .. reg_ddrc_w_min_non_critical_x32 = 0x1 + // .. .. ==> 0XF8006010[10:0] = 0x00000001U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000001U + // .. .. reg_ddrc_w_xact_run_length = 0x8 + // .. .. ==> 0XF8006010[14:11] = 0x00000008U + // .. .. ==> MASK : 0x00007800U VAL : 0x00004000U + // .. .. reg_ddrc_w_max_starve_x32 = 0x2 + // .. .. ==> 0XF8006010[25:15] = 0x00000002U + // .. .. ==> MASK : 0x03FF8000U VAL : 0x00010000U + // .. .. + EMIT_MASKWRITE(0XF8006010, 0x03FFFFFFU ,0x00014001U), + // .. .. reg_ddrc_t_rc = 0x1a + // .. .. ==> 0XF8006014[5:0] = 0x0000001AU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001AU + // .. .. reg_ddrc_t_rfc_min = 0x54 + // .. .. ==> 0XF8006014[13:6] = 0x00000054U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001500U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004151AU), + // .. .. reg_ddrc_wr2pre = 0x12 + // .. .. ==> 0XF8006018[4:0] = 0x00000012U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000012U + // .. .. reg_ddrc_powerdown_to_x32 = 0x6 + // .. .. ==> 0XF8006018[9:5] = 0x00000006U + // .. .. ==> MASK : 0x000003E0U VAL : 0x000000C0U + // .. .. reg_ddrc_t_faw = 0x15 + // .. .. ==> 0XF8006018[15:10] = 0x00000015U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005400U + // .. .. reg_ddrc_t_ras_max = 0x23 + // .. .. ==> 0XF8006018[21:16] = 0x00000023U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00230000U + // .. .. reg_ddrc_t_ras_min = 0x13 + // .. .. ==> 0XF8006018[26:22] = 0x00000013U + // .. .. ==> MASK : 0x07C00000U VAL : 0x04C00000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x44E354D2U), + // .. .. reg_ddrc_write_latency = 0x5 + // .. .. ==> 0XF800601C[4:0] = 0x00000005U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000005U + // .. .. reg_ddrc_rd2wr = 0x7 + // .. .. ==> 0XF800601C[9:5] = 0x00000007U + // .. .. ==> MASK : 0x000003E0U VAL : 0x000000E0U + // .. .. reg_ddrc_wr2rd = 0xe + // .. .. ==> 0XF800601C[14:10] = 0x0000000EU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003800U + // .. .. reg_ddrc_t_xp = 0x4 + // .. .. ==> 0XF800601C[19:15] = 0x00000004U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00020000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x4 + // .. .. ==> 0XF800601C[27:23] = 0x00000004U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02000000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x720238E5U), + // .. .. reg_ddrc_t_ccd = 0x4 + // .. .. ==> 0XF8006020[4:2] = 0x00000004U + // .. .. ==> MASK : 0x0000001CU VAL : 0x00000010U + // .. .. reg_ddrc_t_rrd = 0x6 + // .. .. ==> 0XF8006020[7:5] = 0x00000006U + // .. .. ==> MASK : 0x000000E0U VAL : 0x000000C0U + // .. .. reg_ddrc_refresh_margin = 0x2 + // .. .. ==> 0XF8006020[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. reg_ddrc_t_rp = 0x7 + // .. .. ==> 0XF8006020[15:12] = 0x00000007U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00007000U + // .. .. reg_ddrc_refresh_to_x32 = 0x8 + // .. .. ==> 0XF8006020[20:16] = 0x00000008U + // .. .. ==> MASK : 0x001F0000U VAL : 0x00080000U + // .. .. reg_ddrc_sdram = 0x1 + // .. .. ==> 0XF8006020[21:21] = 0x00000001U + // .. .. ==> MASK : 0x00200000U VAL : 0x00200000U + // .. .. reg_ddrc_mobile = 0x0 + // .. .. ==> 0XF8006020[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reg_ddrc_clock_stop_en = 0x0 + // .. .. ==> 0XF8006020[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reg_ddrc_read_latency = 0x7 + // .. .. ==> 0XF8006020[28:24] = 0x00000007U + // .. .. ==> MASK : 0x1F000000U VAL : 0x07000000U + // .. .. reg_phy_mode_ddr1_ddr2 = 0x1 + // .. .. ==> 0XF8006020[29:29] = 0x00000001U + // .. .. ==> MASK : 0x20000000U VAL : 0x20000000U + // .. .. reg_ddrc_dis_pad_pd = 0x0 + // .. .. ==> 0XF8006020[30:30] = 0x00000000U + // .. .. ==> MASK : 0x40000000U VAL : 0x00000000U + // .. .. reg_ddrc_loopback = 0x0 + // .. .. ==> 0XF8006020[31:31] = 0x00000000U + // .. .. ==> MASK : 0x80000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006020, 0xFFFFFFFCU ,0x272872D0U), + // .. .. reg_ddrc_en_2t_timing_mode = 0x0 + // .. .. ==> 0XF8006024[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_prefer_write = 0x0 + // .. .. ==> 0XF8006024[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_ddrc_max_rank_rd = 0xf + // .. .. ==> 0XF8006024[5:2] = 0x0000000FU + // .. .. ==> MASK : 0x0000003CU VAL : 0x0000003CU + // .. .. reg_ddrc_mr_wr = 0x0 + // .. .. ==> 0XF8006024[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. reg_ddrc_mr_addr = 0x0 + // .. .. ==> 0XF8006024[8:7] = 0x00000000U + // .. .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. .. reg_ddrc_mr_data = 0x0 + // .. .. ==> 0XF8006024[24:9] = 0x00000000U + // .. .. ==> MASK : 0x01FFFE00U VAL : 0x00000000U + // .. .. ddrc_reg_mr_wr_busy = 0x0 + // .. .. ==> 0XF8006024[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reg_ddrc_mr_type = 0x0 + // .. .. ==> 0XF8006024[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. reg_ddrc_mr_rdata_valid = 0x0 + // .. .. ==> 0XF8006024[27:27] = 0x00000000U + // .. .. ==> MASK : 0x08000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006024, 0x0FFFFFFFU ,0x0000003CU), + // .. .. reg_ddrc_final_wait_x32 = 0x7 + // .. .. ==> 0XF8006028[6:0] = 0x00000007U + // .. .. ==> MASK : 0x0000007FU VAL : 0x00000007U + // .. .. reg_ddrc_pre_ocd_x32 = 0x0 + // .. .. ==> 0XF8006028[10:7] = 0x00000000U + // .. .. ==> MASK : 0x00000780U VAL : 0x00000000U + // .. .. reg_ddrc_t_mrd = 0x4 + // .. .. ==> 0XF8006028[13:11] = 0x00000004U + // .. .. ==> MASK : 0x00003800U VAL : 0x00002000U + // .. .. + EMIT_MASKWRITE(0XF8006028, 0x00003FFFU ,0x00002007U), + // .. .. reg_ddrc_emr2 = 0x8 + // .. .. ==> 0XF800602C[15:0] = 0x00000008U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000008U + // .. .. reg_ddrc_emr3 = 0x0 + // .. .. ==> 0XF800602C[31:16] = 0x00000000U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800602C, 0xFFFFFFFFU ,0x00000008U), + // .. .. reg_ddrc_mr = 0x930 + // .. .. ==> 0XF8006030[15:0] = 0x00000930U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000930U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040930U), + // .. .. reg_ddrc_burst_rdwr = 0x4 + // .. .. ==> 0XF8006034[3:0] = 0x00000004U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000004U + // .. .. reg_ddrc_pre_cke_x1024 = 0x101 + // .. .. ==> 0XF8006034[13:4] = 0x00000101U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001010U + // .. .. reg_ddrc_post_cke_x1024 = 0x1 + // .. .. ==> 0XF8006034[25:16] = 0x00000001U + // .. .. ==> MASK : 0x03FF0000U VAL : 0x00010000U + // .. .. reg_ddrc_burstchop = 0x0 + // .. .. ==> 0XF8006034[28:28] = 0x00000000U + // .. .. ==> MASK : 0x10000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006034, 0x13FF3FFFU ,0x00011014U), + // .. .. reg_ddrc_force_low_pri_n = 0x0 + // .. .. ==> 0XF8006038[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_dis_dq = 0x0 + // .. .. ==> 0XF8006038[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_phy_debug_mode = 0x0 + // .. .. ==> 0XF8006038[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. reg_phy_wr_level_start = 0x0 + // .. .. ==> 0XF8006038[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. reg_phy_rd_level_start = 0x0 + // .. .. ==> 0XF8006038[8:8] = 0x00000000U + // .. .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. .. reg_phy_dq0_wait_t = 0x0 + // .. .. ==> 0XF8006038[12:9] = 0x00000000U + // .. .. ==> MASK : 0x00001E00U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006038, 0x00001FC3U ,0x00000000U), + // .. .. reg_ddrc_addrmap_bank_b0 = 0x7 + // .. .. ==> 0XF800603C[3:0] = 0x00000007U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000007U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x7 + // .. .. ==> 0XF800603C[7:4] = 0x00000007U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000070U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x7 + // .. .. ==> 0XF800603C[11:8] = 0x00000007U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000700U + // .. .. reg_ddrc_addrmap_col_b5 = 0x0 + // .. .. ==> 0XF800603C[15:12] = 0x00000000U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b6 = 0x0 + // .. .. ==> 0XF800603C[19:16] = 0x00000000U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800603C, 0x000FFFFFU ,0x00000777U), + // .. .. reg_ddrc_addrmap_col_b2 = 0x0 + // .. .. ==> 0XF8006040[3:0] = 0x00000000U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b3 = 0x0 + // .. .. ==> 0XF8006040[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b4 = 0x0 + // .. .. ==> 0XF8006040[11:8] = 0x00000000U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b7 = 0x0 + // .. .. ==> 0XF8006040[15:12] = 0x00000000U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b8 = 0x0 + // .. .. ==> 0XF8006040[19:16] = 0x00000000U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b9 = 0xf + // .. .. ==> 0XF8006040[23:20] = 0x0000000FU + // .. .. ==> MASK : 0x00F00000U VAL : 0x00F00000U + // .. .. reg_ddrc_addrmap_col_b10 = 0xf + // .. .. ==> 0XF8006040[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. reg_ddrc_addrmap_col_b11 = 0xf + // .. .. ==> 0XF8006040[31:28] = 0x0000000FU + // .. .. ==> MASK : 0xF0000000U VAL : 0xF0000000U + // .. .. + EMIT_MASKWRITE(0XF8006040, 0xFFFFFFFFU ,0xFFF00000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x6 + // .. .. ==> 0XF8006044[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_row_b1 = 0x6 + // .. .. ==> 0XF8006044[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x6 + // .. .. ==> 0XF8006044[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. reg_ddrc_addrmap_row_b12 = 0x6 + // .. .. ==> 0XF8006044[15:12] = 0x00000006U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00006000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x6 + // .. .. ==> 0XF8006044[19:16] = 0x00000006U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00060000U + // .. .. reg_ddrc_addrmap_row_b14 = 0xf + // .. .. ==> 0XF8006044[23:20] = 0x0000000FU + // .. .. ==> MASK : 0x00F00000U VAL : 0x00F00000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0FF66666U), + // .. .. reg_ddrc_rank0_rd_odt = 0x0 + // .. .. ==> 0XF8006048[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. reg_ddrc_rank0_wr_odt = 0x1 + // .. .. ==> 0XF8006048[5:3] = 0x00000001U + // .. .. ==> MASK : 0x00000038U VAL : 0x00000008U + // .. .. reg_ddrc_rank1_rd_odt = 0x1 + // .. .. ==> 0XF8006048[8:6] = 0x00000001U + // .. .. ==> MASK : 0x000001C0U VAL : 0x00000040U + // .. .. reg_ddrc_rank1_wr_odt = 0x1 + // .. .. ==> 0XF8006048[11:9] = 0x00000001U + // .. .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. .. reg_phy_rd_local_odt = 0x0 + // .. .. ==> 0XF8006048[13:12] = 0x00000000U + // .. .. ==> MASK : 0x00003000U VAL : 0x00000000U + // .. .. reg_phy_wr_local_odt = 0x3 + // .. .. ==> 0XF8006048[15:14] = 0x00000003U + // .. .. ==> MASK : 0x0000C000U VAL : 0x0000C000U + // .. .. reg_phy_idle_local_odt = 0x3 + // .. .. ==> 0XF8006048[17:16] = 0x00000003U + // .. .. ==> MASK : 0x00030000U VAL : 0x00030000U + // .. .. reg_ddrc_rank2_rd_odt = 0x0 + // .. .. ==> 0XF8006048[20:18] = 0x00000000U + // .. .. ==> MASK : 0x001C0000U VAL : 0x00000000U + // .. .. reg_ddrc_rank2_wr_odt = 0x0 + // .. .. ==> 0XF8006048[23:21] = 0x00000000U + // .. .. ==> MASK : 0x00E00000U VAL : 0x00000000U + // .. .. reg_ddrc_rank3_rd_odt = 0x0 + // .. .. ==> 0XF8006048[26:24] = 0x00000000U + // .. .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. .. reg_ddrc_rank3_wr_odt = 0x0 + // .. .. ==> 0XF8006048[29:27] = 0x00000000U + // .. .. ==> MASK : 0x38000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x3FFFFFFFU ,0x0003C248U), + // .. .. reg_phy_rd_cmd_to_data = 0x0 + // .. .. ==> 0XF8006050[3:0] = 0x00000000U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. .. reg_phy_wr_cmd_to_data = 0x0 + // .. .. ==> 0XF8006050[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_phy_rdc_we_to_re_delay = 0x8 + // .. .. ==> 0XF8006050[11:8] = 0x00000008U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000800U + // .. .. reg_phy_rdc_fifo_rst_disable = 0x0 + // .. .. ==> 0XF8006050[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. reg_phy_use_fixed_re = 0x1 + // .. .. ==> 0XF8006050[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. reg_phy_rdc_fifo_rst_err_cnt_clr = 0x0 + // .. .. ==> 0XF8006050[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_phy_dis_phy_ctrl_rstn = 0x0 + // .. .. ==> 0XF8006050[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. reg_phy_clk_stall_level = 0x0 + // .. .. ==> 0XF8006050[19:19] = 0x00000000U + // .. .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. .. reg_phy_gatelvl_num_of_dq0 = 0x7 + // .. .. ==> 0XF8006050[27:24] = 0x00000007U + // .. .. ==> MASK : 0x0F000000U VAL : 0x07000000U + // .. .. reg_phy_wrlvl_num_of_dq0 = 0x7 + // .. .. ==> 0XF8006050[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF8006050, 0xFF0F8FFFU ,0x77010800U), + // .. .. reg_ddrc_dll_calib_to_min_x1024 = 0x1 + // .. .. ==> 0XF8006058[7:0] = 0x00000001U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000001U + // .. .. reg_ddrc_dll_calib_to_max_x1024 = 0x1 + // .. .. ==> 0XF8006058[15:8] = 0x00000001U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00000100U + // .. .. reg_ddrc_dis_dll_calib = 0x0 + // .. .. ==> 0XF8006058[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006058, 0x0001FFFFU ,0x00000101U), + // .. .. reg_ddrc_rd_odt_delay = 0x3 + // .. .. ==> 0XF800605C[3:0] = 0x00000003U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000003U + // .. .. reg_ddrc_wr_odt_delay = 0x0 + // .. .. ==> 0XF800605C[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_ddrc_rd_odt_hold = 0x0 + // .. .. ==> 0XF800605C[11:8] = 0x00000000U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000000U + // .. .. reg_ddrc_wr_odt_hold = 0x5 + // .. .. ==> 0XF800605C[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. + EMIT_MASKWRITE(0XF800605C, 0x0000FFFFU ,0x00005003U), + // .. .. reg_ddrc_pageclose = 0x0 + // .. .. ==> 0XF8006060[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_lpr_num_entries = 0x1f + // .. .. ==> 0XF8006060[6:1] = 0x0000001FU + // .. .. ==> MASK : 0x0000007EU VAL : 0x0000003EU + // .. .. reg_ddrc_auto_pre_en = 0x0 + // .. .. ==> 0XF8006060[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. reg_ddrc_refresh_update_level = 0x0 + // .. .. ==> 0XF8006060[8:8] = 0x00000000U + // .. .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. .. reg_ddrc_dis_wc = 0x0 + // .. .. ==> 0XF8006060[9:9] = 0x00000000U + // .. .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. .. reg_ddrc_dis_collision_page_opt = 0x0 + // .. .. ==> 0XF8006060[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_ddrc_selfref_en = 0x0 + // .. .. ==> 0XF8006060[12:12] = 0x00000000U + // .. .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006060, 0x000017FFU ,0x0000003EU), + // .. .. reg_ddrc_go2critical_hysteresis = 0x0 + // .. .. ==> 0XF8006064[12:5] = 0x00000000U + // .. .. ==> MASK : 0x00001FE0U VAL : 0x00000000U + // .. .. reg_arb_go2critical_en = 0x1 + // .. .. ==> 0XF8006064[17:17] = 0x00000001U + // .. .. ==> MASK : 0x00020000U VAL : 0x00020000U + // .. .. + EMIT_MASKWRITE(0XF8006064, 0x00021FE0U ,0x00020000U), + // .. .. reg_ddrc_wrlvl_ww = 0x41 + // .. .. ==> 0XF8006068[7:0] = 0x00000041U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000041U + // .. .. reg_ddrc_rdlvl_rr = 0x41 + // .. .. ==> 0XF8006068[15:8] = 0x00000041U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00004100U + // .. .. reg_ddrc_dfi_t_wlmrd = 0x28 + // .. .. ==> 0XF8006068[25:16] = 0x00000028U + // .. .. ==> MASK : 0x03FF0000U VAL : 0x00280000U + // .. .. + EMIT_MASKWRITE(0XF8006068, 0x03FFFFFFU ,0x00284141U), + // .. .. dfi_t_ctrlupd_interval_min_x1024 = 0x10 + // .. .. ==> 0XF800606C[7:0] = 0x00000010U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000010U + // .. .. dfi_t_ctrlupd_interval_max_x1024 = 0x16 + // .. .. ==> 0XF800606C[15:8] = 0x00000016U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00001600U + // .. .. + EMIT_MASKWRITE(0XF800606C, 0x0000FFFFU ,0x00001610U), + // .. .. refresh_timer0_start_value_x32 = 0x0 + // .. .. ==> 0XF80060A0[11:0] = 0x00000000U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000000U + // .. .. refresh_timer1_start_value_x32 = 0x8 + // .. .. ==> 0XF80060A0[23:12] = 0x00000008U + // .. .. ==> MASK : 0x00FFF000U VAL : 0x00008000U + // .. .. + EMIT_MASKWRITE(0XF80060A0, 0x00FFFFFFU ,0x00008000U), + // .. .. reg_ddrc_dis_auto_zq = 0x0 + // .. .. ==> 0XF80060A4[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_ddr3 = 0x1 + // .. .. ==> 0XF80060A4[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. reg_ddrc_t_mod = 0x200 + // .. .. ==> 0XF80060A4[11:2] = 0x00000200U + // .. .. ==> MASK : 0x00000FFCU VAL : 0x00000800U + // .. .. reg_ddrc_t_zq_long_nop = 0x200 + // .. .. ==> 0XF80060A4[21:12] = 0x00000200U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00200000U + // .. .. reg_ddrc_t_zq_short_nop = 0x40 + // .. .. ==> 0XF80060A4[31:22] = 0x00000040U + // .. .. ==> MASK : 0xFFC00000U VAL : 0x10000000U + // .. .. + EMIT_MASKWRITE(0XF80060A4, 0xFFFFFFFFU ,0x10200802U), + // .. .. t_zq_short_interval_x1024 = 0xc845 + // .. .. ==> 0XF80060A8[19:0] = 0x0000C845U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000C845U + // .. .. dram_rstn_x1024 = 0x67 + // .. .. ==> 0XF80060A8[27:20] = 0x00000067U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06700000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0670C845U), + // .. .. deeppowerdown_en = 0x0 + // .. .. ==> 0XF80060AC[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. deeppowerdown_to_x1024 = 0xff + // .. .. ==> 0XF80060AC[8:1] = 0x000000FFU + // .. .. ==> MASK : 0x000001FEU VAL : 0x000001FEU + // .. .. + EMIT_MASKWRITE(0XF80060AC, 0x000001FFU ,0x000001FEU), + // .. .. dfi_wrlvl_max_x1024 = 0xfff + // .. .. ==> 0XF80060B0[11:0] = 0x00000FFFU + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000FFFU + // .. .. dfi_rdlvl_max_x1024 = 0xfff + // .. .. ==> 0XF80060B0[23:12] = 0x00000FFFU + // .. .. ==> MASK : 0x00FFF000U VAL : 0x00FFF000U + // .. .. ddrc_reg_twrlvl_max_error = 0x0 + // .. .. ==> 0XF80060B0[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. ddrc_reg_trdlvl_max_error = 0x0 + // .. .. ==> 0XF80060B0[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reg_ddrc_dfi_wr_level_en = 0x1 + // .. .. ==> 0XF80060B0[26:26] = 0x00000001U + // .. .. ==> MASK : 0x04000000U VAL : 0x04000000U + // .. .. reg_ddrc_dfi_rd_dqs_gate_level = 0x1 + // .. .. ==> 0XF80060B0[27:27] = 0x00000001U + // .. .. ==> MASK : 0x08000000U VAL : 0x08000000U + // .. .. reg_ddrc_dfi_rd_data_eye_train = 0x1 + // .. .. ==> 0XF80060B0[28:28] = 0x00000001U + // .. .. ==> MASK : 0x10000000U VAL : 0x10000000U + // .. .. + EMIT_MASKWRITE(0XF80060B0, 0x1FFFFFFFU ,0x1CFFFFFFU), + // .. .. reg_ddrc_2t_delay = 0x0 + // .. .. ==> 0XF80060B4[8:0] = 0x00000000U + // .. .. ==> MASK : 0x000001FFU VAL : 0x00000000U + // .. .. reg_ddrc_skip_ocd = 0x1 + // .. .. ==> 0XF80060B4[9:9] = 0x00000001U + // .. .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. .. reg_ddrc_dis_pre_bypass = 0x0 + // .. .. ==> 0XF80060B4[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF80060B4, 0x000007FFU ,0x00000200U), + // .. .. reg_ddrc_dfi_t_rddata_en = 0x6 + // .. .. ==> 0XF80060B8[4:0] = 0x00000006U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000006U + // .. .. reg_ddrc_dfi_t_ctrlup_min = 0x3 + // .. .. ==> 0XF80060B8[14:5] = 0x00000003U + // .. .. ==> MASK : 0x00007FE0U VAL : 0x00000060U + // .. .. reg_ddrc_dfi_t_ctrlup_max = 0x40 + // .. .. ==> 0XF80060B8[24:15] = 0x00000040U + // .. .. ==> MASK : 0x01FF8000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF80060B8, 0x01FFFFFFU ,0x00200066U), + // .. .. Clear_Uncorrectable_DRAM_ECC_error = 1 + // .. .. ==> 0XF80060C4[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. Clear_Correctable_DRAM_ECC_error = 1 + // .. .. ==> 0XF80060C4[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. + EMIT_MASKWRITE(0XF80060C4, 0x00000003U ,0x00000003U), + // .. FINISH: DDR INITIALIZATION + // .. Clear_Uncorrectable_DRAM_ECC_error = 0x0 + // .. ==> 0XF80060C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. Clear_Correctable_DRAM_ECC_error = 0x0 + // .. ==> 0XF80060C4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80060C4, 0x00000003U ,0x00000000U), + // .. CORR_ECC_LOG_VALID = 0x0 + // .. ==> 0XF80060C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. ECC_CORRECTED_BIT_NUM = 0x0 + // .. ==> 0XF80060C8[7:1] = 0x00000000U + // .. ==> MASK : 0x000000FEU VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80060C8, 0x000000FFU ,0x00000000U), + // .. UNCORR_ECC_LOG_VALID = 0x0 + // .. ==> 0XF80060DC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80060DC, 0x00000001U ,0x00000000U), + // .. STAT_NUM_CORR_ERR = 0x0 + // .. ==> 0XF80060F0[15:8] = 0x00000000U + // .. ==> MASK : 0x0000FF00U VAL : 0x00000000U + // .. STAT_NUM_UNCORR_ERR = 0x0 + // .. ==> 0XF80060F0[7:0] = 0x00000000U + // .. ==> MASK : 0x000000FFU VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80060F0, 0x0000FFFFU ,0x00000000U), + // .. reg_ddrc_ecc_mode = 0x0 + // .. ==> 0XF80060F4[2:0] = 0x00000000U + // .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. reg_ddrc_dis_scrub = 0x1 + // .. ==> 0XF80060F4[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. + EMIT_MASKWRITE(0XF80060F4, 0x0000000FU ,0x00000008U), + // .. reg_phy_dif_on = 0x0 + // .. ==> 0XF8006114[3:0] = 0x00000000U + // .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. reg_phy_dif_off = 0x0 + // .. ==> 0XF8006114[7:4] = 0x00000000U + // .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006114, 0x000000FFU ,0x00000000U), + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF8006118[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF8006118[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF8006118[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF8006118[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF8006118[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF8006118[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF8006118[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF8006118[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF8006118[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. + EMIT_MASKWRITE(0XF8006118, 0x7FFFFFFFU ,0x40000001U), + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF800611C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF800611C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF800611C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF800611C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF800611C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF800611C[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF800611C[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF800611C[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF800611C[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. + EMIT_MASKWRITE(0XF800611C, 0x7FFFFFFFU ,0x40000001U), + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF8006120[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF8006120[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF8006120[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF8006120[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF8006120[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF8006120[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF8006120[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF8006120[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF8006120[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. + EMIT_MASKWRITE(0XF8006120, 0x7FFFFFFFU ,0x40000001U), + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF8006124[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF8006124[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF8006124[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF8006124[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF8006124[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF8006124[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF8006124[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF8006124[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF8006124[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. + EMIT_MASKWRITE(0XF8006124, 0x7FFFFFFFU ,0x40000001U), + // .. reg_phy_wrlvl_init_ratio = 0x0 + // .. ==> 0XF800612C[9:0] = 0x00000000U + // .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. reg_phy_gatelvl_init_ratio = 0x8f + // .. ==> 0XF800612C[19:10] = 0x0000008FU + // .. ==> MASK : 0x000FFC00U VAL : 0x00023C00U + // .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00023C00U), + // .. reg_phy_wrlvl_init_ratio = 0x0 + // .. ==> 0XF8006130[9:0] = 0x00000000U + // .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. reg_phy_gatelvl_init_ratio = 0x8a + // .. ==> 0XF8006130[19:10] = 0x0000008AU + // .. ==> MASK : 0x000FFC00U VAL : 0x00022800U + // .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00022800U), + // .. reg_phy_wrlvl_init_ratio = 0x0 + // .. ==> 0XF8006134[9:0] = 0x00000000U + // .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. reg_phy_gatelvl_init_ratio = 0x8b + // .. ==> 0XF8006134[19:10] = 0x0000008BU + // .. ==> MASK : 0x000FFC00U VAL : 0x00022C00U + // .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00022C00U), + // .. reg_phy_wrlvl_init_ratio = 0x0 + // .. ==> 0XF8006138[9:0] = 0x00000000U + // .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. reg_phy_gatelvl_init_ratio = 0x92 + // .. ==> 0XF8006138[19:10] = 0x00000092U + // .. ==> MASK : 0x000FFC00U VAL : 0x00024800U + // .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00024800U), + // .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. ==> 0XF8006140[9:0] = 0x00000035U + // .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. reg_phy_rd_dqs_slave_force = 0x0 + // .. ==> 0XF8006140[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. ==> 0XF8006140[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006140, 0x000FFFFFU ,0x00000035U), + // .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. ==> 0XF8006144[9:0] = 0x00000035U + // .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. reg_phy_rd_dqs_slave_force = 0x0 + // .. ==> 0XF8006144[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. ==> 0XF8006144[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006144, 0x000FFFFFU ,0x00000035U), + // .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. ==> 0XF8006148[9:0] = 0x00000035U + // .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. reg_phy_rd_dqs_slave_force = 0x0 + // .. ==> 0XF8006148[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. ==> 0XF8006148[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006148, 0x000FFFFFU ,0x00000035U), + // .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. ==> 0XF800614C[9:0] = 0x00000035U + // .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. reg_phy_rd_dqs_slave_force = 0x0 + // .. ==> 0XF800614C[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. ==> 0XF800614C[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800614C, 0x000FFFFFU ,0x00000035U), + // .. reg_phy_wr_dqs_slave_ratio = 0x77 + // .. ==> 0XF8006154[9:0] = 0x00000077U + // .. ==> MASK : 0x000003FFU VAL : 0x00000077U + // .. reg_phy_wr_dqs_slave_force = 0x0 + // .. ==> 0XF8006154[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. ==> 0XF8006154[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006154, 0x000FFFFFU ,0x00000077U), + // .. reg_phy_wr_dqs_slave_ratio = 0x7c + // .. ==> 0XF8006158[9:0] = 0x0000007CU + // .. ==> MASK : 0x000003FFU VAL : 0x0000007CU + // .. reg_phy_wr_dqs_slave_force = 0x0 + // .. ==> 0XF8006158[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. ==> 0XF8006158[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006158, 0x000FFFFFU ,0x0000007CU), + // .. reg_phy_wr_dqs_slave_ratio = 0x7c + // .. ==> 0XF800615C[9:0] = 0x0000007CU + // .. ==> MASK : 0x000003FFU VAL : 0x0000007CU + // .. reg_phy_wr_dqs_slave_force = 0x0 + // .. ==> 0XF800615C[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. ==> 0XF800615C[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800615C, 0x000FFFFFU ,0x0000007CU), + // .. reg_phy_wr_dqs_slave_ratio = 0x75 + // .. ==> 0XF8006160[9:0] = 0x00000075U + // .. ==> MASK : 0x000003FFU VAL : 0x00000075U + // .. reg_phy_wr_dqs_slave_force = 0x0 + // .. ==> 0XF8006160[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. ==> 0XF8006160[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006160, 0x000FFFFFU ,0x00000075U), + // .. reg_phy_fifo_we_slave_ratio = 0xe4 + // .. ==> 0XF8006168[10:0] = 0x000000E4U + // .. ==> MASK : 0x000007FFU VAL : 0x000000E4U + // .. reg_phy_fifo_we_in_force = 0x0 + // .. ==> 0XF8006168[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reg_phy_fifo_we_in_delay = 0x0 + // .. ==> 0XF8006168[20:12] = 0x00000000U + // .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006168, 0x001FFFFFU ,0x000000E4U), + // .. reg_phy_fifo_we_slave_ratio = 0xdf + // .. ==> 0XF800616C[10:0] = 0x000000DFU + // .. ==> MASK : 0x000007FFU VAL : 0x000000DFU + // .. reg_phy_fifo_we_in_force = 0x0 + // .. ==> 0XF800616C[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reg_phy_fifo_we_in_delay = 0x0 + // .. ==> 0XF800616C[20:12] = 0x00000000U + // .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800616C, 0x001FFFFFU ,0x000000DFU), + // .. reg_phy_fifo_we_slave_ratio = 0xe0 + // .. ==> 0XF8006170[10:0] = 0x000000E0U + // .. ==> MASK : 0x000007FFU VAL : 0x000000E0U + // .. reg_phy_fifo_we_in_force = 0x0 + // .. ==> 0XF8006170[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reg_phy_fifo_we_in_delay = 0x0 + // .. ==> 0XF8006170[20:12] = 0x00000000U + // .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006170, 0x001FFFFFU ,0x000000E0U), + // .. reg_phy_fifo_we_slave_ratio = 0xe7 + // .. ==> 0XF8006174[10:0] = 0x000000E7U + // .. ==> MASK : 0x000007FFU VAL : 0x000000E7U + // .. reg_phy_fifo_we_in_force = 0x0 + // .. ==> 0XF8006174[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reg_phy_fifo_we_in_delay = 0x0 + // .. ==> 0XF8006174[20:12] = 0x00000000U + // .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006174, 0x001FFFFFU ,0x000000E7U), + // .. reg_phy_wr_data_slave_ratio = 0xb7 + // .. ==> 0XF800617C[9:0] = 0x000000B7U + // .. ==> MASK : 0x000003FFU VAL : 0x000000B7U + // .. reg_phy_wr_data_slave_force = 0x0 + // .. ==> 0XF800617C[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_data_slave_delay = 0x0 + // .. ==> 0XF800617C[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800617C, 0x000FFFFFU ,0x000000B7U), + // .. reg_phy_wr_data_slave_ratio = 0xbc + // .. ==> 0XF8006180[9:0] = 0x000000BCU + // .. ==> MASK : 0x000003FFU VAL : 0x000000BCU + // .. reg_phy_wr_data_slave_force = 0x0 + // .. ==> 0XF8006180[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_data_slave_delay = 0x0 + // .. ==> 0XF8006180[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006180, 0x000FFFFFU ,0x000000BCU), + // .. reg_phy_wr_data_slave_ratio = 0xbc + // .. ==> 0XF8006184[9:0] = 0x000000BCU + // .. ==> MASK : 0x000003FFU VAL : 0x000000BCU + // .. reg_phy_wr_data_slave_force = 0x0 + // .. ==> 0XF8006184[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_data_slave_delay = 0x0 + // .. ==> 0XF8006184[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006184, 0x000FFFFFU ,0x000000BCU), + // .. reg_phy_wr_data_slave_ratio = 0xb5 + // .. ==> 0XF8006188[9:0] = 0x000000B5U + // .. ==> MASK : 0x000003FFU VAL : 0x000000B5U + // .. reg_phy_wr_data_slave_force = 0x0 + // .. ==> 0XF8006188[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_data_slave_delay = 0x0 + // .. ==> 0XF8006188[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006188, 0x000FFFFFU ,0x000000B5U), + // .. reg_phy_loopback = 0x0 + // .. ==> 0XF8006190[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. reg_phy_bl2 = 0x0 + // .. ==> 0XF8006190[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_at_spd_atpg = 0x0 + // .. ==> 0XF8006190[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_bist_enable = 0x0 + // .. ==> 0XF8006190[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_bist_force_err = 0x0 + // .. ==> 0XF8006190[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_bist_mode = 0x0 + // .. ==> 0XF8006190[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. reg_phy_invert_clkout = 0x1 + // .. ==> 0XF8006190[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. reg_phy_all_dq_mpr_rd_resp = 0x0 + // .. ==> 0XF8006190[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. reg_phy_sel_logic = 0x0 + // .. ==> 0XF8006190[9:9] = 0x00000000U + // .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. reg_phy_ctrl_slave_ratio = 0x100 + // .. ==> 0XF8006190[19:10] = 0x00000100U + // .. ==> MASK : 0x000FFC00U VAL : 0x00040000U + // .. reg_phy_ctrl_slave_force = 0x0 + // .. ==> 0XF8006190[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. reg_phy_ctrl_slave_delay = 0x0 + // .. ==> 0XF8006190[27:21] = 0x00000000U + // .. ==> MASK : 0x0FE00000U VAL : 0x00000000U + // .. reg_phy_use_rank0_delays = 0x1 + // .. ==> 0XF8006190[28:28] = 0x00000001U + // .. ==> MASK : 0x10000000U VAL : 0x10000000U + // .. reg_phy_lpddr = 0x0 + // .. ==> 0XF8006190[29:29] = 0x00000000U + // .. ==> MASK : 0x20000000U VAL : 0x00000000U + // .. reg_phy_cmd_latency = 0x0 + // .. ==> 0XF8006190[30:30] = 0x00000000U + // .. ==> MASK : 0x40000000U VAL : 0x00000000U + // .. reg_phy_int_lpbk = 0x0 + // .. ==> 0XF8006190[31:31] = 0x00000000U + // .. ==> MASK : 0x80000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006190, 0xFFFFFFFFU ,0x10040080U), + // .. reg_phy_wr_rl_delay = 0x2 + // .. ==> 0XF8006194[4:0] = 0x00000002U + // .. ==> MASK : 0x0000001FU VAL : 0x00000002U + // .. reg_phy_rd_rl_delay = 0x4 + // .. ==> 0XF8006194[9:5] = 0x00000004U + // .. ==> MASK : 0x000003E0U VAL : 0x00000080U + // .. reg_phy_dll_lock_diff = 0xf + // .. ==> 0XF8006194[13:10] = 0x0000000FU + // .. ==> MASK : 0x00003C00U VAL : 0x00003C00U + // .. reg_phy_use_wr_level = 0x1 + // .. ==> 0XF8006194[14:14] = 0x00000001U + // .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. reg_phy_use_rd_dqs_gate_level = 0x1 + // .. ==> 0XF8006194[15:15] = 0x00000001U + // .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. reg_phy_use_rd_data_eye_level = 0x1 + // .. ==> 0XF8006194[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. reg_phy_dis_calib_rst = 0x0 + // .. ==> 0XF8006194[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_phy_ctrl_slave_delay = 0x0 + // .. ==> 0XF8006194[19:18] = 0x00000000U + // .. ==> MASK : 0x000C0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006194, 0x000FFFFFU ,0x0001FC82U), + // .. reg_arb_page_addr_mask = 0x0 + // .. ==> 0XF8006204[31:0] = 0x00000000U + // .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006204, 0xFFFFFFFFU ,0x00000000U), + // .. reg_arb_pri_wr_portn = 0x3ff + // .. ==> 0XF8006208[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_wr_portn = 0x0 + // .. ==> 0XF8006208[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. ==> 0XF8006208[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. ==> 0XF8006208[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_dis_rmw_portn = 0x1 + // .. ==> 0XF8006208[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XF8006208, 0x000F03FFU ,0x000803FFU), + // .. reg_arb_pri_wr_portn = 0x3ff + // .. ==> 0XF800620C[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_wr_portn = 0x0 + // .. ==> 0XF800620C[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. ==> 0XF800620C[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. ==> 0XF800620C[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_dis_rmw_portn = 0x1 + // .. ==> 0XF800620C[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XF800620C, 0x000F03FFU ,0x000803FFU), + // .. reg_arb_pri_wr_portn = 0x3ff + // .. ==> 0XF8006210[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_wr_portn = 0x0 + // .. ==> 0XF8006210[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. ==> 0XF8006210[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. ==> 0XF8006210[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_dis_rmw_portn = 0x1 + // .. ==> 0XF8006210[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XF8006210, 0x000F03FFU ,0x000803FFU), + // .. reg_arb_pri_wr_portn = 0x3ff + // .. ==> 0XF8006214[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_wr_portn = 0x0 + // .. ==> 0XF8006214[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. ==> 0XF8006214[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. ==> 0XF8006214[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_dis_rmw_portn = 0x1 + // .. ==> 0XF8006214[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XF8006214, 0x000F03FFU ,0x000803FFU), + // .. reg_arb_pri_rd_portn = 0x3ff + // .. ==> 0XF8006218[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_rd_portn = 0x0 + // .. ==> 0XF8006218[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. ==> 0XF8006218[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. ==> 0XF8006218[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_set_hpr_rd_portn = 0x0 + // .. ==> 0XF8006218[19:19] = 0x00000000U + // .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006218, 0x000F03FFU ,0x000003FFU), + // .. reg_arb_pri_rd_portn = 0x3ff + // .. ==> 0XF800621C[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_rd_portn = 0x0 + // .. ==> 0XF800621C[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. ==> 0XF800621C[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. ==> 0XF800621C[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_set_hpr_rd_portn = 0x0 + // .. ==> 0XF800621C[19:19] = 0x00000000U + // .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800621C, 0x000F03FFU ,0x000003FFU), + // .. reg_arb_pri_rd_portn = 0x3ff + // .. ==> 0XF8006220[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_rd_portn = 0x0 + // .. ==> 0XF8006220[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. ==> 0XF8006220[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. ==> 0XF8006220[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_set_hpr_rd_portn = 0x0 + // .. ==> 0XF8006220[19:19] = 0x00000000U + // .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006220, 0x000F03FFU ,0x000003FFU), + // .. reg_arb_pri_rd_portn = 0x3ff + // .. ==> 0XF8006224[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_rd_portn = 0x0 + // .. ==> 0XF8006224[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. ==> 0XF8006224[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. ==> 0XF8006224[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_set_hpr_rd_portn = 0x0 + // .. ==> 0XF8006224[19:19] = 0x00000000U + // .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006224, 0x000F03FFU ,0x000003FFU), + // .. reg_ddrc_lpddr2 = 0x0 + // .. ==> 0XF80062A8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. reg_ddrc_per_bank_refresh = 0x0 + // .. ==> 0XF80062A8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_ddrc_derate_enable = 0x0 + // .. ==> 0XF80062A8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_ddrc_mr4_margin = 0x0 + // .. ==> 0XF80062A8[11:4] = 0x00000000U + // .. ==> MASK : 0x00000FF0U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80062A8, 0x00000FF7U ,0x00000000U), + // .. reg_ddrc_mr4_read_interval = 0x0 + // .. ==> 0XF80062AC[31:0] = 0x00000000U + // .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80062AC, 0xFFFFFFFFU ,0x00000000U), + // .. reg_ddrc_min_stable_clock_x1 = 0x5 + // .. ==> 0XF80062B0[3:0] = 0x00000005U + // .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. reg_ddrc_idle_after_reset_x32 = 0x12 + // .. ==> 0XF80062B0[11:4] = 0x00000012U + // .. ==> MASK : 0x00000FF0U VAL : 0x00000120U + // .. reg_ddrc_t_mrw = 0x5 + // .. ==> 0XF80062B0[21:12] = 0x00000005U + // .. ==> MASK : 0x003FF000U VAL : 0x00005000U + // .. + EMIT_MASKWRITE(0XF80062B0, 0x003FFFFFU ,0x00005125U), + // .. reg_ddrc_max_auto_init_x1024 = 0xa6 + // .. ==> 0XF80062B4[7:0] = 0x000000A6U + // .. ==> MASK : 0x000000FFU VAL : 0x000000A6U + // .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A6U), + // .. START: POLL ON DCI STATUS + // .. DONE = 1 + // .. ==> 0XF8000B74[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKPOLL(0XF8000B74, 0x00002000U), + // .. FINISH: POLL ON DCI STATUS + // .. START: UNLOCK DDR + // .. reg_ddrc_soft_rstb = 0x1 + // .. ==> 0XF8006000[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_ddrc_powerdown_en = 0x0 + // .. ==> 0XF8006000[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_ddrc_data_bus_width = 0x0 + // .. ==> 0XF8006000[3:2] = 0x00000000U + // .. ==> MASK : 0x0000000CU VAL : 0x00000000U + // .. reg_ddrc_burst8_refresh = 0x0 + // .. ==> 0XF8006000[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. reg_ddrc_rdwr_idle_gap = 1 + // .. ==> 0XF8006000[13:7] = 0x00000001U + // .. ==> MASK : 0x00003F80U VAL : 0x00000080U + // .. reg_ddrc_dis_rd_bypass = 0x0 + // .. ==> 0XF8006000[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. reg_ddrc_dis_act_bypass = 0x0 + // .. ==> 0XF8006000[15:15] = 0x00000000U + // .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. reg_ddrc_dis_auto_refresh = 0x0 + // .. ==> 0XF8006000[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006000, 0x0001FFFFU ,0x00000081U), + // .. FINISH: UNLOCK DDR + // .. START: CHECK DDR STATUS + // .. ddrc_reg_operating_mode = 1 + // .. ==> 0XF8006054[2:0] = 0x00000001U + // .. ==> MASK : 0x00000007U VAL : 0x00000001U + // .. + EMIT_MASKPOLL(0XF8006054, 0x00000007U), + // .. FINISH: CHECK DDR STATUS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_mio_init_data_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. VREF_EN = 0x1 + // .. ==> 0XF8000B00[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B00[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. CLK_PULLUP_EN = 0x0 + // .. ==> 0XF8000B00[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. SRSTN_PULLUP_EN = 0x0 + // .. ==> 0XF8000B00[9:9] = 0x00000000U + // .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B00, 0x00000303U ,0x00000001U), + // .. FINISH: OCM REMAPPING + // .. START: DDRIOB SETTINGS + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B40[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B40[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B40[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B40[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B40[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B40[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B40[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B40[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B40, 0x00000FFFU ,0x00000600U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B44[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B44[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B44[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B44[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B44[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B44[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B44[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B44[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B44, 0x00000FFFU ,0x00000600U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x1 + // .. ==> 0XF8000B48[2:1] = 0x00000001U + // .. ==> MASK : 0x00000006U VAL : 0x00000002U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B48[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B48[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCR_TYPE = 0x3 + // .. ==> 0XF8000B48[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B48[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B48[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B48[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B48[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B48, 0x00000FFFU ,0x00000672U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x1 + // .. ==> 0XF8000B4C[2:1] = 0x00000001U + // .. ==> MASK : 0x00000006U VAL : 0x00000002U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B4C[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCR_TYPE = 0x3 + // .. ==> 0XF8000B4C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B4C[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B4C[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000672U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x2 + // .. ==> 0XF8000B50[2:1] = 0x00000002U + // .. ==> MASK : 0x00000006U VAL : 0x00000004U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B50[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B50[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCR_TYPE = 0x3 + // .. ==> 0XF8000B50[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B50[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B50[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B50[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B50[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B50, 0x00000FFFU ,0x00000674U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x2 + // .. ==> 0XF8000B54[2:1] = 0x00000002U + // .. ==> MASK : 0x00000006U VAL : 0x00000004U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B54[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCR_TYPE = 0x3 + // .. ==> 0XF8000B54[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B54[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B54[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000674U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B58[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B58[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B58[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B58[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B58[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B58[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B58[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B58[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B58, 0x00000FFFU ,0x00000600U), + // .. DRIVE_P = 0x1c + // .. ==> 0XF8000B5C[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. DRIVE_N = 0xc + // .. ==> 0XF8000B5C[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. SLEW_P = 0x1a + // .. ==> 0XF8000B5C[18:14] = 0x0000001AU + // .. ==> MASK : 0x0007C000U VAL : 0x00068000U + // .. SLEW_N = 0x1a + // .. ==> 0XF8000B5C[23:19] = 0x0000001AU + // .. ==> MASK : 0x00F80000U VAL : 0x00D00000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x00D6861CU), + // .. DRIVE_P = 0x1c + // .. ==> 0XF8000B60[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. DRIVE_N = 0xc + // .. ==> 0XF8000B60[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F9861CU), + // .. DRIVE_P = 0x1c + // .. ==> 0XF8000B64[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. DRIVE_N = 0xc + // .. ==> 0XF8000B64[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F9861CU), + // .. DRIVE_P = 0x1c + // .. ==> 0XF8000B68[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. DRIVE_N = 0xc + // .. ==> 0XF8000B68[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. SLEW_P = 0x1a + // .. ==> 0XF8000B68[18:14] = 0x0000001AU + // .. ==> MASK : 0x0007C000U VAL : 0x00068000U + // .. SLEW_N = 0x1a + // .. ==> 0XF8000B68[23:19] = 0x0000001AU + // .. ==> MASK : 0x00F80000U VAL : 0x00D00000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00D6861CU), + // .. VREF_INT_EN = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x000073FFU ,0x00000260U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000021U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000020U), + // .. .. FINISH: DEASSERT RESET + // .. .. RESET = 0x1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. ENABLE = 0x1 + // .. .. ==> 0XF8000B70[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. NREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[7:6] = 0x00000000U + // .. .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. .. NREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[10:8] = 0x00000000U + // .. .. ==> MASK : 0x00000700U VAL : 0x00000000U + // .. .. NREF_OPT4 = 0x1 + // .. .. ==> 0XF8000B70[13:11] = 0x00000001U + // .. .. ==> MASK : 0x00003800U VAL : 0x00000800U + // .. .. PREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[16:14] = 0x00000000U + // .. .. ==> MASK : 0x0001C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FFFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000700[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000700[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000700[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000700[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000700[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000700[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000704[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000704[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000704[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000704[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000704[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000704[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000704[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000708[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000708[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000708[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000708[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000708[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000708[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000708[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800070C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF800070C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800070C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800070C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800070C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800070C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF800070C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000710[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000710[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000710[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000710[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000710[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000710[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000710[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000714[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000714[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000714[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000714[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000714[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000714[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000714[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000718[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000718[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000718[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000718[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000718[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000718[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000718[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800071C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800071C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800071C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800071C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800071C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800071C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800071C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000720[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000720[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000720[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000720[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000720[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000724[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000724[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000724[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000724[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000724[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000724[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000728[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000728[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000728[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000728[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 2 + // .. ==> 0XF8000728[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800072C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800072C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800072C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800072C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 2 + // .. ==> 0XF800072C[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000730[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000730[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000730[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000730[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000730[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000730[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000730[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000730[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000734[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000734[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000734[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000734[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000734[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000734[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000734[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000734[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000738[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000738[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000738[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000738[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000738[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000738[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000738[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000738[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800073C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800073C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800073C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800073C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800073C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800073C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800073C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000740[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000740[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000740[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000740[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000740[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000740[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000740[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000740[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000740[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000744[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000744[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000744[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000744[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000744[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000744[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000744[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000744[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000744[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000748[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000748[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000748[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000748[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000748[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000748[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000748[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000748[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000748[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800074C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF800074C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800074C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800074C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800074C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800074C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800074C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800074C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF800074C[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000750[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000750[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000750[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000750[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000750[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000750[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000750[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000750[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000750[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000754[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000754[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000754[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000754[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000754[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000754[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000754[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000754[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000754[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000758[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000758[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000758[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000758[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000758[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000758[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000758[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000758[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800075C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF800075C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800075C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800075C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800075C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800075C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800075C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800075C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000760[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000760[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000760[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000760[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000760[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000760[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000760[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000760[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000764[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000764[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000764[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000764[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000764[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000764[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000764[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000764[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000768[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000768[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000768[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000768[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000768[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000768[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000768[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000768[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800076C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF800076C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800076C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800076C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800076C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800076C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800076C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800076C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000770[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000770[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000770[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000770[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000770[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000770[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000770[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000770[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000774[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF8000774[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000774[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000774[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000774[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000774[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000774[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000774[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000778[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000778[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000778[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000778[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000778[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000778[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000778[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000778[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800077C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF800077C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800077C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800077C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800077C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800077C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800077C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800077C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000780[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000780[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000780[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000780[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000780[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000780[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000780[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000780[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000784[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000784[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000784[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000784[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000784[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000784[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000784[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000784[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000788[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000788[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000788[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000788[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000788[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000788[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000788[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000788[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800078C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800078C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800078C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800078C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800078C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800078C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800078C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800078C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000790[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF8000790[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000790[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000790[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000790[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000790[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000790[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000790[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000794[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000794[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000794[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000794[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000794[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000794[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000794[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000794[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000798[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000798[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000798[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000798[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000798[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000798[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000798[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000798[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800079C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800079C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800079C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800079C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800079C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800079C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800079C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800079C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A0[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A4[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A8[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A8[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007AC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007AC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007AC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007AC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007AC[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007AC[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007AC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007AC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007B0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007B0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007B0[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007B0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007B4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007B4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007B4[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007B4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003F01U ,0x00000200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007BC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00000201U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007C0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF80007C0[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000002E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007C4[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007C4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF80007C4[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000002E1U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007C8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007C8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF80007C8[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00000201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007CC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007CC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007CC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007CC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF80007CC[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007CC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00000201U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007D0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007D0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007D0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007D0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007D0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007D0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007D0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00000280U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007D4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007D4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007D4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007D4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007D4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007D4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007D4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00000280U), + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F0000U ,0x002F0000U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_peripherals_init_data_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B48[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B48[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B48, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B4C[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B4C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B50[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B50[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B50, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B54[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B54[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000180U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x5 + // .. ==> 0XE0001034[7:0] = 0x00000005U + // .. ==> MASK : 0x000000FFU VAL : 0x00000005U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000005U), + // .. CD = 0x9 + // .. ==> 0XE0001018[15:0] = 0x00000009U + // .. ==> MASK : 0x0000FFFFU VAL : 0x00000009U + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x00000009U), + // .. STPBRK = 0x0 + // .. ==> 0XE0001000[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. STTBRK = 0x0 + // .. ==> 0XE0001000[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. RSTTO = 0x0 + // .. ==> 0XE0001000[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. TXDIS = 0x0 + // .. ==> 0XE0001000[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. TXEN = 0x1 + // .. ==> 0XE0001000[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. RXDIS = 0x0 + // .. ==> 0XE0001000[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. RXEN = 0x1 + // .. ==> 0XE0001000[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. TXRES = 0x1 + // .. ==> 0XE0001000[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. RXRES = 0x1 + // .. ==> 0XE0001000[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XE0001000, 0x000001FFU ,0x00000017U), + // .. IRMODE = 0x0 + // .. ==> 0XE0001004[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. UCLKEN = 0x0 + // .. ==> 0XE0001004[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. CHMODE = 0x0 + // .. ==> 0XE0001004[9:8] = 0x00000000U + // .. ==> MASK : 0x00000300U VAL : 0x00000000U + // .. NBSTOP = 0x0 + // .. ==> 0XE0001004[7:6] = 0x00000000U + // .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. PAR = 0x4 + // .. ==> 0XE0001004[5:3] = 0x00000004U + // .. ==> MASK : 0x00000038U VAL : 0x00000020U + // .. CHRL = 0x0 + // .. ==> 0XE0001004[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. CLKS = 0x0 + // .. ==> 0XE0001004[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XE0001004, 0x00000FFFU ,0x00000020U), + // .. BDIV = 0x5 + // .. ==> 0XE0000034[7:0] = 0x00000005U + // .. ==> MASK : 0x000000FFU VAL : 0x00000005U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000005U), + // .. CD = 0x9 + // .. ==> 0XE0000018[15:0] = 0x00000009U + // .. ==> MASK : 0x0000FFFFU VAL : 0x00000009U + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x00000009U), + // .. STPBRK = 0x0 + // .. ==> 0XE0000000[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. STTBRK = 0x0 + // .. ==> 0XE0000000[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. RSTTO = 0x0 + // .. ==> 0XE0000000[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. TXDIS = 0x0 + // .. ==> 0XE0000000[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. TXEN = 0x1 + // .. ==> 0XE0000000[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. RXDIS = 0x0 + // .. ==> 0XE0000000[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. RXEN = 0x1 + // .. ==> 0XE0000000[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. TXRES = 0x1 + // .. ==> 0XE0000000[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. RXRES = 0x1 + // .. ==> 0XE0000000[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XE0000000, 0x000001FFU ,0x00000017U), + // .. IRMODE = 0x0 + // .. ==> 0XE0000004[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. UCLKEN = 0x0 + // .. ==> 0XE0000004[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. CHMODE = 0x0 + // .. ==> 0XE0000004[9:8] = 0x00000000U + // .. ==> MASK : 0x00000300U VAL : 0x00000000U + // .. NBSTOP = 0x0 + // .. ==> 0XE0000004[7:6] = 0x00000000U + // .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. PAR = 0x4 + // .. ==> 0XE0000004[5:3] = 0x00000004U + // .. ==> MASK : 0x00000038U VAL : 0x00000020U + // .. CHRL = 0x0 + // .. ==> 0XE0000004[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. CLKS = 0x0 + // .. ==> 0XE0000004[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XE0000004, 0x00000FFFU ,0x00000020U), + // .. FINISH: UART REGISTERS + // .. START: PL POWER ON RESET REGISTERS + // .. PCFG_POR_CNT_4K = 0 + // .. ==> 0XF8007000[29:29] = 0x00000000U + // .. ==> MASK : 0x20000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8007000, 0x20000000U ,0x00000000U), + // .. FINISH: PL POWER ON RESET REGISTERS + // .. START: SMC TIMING CALCULATION REGISTER UPDATE + // .. .. START: NAND SET CYCLE + // .. .. FINISH: NAND SET CYCLE + // .. .. START: OPMODE + // .. .. FINISH: OPMODE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: SRAM/NOR CS0 SET CYCLE + // .. .. FINISH: SRAM/NOR CS0 SET CYCLE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: NOR CS0 BASE ADDRESS + // .. .. FINISH: NOR CS0 BASE ADDRESS + // .. .. START: SRAM/NOR CS1 SET CYCLE + // .. .. FINISH: SRAM/NOR CS1 SET CYCLE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: NOR CS1 BASE ADDRESS + // .. .. FINISH: NOR CS1 BASE ADDRESS + // .. .. START: USB RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. DIRECTION_1 = 0x4000 + // .. .. .. ==> 0XE000A244[21:0] = 0x00004000U + // .. .. .. ==> MASK : 0x003FFFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A244, 0x003FFFFFU ,0x00004000U), + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x4000 + // .. .. .. ==> 0XE000A008[15:0] = 0x00004000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF4000U), + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. OP_ENABLE_1 = 0x4000 + // .. .. .. ==> 0XE000A248[21:0] = 0x00004000U + // .. .. .. ==> MASK : 0x003FFFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A248, 0x003FFFFFU ,0x00004000U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x0 + // .. .. .. ==> 0XE000A008[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF0000U), + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x4000 + // .. .. .. ==> 0XE000A008[15:0] = 0x00004000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF4000U), + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: I2C RESET + // .. FINISH: SMC TIMING CALCULATION REGISTER UPDATE + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_post_config_1_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: ENABLING LEVEL SHIFTER + // .. USER_INP_ICT_EN_0 = 3 + // .. ==> 0XF8000900[1:0] = 0x00000003U + // .. ==> MASK : 0x00000003U VAL : 0x00000003U + // .. USER_INP_ICT_EN_1 = 3 + // .. ==> 0XF8000900[3:2] = 0x00000003U + // .. ==> MASK : 0x0000000CU VAL : 0x0000000CU + // .. + EMIT_MASKWRITE(0XF8000900, 0x0000000FU ,0x0000000FU), + // .. FINISH: ENABLING LEVEL SHIFTER + // .. START: FPGA RESETS TO 1 + // .. reserved_3 = 127 + // .. ==> 0XF8000240[31:25] = 0x0000007FU + // .. ==> MASK : 0xFE000000U VAL : 0xFE000000U + // .. FPGA_ACP_RST = 1 + // .. ==> 0XF8000240[24:24] = 0x00000001U + // .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. FPGA_AXDS3_RST = 1 + // .. ==> 0XF8000240[23:23] = 0x00000001U + // .. ==> MASK : 0x00800000U VAL : 0x00800000U + // .. FPGA_AXDS2_RST = 1 + // .. ==> 0XF8000240[22:22] = 0x00000001U + // .. ==> MASK : 0x00400000U VAL : 0x00400000U + // .. FPGA_AXDS1_RST = 1 + // .. ==> 0XF8000240[21:21] = 0x00000001U + // .. ==> MASK : 0x00200000U VAL : 0x00200000U + // .. FPGA_AXDS0_RST = 1 + // .. ==> 0XF8000240[20:20] = 0x00000001U + // .. ==> MASK : 0x00100000U VAL : 0x00100000U + // .. reserved_2 = 3 + // .. ==> 0XF8000240[19:18] = 0x00000003U + // .. ==> MASK : 0x000C0000U VAL : 0x000C0000U + // .. FSSW1_FPGA_RST = 1 + // .. ==> 0XF8000240[17:17] = 0x00000001U + // .. ==> MASK : 0x00020000U VAL : 0x00020000U + // .. FSSW0_FPGA_RST = 1 + // .. ==> 0XF8000240[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. reserved_1 = 15 + // .. ==> 0XF8000240[15:14] = 0x0000000FU + // .. ==> MASK : 0x0000C000U VAL : 0x0000C000U + // .. FPGA_FMSW1_RST = 1 + // .. ==> 0XF8000240[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. FPGA_FMSW0_RST = 1 + // .. ==> 0XF8000240[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. FPGA_DMA3_RST = 1 + // .. ==> 0XF8000240[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. FPGA_DMA2_RST = 1 + // .. ==> 0XF8000240[10:10] = 0x00000001U + // .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. FPGA_DMA1_RST = 1 + // .. ==> 0XF8000240[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. FPGA_DMA0_RST = 1 + // .. ==> 0XF8000240[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. reserved = 15 + // .. ==> 0XF8000240[7:4] = 0x0000000FU + // .. ==> MASK : 0x000000F0U VAL : 0x000000F0U + // .. FPGA3_OUT_RST = 1 + // .. ==> 0XF8000240[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. FPGA2_OUT_RST = 1 + // .. ==> 0XF8000240[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. FPGA1_OUT_RST = 1 + // .. ==> 0XF8000240[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. FPGA0_OUT_RST = 1 + // .. ==> 0XF8000240[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XF8000240, 0xFFFFFFFFU ,0xFFFFFFFFU), + // .. FINISH: FPGA RESETS TO 1 + // .. START: FPGA RESETS TO 0 + // .. reserved_3 = 0 + // .. ==> 0XF8000240[31:25] = 0x00000000U + // .. ==> MASK : 0xFE000000U VAL : 0x00000000U + // .. FPGA_ACP_RST = 0 + // .. ==> 0XF8000240[24:24] = 0x00000000U + // .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. FPGA_AXDS3_RST = 0 + // .. ==> 0XF8000240[23:23] = 0x00000000U + // .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. FPGA_AXDS2_RST = 0 + // .. ==> 0XF8000240[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. FPGA_AXDS1_RST = 0 + // .. ==> 0XF8000240[21:21] = 0x00000000U + // .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. FPGA_AXDS0_RST = 0 + // .. ==> 0XF8000240[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. reserved_2 = 0 + // .. ==> 0XF8000240[19:18] = 0x00000000U + // .. ==> MASK : 0x000C0000U VAL : 0x00000000U + // .. FSSW1_FPGA_RST = 0 + // .. ==> 0XF8000240[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. FSSW0_FPGA_RST = 0 + // .. ==> 0XF8000240[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reserved_1 = 0 + // .. ==> 0XF8000240[15:14] = 0x00000000U + // .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. FPGA_FMSW1_RST = 0 + // .. ==> 0XF8000240[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. FPGA_FMSW0_RST = 0 + // .. ==> 0XF8000240[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. FPGA_DMA3_RST = 0 + // .. ==> 0XF8000240[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. FPGA_DMA2_RST = 0 + // .. ==> 0XF8000240[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. FPGA_DMA1_RST = 0 + // .. ==> 0XF8000240[9:9] = 0x00000000U + // .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. FPGA_DMA0_RST = 0 + // .. ==> 0XF8000240[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. reserved = 0 + // .. ==> 0XF8000240[7:4] = 0x00000000U + // .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. FPGA3_OUT_RST = 0 + // .. ==> 0XF8000240[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. FPGA2_OUT_RST = 0 + // .. ==> 0XF8000240[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. FPGA1_OUT_RST = 0 + // .. ==> 0XF8000240[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. FPGA0_OUT_RST = 0 + // .. ==> 0XF8000240[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000240, 0xFFFFFFFFU ,0x00000000U), + // .. FINISH: FPGA RESETS TO 0 + // .. START: AFI REGISTERS + // .. .. START: AFI0 REGISTERS + // .. .. FINISH: AFI0 REGISTERS + // .. .. START: AFI1 REGISTERS + // .. .. FINISH: AFI1 REGISTERS + // .. .. START: AFI2 REGISTERS + // .. .. FINISH: AFI2 REGISTERS + // .. .. START: AFI3 REGISTERS + // .. .. FINISH: AFI3 REGISTERS + // .. FINISH: AFI REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_pll_init_data_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000110[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x177 + // .. .. ==> 0XF8000110[21:12] = 0x00000177U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00177000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x001772C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1a + // .. .. .. ==> 0XF8000100[18:12] = 0x0000001AU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001A000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x0001A000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000100[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000100[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000100[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. ARM_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000001U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000100[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. .. SRCSEL = 0x0 + // .. .. .. ==> 0XF8000120[5:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. .. DIVISOR = 0x2 + // .. .. .. ==> 0XF8000120[13:8] = 0x00000002U + // .. .. .. ==> MASK : 0x00003F00U VAL : 0x00000200U + // .. .. .. CPU_6OR4XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[24:24] = 0x00000001U + // .. .. .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. .. .. CPU_3OR2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[25:25] = 0x00000001U + // .. .. .. ==> MASK : 0x02000000U VAL : 0x02000000U + // .. .. .. CPU_2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[26:26] = 0x00000001U + // .. .. .. ==> MASK : 0x04000000U VAL : 0x04000000U + // .. .. .. CPU_1XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[27:27] = 0x00000001U + // .. .. .. ==> MASK : 0x08000000U VAL : 0x08000000U + // .. .. .. CPU_PERI_CLKACT = 0x1 + // .. .. .. ==> 0XF8000120[28:28] = 0x00000001U + // .. .. .. ==> MASK : 0x10000000U VAL : 0x10000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000120, 0x1F003F30U ,0x1F000200U), + // .. .. FINISH: ARM PLL INIT + // .. .. START: DDR PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000114[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x1db + // .. .. ==> 0XF8000114[21:12] = 0x000001DBU + // .. .. ==> MASK : 0x003FF000U VAL : 0x001DB000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x001DB2C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x15 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000015U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00015000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00015000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000104[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000104[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000104[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. DDR_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[1:1] = 0x00000001U + // .. .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000002U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000104[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. .. DDR_3XCLKACT = 0x1 + // .. .. .. ==> 0XF8000124[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. DDR_2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000124[1:1] = 0x00000001U + // .. .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. .. DDR_3XCLK_DIVISOR = 0x2 + // .. .. .. ==> 0XF8000124[25:20] = 0x00000002U + // .. .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. .. DDR_2XCLK_DIVISOR = 0x3 + // .. .. .. ==> 0XF8000124[31:26] = 0x00000003U + // .. .. .. ==> MASK : 0xFC000000U VAL : 0x0C000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000124, 0xFFF00003U ,0x0C200003U), + // .. .. FINISH: DDR PLL INIT + // .. .. START: IO PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000118[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000118[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x1f4 + // .. .. ==> 0XF8000118[21:12] = 0x000001F4U + // .. .. ==> MASK : 0x003FF000U VAL : 0x001F4000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001F42C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x14 + // .. .. .. ==> 0XF8000108[18:12] = 0x00000014U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00014000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x00014000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000108[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000108[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000108[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. IO_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[2:2] = 0x00000001U + // .. .. .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000004U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000108[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. FINISH: IO PLL INIT + // .. FINISH: PLL SLCR REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_clock_init_data_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0x34 + // .. ==> 0XF8000128[13:8] = 0x00000034U + // .. ==> MASK : 0x00003F00U VAL : 0x00003400U + // .. DIVISOR1 = 0x2 + // .. ==> 0XF8000128[25:20] = 0x00000002U + // .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00203401U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x5 + // .. ==> 0XF800014C[13:8] = 0x00000005U + // .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000501U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000150[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF8000150[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x14 + // .. ==> 0XF8000150[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00001401U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000154[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000154[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000154[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x14 + // .. ==> 0XF8000154[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00001403U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000168[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000168[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x5 + // .. ==> 0XF8000168[13:8] = 0x00000005U + // .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. + EMIT_MASKWRITE(0XF8000168, 0x00003F31U ,0x00000501U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000170[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xa + // .. ==> 0XF8000170[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00100A00U), + // .. SRCSEL = 0x3 + // .. ==> 0XF8000180[5:4] = 0x00000003U + // .. ==> MASK : 0x00000030U VAL : 0x00000030U + // .. DIVISOR0 = 0x6 + // .. ==> 0XF8000180[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00100630U), + // .. SRCSEL = 0x2 + // .. ==> 0XF8000190[5:4] = 0x00000002U + // .. ==> MASK : 0x00000030U VAL : 0x00000020U + // .. DIVISOR0 = 0x35 + // .. ==> 0XF8000190[13:8] = 0x00000035U + // .. ==> MASK : 0x00003F00U VAL : 0x00003500U + // .. DIVISOR1 = 0x2 + // .. ==> 0XF8000190[25:20] = 0x00000002U + // .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00203520U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xa + // .. ==> 0XF80001A0[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00100A00U), + // .. CLK_621_TRUE = 0x1 + // .. ==> 0XF80001C4[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XF80001C4, 0x00000001U ,0x00000001U), + // .. DMA_CPU_2XCLKACT = 0x1 + // .. ==> 0XF800012C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. USB0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. USB1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. GEM0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[6:6] = 0x00000001U + // .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. GEM1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. SDI0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[10:10] = 0x00000001U + // .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. SDI1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. SPI0_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. SPI1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[15:15] = 0x00000000U + // .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. CAN0_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. CAN1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. I2C0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[18:18] = 0x00000001U + // .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. I2C1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. UART0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[20:20] = 0x00000001U + // .. ==> MASK : 0x00100000U VAL : 0x00100000U + // .. UART1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[21:21] = 0x00000001U + // .. ==> MASK : 0x00200000U VAL : 0x00200000U + // .. GPIO_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[22:22] = 0x00000001U + // .. ==> MASK : 0x00400000U VAL : 0x00400000U + // .. LQSPI_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[23:23] = 0x00000001U + // .. ==> MASK : 0x00800000U VAL : 0x00800000U + // .. SMC_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[24:24] = 0x00000001U + // .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. + EMIT_MASKWRITE(0XF800012C, 0x01FFCCCDU ,0x01FC044DU), + // .. FINISH: CLOCK CONTROL SLCR REGISTERS + // .. START: THIS SHOULD BE BLANK + // .. FINISH: THIS SHOULD BE BLANK + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_ddr_init_data_2_0[] = { + // START: top + // .. START: DDR INITIALIZATION + // .. .. START: LOCK DDR + // .. .. reg_ddrc_soft_rstb = 0 + // .. .. ==> 0XF8006000[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_powerdown_en = 0x0 + // .. .. ==> 0XF8006000[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_ddrc_data_bus_width = 0x0 + // .. .. ==> 0XF8006000[3:2] = 0x00000000U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000000U + // .. .. reg_ddrc_burst8_refresh = 0x0 + // .. .. ==> 0XF8006000[6:4] = 0x00000000U + // .. .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. .. reg_ddrc_rdwr_idle_gap = 0x1 + // .. .. ==> 0XF8006000[13:7] = 0x00000001U + // .. .. ==> MASK : 0x00003F80U VAL : 0x00000080U + // .. .. reg_ddrc_dis_rd_bypass = 0x0 + // .. .. ==> 0XF8006000[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. reg_ddrc_dis_act_bypass = 0x0 + // .. .. ==> 0XF8006000[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. reg_ddrc_dis_auto_refresh = 0x0 + // .. .. ==> 0XF8006000[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006000, 0x0001FFFFU ,0x00000080U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x7f + // .. .. ==> 0XF8006004[11:0] = 0x0000007FU + // .. .. ==> MASK : 0x00000FFFU VAL : 0x0000007FU + // .. .. reg_ddrc_active_ranks = 0x1 + // .. .. ==> 0XF8006004[13:12] = 0x00000001U + // .. .. ==> MASK : 0x00003000U VAL : 0x00001000U + // .. .. reg_ddrc_addrmap_cs_bit0 = 0x0 + // .. .. ==> 0XF8006004[18:14] = 0x00000000U + // .. .. ==> MASK : 0x0007C000U VAL : 0x00000000U + // .. .. reg_ddrc_wr_odt_block = 0x1 + // .. .. ==> 0XF8006004[20:19] = 0x00000001U + // .. .. ==> MASK : 0x00180000U VAL : 0x00080000U + // .. .. reg_ddrc_diff_rank_rd_2cycle_gap = 0x0 + // .. .. ==> 0XF8006004[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_cs_bit1 = 0x0 + // .. .. ==> 0XF8006004[26:22] = 0x00000000U + // .. .. ==> MASK : 0x07C00000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_open_bank = 0x0 + // .. .. ==> 0XF8006004[27:27] = 0x00000000U + // .. .. ==> MASK : 0x08000000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_4bank_ram = 0x0 + // .. .. ==> 0XF8006004[28:28] = 0x00000000U + // .. .. ==> MASK : 0x10000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006004, 0x1FFFFFFFU ,0x0008107FU), + // .. .. reg_ddrc_hpr_min_non_critical_x32 = 0xf + // .. .. ==> 0XF8006008[10:0] = 0x0000000FU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000000FU + // .. .. reg_ddrc_hpr_max_starve_x32 = 0xf + // .. .. ==> 0XF8006008[21:11] = 0x0000000FU + // .. .. ==> MASK : 0x003FF800U VAL : 0x00007800U + // .. .. reg_ddrc_hpr_xact_run_length = 0xf + // .. .. ==> 0XF8006008[25:22] = 0x0000000FU + // .. .. ==> MASK : 0x03C00000U VAL : 0x03C00000U + // .. .. + EMIT_MASKWRITE(0XF8006008, 0x03FFFFFFU ,0x03C0780FU), + // .. .. reg_ddrc_lpr_min_non_critical_x32 = 0x1 + // .. .. ==> 0XF800600C[10:0] = 0x00000001U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000001U + // .. .. reg_ddrc_lpr_max_starve_x32 = 0x2 + // .. .. ==> 0XF800600C[21:11] = 0x00000002U + // .. .. ==> MASK : 0x003FF800U VAL : 0x00001000U + // .. .. reg_ddrc_lpr_xact_run_length = 0x8 + // .. .. ==> 0XF800600C[25:22] = 0x00000008U + // .. .. ==> MASK : 0x03C00000U VAL : 0x02000000U + // .. .. + EMIT_MASKWRITE(0XF800600C, 0x03FFFFFFU ,0x02001001U), + // .. .. reg_ddrc_w_min_non_critical_x32 = 0x1 + // .. .. ==> 0XF8006010[10:0] = 0x00000001U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000001U + // .. .. reg_ddrc_w_xact_run_length = 0x8 + // .. .. ==> 0XF8006010[14:11] = 0x00000008U + // .. .. ==> MASK : 0x00007800U VAL : 0x00004000U + // .. .. reg_ddrc_w_max_starve_x32 = 0x2 + // .. .. ==> 0XF8006010[25:15] = 0x00000002U + // .. .. ==> MASK : 0x03FF8000U VAL : 0x00010000U + // .. .. + EMIT_MASKWRITE(0XF8006010, 0x03FFFFFFU ,0x00014001U), + // .. .. reg_ddrc_t_rc = 0x1a + // .. .. ==> 0XF8006014[5:0] = 0x0000001AU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001AU + // .. .. reg_ddrc_t_rfc_min = 0x54 + // .. .. ==> 0XF8006014[13:6] = 0x00000054U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001500U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004151AU), + // .. .. reg_ddrc_wr2pre = 0x12 + // .. .. ==> 0XF8006018[4:0] = 0x00000012U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000012U + // .. .. reg_ddrc_powerdown_to_x32 = 0x6 + // .. .. ==> 0XF8006018[9:5] = 0x00000006U + // .. .. ==> MASK : 0x000003E0U VAL : 0x000000C0U + // .. .. reg_ddrc_t_faw = 0x15 + // .. .. ==> 0XF8006018[15:10] = 0x00000015U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005400U + // .. .. reg_ddrc_t_ras_max = 0x23 + // .. .. ==> 0XF8006018[21:16] = 0x00000023U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00230000U + // .. .. reg_ddrc_t_ras_min = 0x13 + // .. .. ==> 0XF8006018[26:22] = 0x00000013U + // .. .. ==> MASK : 0x07C00000U VAL : 0x04C00000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x44E354D2U), + // .. .. reg_ddrc_write_latency = 0x5 + // .. .. ==> 0XF800601C[4:0] = 0x00000005U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000005U + // .. .. reg_ddrc_rd2wr = 0x7 + // .. .. ==> 0XF800601C[9:5] = 0x00000007U + // .. .. ==> MASK : 0x000003E0U VAL : 0x000000E0U + // .. .. reg_ddrc_wr2rd = 0xe + // .. .. ==> 0XF800601C[14:10] = 0x0000000EU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003800U + // .. .. reg_ddrc_t_xp = 0x4 + // .. .. ==> 0XF800601C[19:15] = 0x00000004U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00020000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x4 + // .. .. ==> 0XF800601C[27:23] = 0x00000004U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02000000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x720238E5U), + // .. .. reg_ddrc_t_ccd = 0x4 + // .. .. ==> 0XF8006020[4:2] = 0x00000004U + // .. .. ==> MASK : 0x0000001CU VAL : 0x00000010U + // .. .. reg_ddrc_t_rrd = 0x6 + // .. .. ==> 0XF8006020[7:5] = 0x00000006U + // .. .. ==> MASK : 0x000000E0U VAL : 0x000000C0U + // .. .. reg_ddrc_refresh_margin = 0x2 + // .. .. ==> 0XF8006020[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. reg_ddrc_t_rp = 0x7 + // .. .. ==> 0XF8006020[15:12] = 0x00000007U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00007000U + // .. .. reg_ddrc_refresh_to_x32 = 0x8 + // .. .. ==> 0XF8006020[20:16] = 0x00000008U + // .. .. ==> MASK : 0x001F0000U VAL : 0x00080000U + // .. .. reg_ddrc_sdram = 0x1 + // .. .. ==> 0XF8006020[21:21] = 0x00000001U + // .. .. ==> MASK : 0x00200000U VAL : 0x00200000U + // .. .. reg_ddrc_mobile = 0x0 + // .. .. ==> 0XF8006020[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reg_ddrc_clock_stop_en = 0x0 + // .. .. ==> 0XF8006020[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reg_ddrc_read_latency = 0x7 + // .. .. ==> 0XF8006020[28:24] = 0x00000007U + // .. .. ==> MASK : 0x1F000000U VAL : 0x07000000U + // .. .. reg_phy_mode_ddr1_ddr2 = 0x1 + // .. .. ==> 0XF8006020[29:29] = 0x00000001U + // .. .. ==> MASK : 0x20000000U VAL : 0x20000000U + // .. .. reg_ddrc_dis_pad_pd = 0x0 + // .. .. ==> 0XF8006020[30:30] = 0x00000000U + // .. .. ==> MASK : 0x40000000U VAL : 0x00000000U + // .. .. reg_ddrc_loopback = 0x0 + // .. .. ==> 0XF8006020[31:31] = 0x00000000U + // .. .. ==> MASK : 0x80000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006020, 0xFFFFFFFCU ,0x272872D0U), + // .. .. reg_ddrc_en_2t_timing_mode = 0x0 + // .. .. ==> 0XF8006024[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_prefer_write = 0x0 + // .. .. ==> 0XF8006024[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_ddrc_max_rank_rd = 0xf + // .. .. ==> 0XF8006024[5:2] = 0x0000000FU + // .. .. ==> MASK : 0x0000003CU VAL : 0x0000003CU + // .. .. reg_ddrc_mr_wr = 0x0 + // .. .. ==> 0XF8006024[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. reg_ddrc_mr_addr = 0x0 + // .. .. ==> 0XF8006024[8:7] = 0x00000000U + // .. .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. .. reg_ddrc_mr_data = 0x0 + // .. .. ==> 0XF8006024[24:9] = 0x00000000U + // .. .. ==> MASK : 0x01FFFE00U VAL : 0x00000000U + // .. .. ddrc_reg_mr_wr_busy = 0x0 + // .. .. ==> 0XF8006024[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reg_ddrc_mr_type = 0x0 + // .. .. ==> 0XF8006024[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. reg_ddrc_mr_rdata_valid = 0x0 + // .. .. ==> 0XF8006024[27:27] = 0x00000000U + // .. .. ==> MASK : 0x08000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006024, 0x0FFFFFFFU ,0x0000003CU), + // .. .. reg_ddrc_final_wait_x32 = 0x7 + // .. .. ==> 0XF8006028[6:0] = 0x00000007U + // .. .. ==> MASK : 0x0000007FU VAL : 0x00000007U + // .. .. reg_ddrc_pre_ocd_x32 = 0x0 + // .. .. ==> 0XF8006028[10:7] = 0x00000000U + // .. .. ==> MASK : 0x00000780U VAL : 0x00000000U + // .. .. reg_ddrc_t_mrd = 0x4 + // .. .. ==> 0XF8006028[13:11] = 0x00000004U + // .. .. ==> MASK : 0x00003800U VAL : 0x00002000U + // .. .. + EMIT_MASKWRITE(0XF8006028, 0x00003FFFU ,0x00002007U), + // .. .. reg_ddrc_emr2 = 0x8 + // .. .. ==> 0XF800602C[15:0] = 0x00000008U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000008U + // .. .. reg_ddrc_emr3 = 0x0 + // .. .. ==> 0XF800602C[31:16] = 0x00000000U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800602C, 0xFFFFFFFFU ,0x00000008U), + // .. .. reg_ddrc_mr = 0x930 + // .. .. ==> 0XF8006030[15:0] = 0x00000930U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000930U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040930U), + // .. .. reg_ddrc_burst_rdwr = 0x4 + // .. .. ==> 0XF8006034[3:0] = 0x00000004U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000004U + // .. .. reg_ddrc_pre_cke_x1024 = 0x101 + // .. .. ==> 0XF8006034[13:4] = 0x00000101U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001010U + // .. .. reg_ddrc_post_cke_x1024 = 0x1 + // .. .. ==> 0XF8006034[25:16] = 0x00000001U + // .. .. ==> MASK : 0x03FF0000U VAL : 0x00010000U + // .. .. reg_ddrc_burstchop = 0x0 + // .. .. ==> 0XF8006034[28:28] = 0x00000000U + // .. .. ==> MASK : 0x10000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006034, 0x13FF3FFFU ,0x00011014U), + // .. .. reg_ddrc_force_low_pri_n = 0x0 + // .. .. ==> 0XF8006038[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_dis_dq = 0x0 + // .. .. ==> 0XF8006038[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_phy_debug_mode = 0x0 + // .. .. ==> 0XF8006038[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. reg_phy_wr_level_start = 0x0 + // .. .. ==> 0XF8006038[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. reg_phy_rd_level_start = 0x0 + // .. .. ==> 0XF8006038[8:8] = 0x00000000U + // .. .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. .. reg_phy_dq0_wait_t = 0x0 + // .. .. ==> 0XF8006038[12:9] = 0x00000000U + // .. .. ==> MASK : 0x00001E00U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006038, 0x00001FC3U ,0x00000000U), + // .. .. reg_ddrc_addrmap_bank_b0 = 0x7 + // .. .. ==> 0XF800603C[3:0] = 0x00000007U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000007U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x7 + // .. .. ==> 0XF800603C[7:4] = 0x00000007U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000070U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x7 + // .. .. ==> 0XF800603C[11:8] = 0x00000007U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000700U + // .. .. reg_ddrc_addrmap_col_b5 = 0x0 + // .. .. ==> 0XF800603C[15:12] = 0x00000000U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b6 = 0x0 + // .. .. ==> 0XF800603C[19:16] = 0x00000000U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800603C, 0x000FFFFFU ,0x00000777U), + // .. .. reg_ddrc_addrmap_col_b2 = 0x0 + // .. .. ==> 0XF8006040[3:0] = 0x00000000U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b3 = 0x0 + // .. .. ==> 0XF8006040[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b4 = 0x0 + // .. .. ==> 0XF8006040[11:8] = 0x00000000U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b7 = 0x0 + // .. .. ==> 0XF8006040[15:12] = 0x00000000U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b8 = 0x0 + // .. .. ==> 0XF8006040[19:16] = 0x00000000U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b9 = 0xf + // .. .. ==> 0XF8006040[23:20] = 0x0000000FU + // .. .. ==> MASK : 0x00F00000U VAL : 0x00F00000U + // .. .. reg_ddrc_addrmap_col_b10 = 0xf + // .. .. ==> 0XF8006040[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. reg_ddrc_addrmap_col_b11 = 0xf + // .. .. ==> 0XF8006040[31:28] = 0x0000000FU + // .. .. ==> MASK : 0xF0000000U VAL : 0xF0000000U + // .. .. + EMIT_MASKWRITE(0XF8006040, 0xFFFFFFFFU ,0xFFF00000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x6 + // .. .. ==> 0XF8006044[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_row_b1 = 0x6 + // .. .. ==> 0XF8006044[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x6 + // .. .. ==> 0XF8006044[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. reg_ddrc_addrmap_row_b12 = 0x6 + // .. .. ==> 0XF8006044[15:12] = 0x00000006U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00006000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x6 + // .. .. ==> 0XF8006044[19:16] = 0x00000006U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00060000U + // .. .. reg_ddrc_addrmap_row_b14 = 0xf + // .. .. ==> 0XF8006044[23:20] = 0x0000000FU + // .. .. ==> MASK : 0x00F00000U VAL : 0x00F00000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0FF66666U), + // .. .. reg_ddrc_rank0_rd_odt = 0x0 + // .. .. ==> 0XF8006048[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. reg_ddrc_rank0_wr_odt = 0x1 + // .. .. ==> 0XF8006048[5:3] = 0x00000001U + // .. .. ==> MASK : 0x00000038U VAL : 0x00000008U + // .. .. reg_ddrc_rank1_rd_odt = 0x1 + // .. .. ==> 0XF8006048[8:6] = 0x00000001U + // .. .. ==> MASK : 0x000001C0U VAL : 0x00000040U + // .. .. reg_ddrc_rank1_wr_odt = 0x1 + // .. .. ==> 0XF8006048[11:9] = 0x00000001U + // .. .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. .. reg_phy_rd_local_odt = 0x0 + // .. .. ==> 0XF8006048[13:12] = 0x00000000U + // .. .. ==> MASK : 0x00003000U VAL : 0x00000000U + // .. .. reg_phy_wr_local_odt = 0x3 + // .. .. ==> 0XF8006048[15:14] = 0x00000003U + // .. .. ==> MASK : 0x0000C000U VAL : 0x0000C000U + // .. .. reg_phy_idle_local_odt = 0x3 + // .. .. ==> 0XF8006048[17:16] = 0x00000003U + // .. .. ==> MASK : 0x00030000U VAL : 0x00030000U + // .. .. reg_ddrc_rank2_rd_odt = 0x0 + // .. .. ==> 0XF8006048[20:18] = 0x00000000U + // .. .. ==> MASK : 0x001C0000U VAL : 0x00000000U + // .. .. reg_ddrc_rank2_wr_odt = 0x0 + // .. .. ==> 0XF8006048[23:21] = 0x00000000U + // .. .. ==> MASK : 0x00E00000U VAL : 0x00000000U + // .. .. reg_ddrc_rank3_rd_odt = 0x0 + // .. .. ==> 0XF8006048[26:24] = 0x00000000U + // .. .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. .. reg_ddrc_rank3_wr_odt = 0x0 + // .. .. ==> 0XF8006048[29:27] = 0x00000000U + // .. .. ==> MASK : 0x38000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x3FFFFFFFU ,0x0003C248U), + // .. .. reg_phy_rd_cmd_to_data = 0x0 + // .. .. ==> 0XF8006050[3:0] = 0x00000000U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. .. reg_phy_wr_cmd_to_data = 0x0 + // .. .. ==> 0XF8006050[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_phy_rdc_we_to_re_delay = 0x8 + // .. .. ==> 0XF8006050[11:8] = 0x00000008U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000800U + // .. .. reg_phy_rdc_fifo_rst_disable = 0x0 + // .. .. ==> 0XF8006050[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. reg_phy_use_fixed_re = 0x1 + // .. .. ==> 0XF8006050[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. reg_phy_rdc_fifo_rst_err_cnt_clr = 0x0 + // .. .. ==> 0XF8006050[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_phy_dis_phy_ctrl_rstn = 0x0 + // .. .. ==> 0XF8006050[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. reg_phy_clk_stall_level = 0x0 + // .. .. ==> 0XF8006050[19:19] = 0x00000000U + // .. .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. .. reg_phy_gatelvl_num_of_dq0 = 0x7 + // .. .. ==> 0XF8006050[27:24] = 0x00000007U + // .. .. ==> MASK : 0x0F000000U VAL : 0x07000000U + // .. .. reg_phy_wrlvl_num_of_dq0 = 0x7 + // .. .. ==> 0XF8006050[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF8006050, 0xFF0F8FFFU ,0x77010800U), + // .. .. reg_ddrc_dll_calib_to_min_x1024 = 0x1 + // .. .. ==> 0XF8006058[7:0] = 0x00000001U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000001U + // .. .. reg_ddrc_dll_calib_to_max_x1024 = 0x1 + // .. .. ==> 0XF8006058[15:8] = 0x00000001U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00000100U + // .. .. reg_ddrc_dis_dll_calib = 0x0 + // .. .. ==> 0XF8006058[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006058, 0x0001FFFFU ,0x00000101U), + // .. .. reg_ddrc_rd_odt_delay = 0x3 + // .. .. ==> 0XF800605C[3:0] = 0x00000003U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000003U + // .. .. reg_ddrc_wr_odt_delay = 0x0 + // .. .. ==> 0XF800605C[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_ddrc_rd_odt_hold = 0x0 + // .. .. ==> 0XF800605C[11:8] = 0x00000000U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000000U + // .. .. reg_ddrc_wr_odt_hold = 0x5 + // .. .. ==> 0XF800605C[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. + EMIT_MASKWRITE(0XF800605C, 0x0000FFFFU ,0x00005003U), + // .. .. reg_ddrc_pageclose = 0x0 + // .. .. ==> 0XF8006060[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_lpr_num_entries = 0x1f + // .. .. ==> 0XF8006060[6:1] = 0x0000001FU + // .. .. ==> MASK : 0x0000007EU VAL : 0x0000003EU + // .. .. reg_ddrc_auto_pre_en = 0x0 + // .. .. ==> 0XF8006060[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. reg_ddrc_refresh_update_level = 0x0 + // .. .. ==> 0XF8006060[8:8] = 0x00000000U + // .. .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. .. reg_ddrc_dis_wc = 0x0 + // .. .. ==> 0XF8006060[9:9] = 0x00000000U + // .. .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. .. reg_ddrc_dis_collision_page_opt = 0x0 + // .. .. ==> 0XF8006060[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_ddrc_selfref_en = 0x0 + // .. .. ==> 0XF8006060[12:12] = 0x00000000U + // .. .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006060, 0x000017FFU ,0x0000003EU), + // .. .. reg_ddrc_go2critical_hysteresis = 0x0 + // .. .. ==> 0XF8006064[12:5] = 0x00000000U + // .. .. ==> MASK : 0x00001FE0U VAL : 0x00000000U + // .. .. reg_arb_go2critical_en = 0x1 + // .. .. ==> 0XF8006064[17:17] = 0x00000001U + // .. .. ==> MASK : 0x00020000U VAL : 0x00020000U + // .. .. + EMIT_MASKWRITE(0XF8006064, 0x00021FE0U ,0x00020000U), + // .. .. reg_ddrc_wrlvl_ww = 0x41 + // .. .. ==> 0XF8006068[7:0] = 0x00000041U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000041U + // .. .. reg_ddrc_rdlvl_rr = 0x41 + // .. .. ==> 0XF8006068[15:8] = 0x00000041U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00004100U + // .. .. reg_ddrc_dfi_t_wlmrd = 0x28 + // .. .. ==> 0XF8006068[25:16] = 0x00000028U + // .. .. ==> MASK : 0x03FF0000U VAL : 0x00280000U + // .. .. + EMIT_MASKWRITE(0XF8006068, 0x03FFFFFFU ,0x00284141U), + // .. .. dfi_t_ctrlupd_interval_min_x1024 = 0x10 + // .. .. ==> 0XF800606C[7:0] = 0x00000010U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000010U + // .. .. dfi_t_ctrlupd_interval_max_x1024 = 0x16 + // .. .. ==> 0XF800606C[15:8] = 0x00000016U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00001600U + // .. .. + EMIT_MASKWRITE(0XF800606C, 0x0000FFFFU ,0x00001610U), + // .. .. reg_ddrc_dfi_t_ctrl_delay = 0x1 + // .. .. ==> 0XF8006078[3:0] = 0x00000001U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000001U + // .. .. reg_ddrc_dfi_t_dram_clk_disable = 0x1 + // .. .. ==> 0XF8006078[7:4] = 0x00000001U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000010U + // .. .. reg_ddrc_dfi_t_dram_clk_enable = 0x1 + // .. .. ==> 0XF8006078[11:8] = 0x00000001U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000100U + // .. .. reg_ddrc_t_cksre = 0x6 + // .. .. ==> 0XF8006078[15:12] = 0x00000006U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00006000U + // .. .. reg_ddrc_t_cksrx = 0x6 + // .. .. ==> 0XF8006078[19:16] = 0x00000006U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00060000U + // .. .. reg_ddrc_t_ckesr = 0x4 + // .. .. ==> 0XF8006078[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8006078, 0x03FFFFFFU ,0x00466111U), + // .. .. reg_ddrc_t_ckpde = 0x2 + // .. .. ==> 0XF800607C[3:0] = 0x00000002U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000002U + // .. .. reg_ddrc_t_ckpdx = 0x2 + // .. .. ==> 0XF800607C[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. reg_ddrc_t_ckdpde = 0x2 + // .. .. ==> 0XF800607C[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. reg_ddrc_t_ckdpdx = 0x2 + // .. .. ==> 0XF800607C[15:12] = 0x00000002U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00002000U + // .. .. reg_ddrc_t_ckcsx = 0x3 + // .. .. ==> 0XF800607C[19:16] = 0x00000003U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00030000U + // .. .. + EMIT_MASKWRITE(0XF800607C, 0x000FFFFFU ,0x00032222U), + // .. .. refresh_timer0_start_value_x32 = 0x0 + // .. .. ==> 0XF80060A0[11:0] = 0x00000000U + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000000U + // .. .. refresh_timer1_start_value_x32 = 0x8 + // .. .. ==> 0XF80060A0[23:12] = 0x00000008U + // .. .. ==> MASK : 0x00FFF000U VAL : 0x00008000U + // .. .. + EMIT_MASKWRITE(0XF80060A0, 0x00FFFFFFU ,0x00008000U), + // .. .. reg_ddrc_dis_auto_zq = 0x0 + // .. .. ==> 0XF80060A4[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_ddr3 = 0x1 + // .. .. ==> 0XF80060A4[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. reg_ddrc_t_mod = 0x200 + // .. .. ==> 0XF80060A4[11:2] = 0x00000200U + // .. .. ==> MASK : 0x00000FFCU VAL : 0x00000800U + // .. .. reg_ddrc_t_zq_long_nop = 0x200 + // .. .. ==> 0XF80060A4[21:12] = 0x00000200U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00200000U + // .. .. reg_ddrc_t_zq_short_nop = 0x40 + // .. .. ==> 0XF80060A4[31:22] = 0x00000040U + // .. .. ==> MASK : 0xFFC00000U VAL : 0x10000000U + // .. .. + EMIT_MASKWRITE(0XF80060A4, 0xFFFFFFFFU ,0x10200802U), + // .. .. t_zq_short_interval_x1024 = 0xc845 + // .. .. ==> 0XF80060A8[19:0] = 0x0000C845U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000C845U + // .. .. dram_rstn_x1024 = 0x67 + // .. .. ==> 0XF80060A8[27:20] = 0x00000067U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06700000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0670C845U), + // .. .. deeppowerdown_en = 0x0 + // .. .. ==> 0XF80060AC[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. deeppowerdown_to_x1024 = 0xff + // .. .. ==> 0XF80060AC[8:1] = 0x000000FFU + // .. .. ==> MASK : 0x000001FEU VAL : 0x000001FEU + // .. .. + EMIT_MASKWRITE(0XF80060AC, 0x000001FFU ,0x000001FEU), + // .. .. dfi_wrlvl_max_x1024 = 0xfff + // .. .. ==> 0XF80060B0[11:0] = 0x00000FFFU + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000FFFU + // .. .. dfi_rdlvl_max_x1024 = 0xfff + // .. .. ==> 0XF80060B0[23:12] = 0x00000FFFU + // .. .. ==> MASK : 0x00FFF000U VAL : 0x00FFF000U + // .. .. ddrc_reg_twrlvl_max_error = 0x0 + // .. .. ==> 0XF80060B0[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. ddrc_reg_trdlvl_max_error = 0x0 + // .. .. ==> 0XF80060B0[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reg_ddrc_dfi_wr_level_en = 0x1 + // .. .. ==> 0XF80060B0[26:26] = 0x00000001U + // .. .. ==> MASK : 0x04000000U VAL : 0x04000000U + // .. .. reg_ddrc_dfi_rd_dqs_gate_level = 0x1 + // .. .. ==> 0XF80060B0[27:27] = 0x00000001U + // .. .. ==> MASK : 0x08000000U VAL : 0x08000000U + // .. .. reg_ddrc_dfi_rd_data_eye_train = 0x1 + // .. .. ==> 0XF80060B0[28:28] = 0x00000001U + // .. .. ==> MASK : 0x10000000U VAL : 0x10000000U + // .. .. + EMIT_MASKWRITE(0XF80060B0, 0x1FFFFFFFU ,0x1CFFFFFFU), + // .. .. reg_ddrc_2t_delay = 0x0 + // .. .. ==> 0XF80060B4[8:0] = 0x00000000U + // .. .. ==> MASK : 0x000001FFU VAL : 0x00000000U + // .. .. reg_ddrc_skip_ocd = 0x1 + // .. .. ==> 0XF80060B4[9:9] = 0x00000001U + // .. .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. .. reg_ddrc_dis_pre_bypass = 0x0 + // .. .. ==> 0XF80060B4[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF80060B4, 0x000007FFU ,0x00000200U), + // .. .. reg_ddrc_dfi_t_rddata_en = 0x6 + // .. .. ==> 0XF80060B8[4:0] = 0x00000006U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000006U + // .. .. reg_ddrc_dfi_t_ctrlup_min = 0x3 + // .. .. ==> 0XF80060B8[14:5] = 0x00000003U + // .. .. ==> MASK : 0x00007FE0U VAL : 0x00000060U + // .. .. reg_ddrc_dfi_t_ctrlup_max = 0x40 + // .. .. ==> 0XF80060B8[24:15] = 0x00000040U + // .. .. ==> MASK : 0x01FF8000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF80060B8, 0x01FFFFFFU ,0x00200066U), + // .. .. Clear_Uncorrectable_DRAM_ECC_error = 1 + // .. .. ==> 0XF80060C4[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. Clear_Correctable_DRAM_ECC_error = 1 + // .. .. ==> 0XF80060C4[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. + EMIT_MASKWRITE(0XF80060C4, 0x00000003U ,0x00000003U), + // .. FINISH: DDR INITIALIZATION + // .. Clear_Uncorrectable_DRAM_ECC_error = 0x0 + // .. ==> 0XF80060C4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. Clear_Correctable_DRAM_ECC_error = 0x0 + // .. ==> 0XF80060C4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80060C4, 0x00000003U ,0x00000000U), + // .. CORR_ECC_LOG_VALID = 0x0 + // .. ==> 0XF80060C8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. ECC_CORRECTED_BIT_NUM = 0x0 + // .. ==> 0XF80060C8[7:1] = 0x00000000U + // .. ==> MASK : 0x000000FEU VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80060C8, 0x000000FFU ,0x00000000U), + // .. UNCORR_ECC_LOG_VALID = 0x0 + // .. ==> 0XF80060DC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80060DC, 0x00000001U ,0x00000000U), + // .. STAT_NUM_CORR_ERR = 0x0 + // .. ==> 0XF80060F0[15:8] = 0x00000000U + // .. ==> MASK : 0x0000FF00U VAL : 0x00000000U + // .. STAT_NUM_UNCORR_ERR = 0x0 + // .. ==> 0XF80060F0[7:0] = 0x00000000U + // .. ==> MASK : 0x000000FFU VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80060F0, 0x0000FFFFU ,0x00000000U), + // .. reg_ddrc_ecc_mode = 0x0 + // .. ==> 0XF80060F4[2:0] = 0x00000000U + // .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. reg_ddrc_dis_scrub = 0x1 + // .. ==> 0XF80060F4[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. + EMIT_MASKWRITE(0XF80060F4, 0x0000000FU ,0x00000008U), + // .. reg_phy_dif_on = 0x0 + // .. ==> 0XF8006114[3:0] = 0x00000000U + // .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. reg_phy_dif_off = 0x0 + // .. ==> 0XF8006114[7:4] = 0x00000000U + // .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006114, 0x000000FFU ,0x00000000U), + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF8006118[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF8006118[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF8006118[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF8006118[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF8006118[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF8006118[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF8006118[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF8006118[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF8006118[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. + EMIT_MASKWRITE(0XF8006118, 0x7FFFFFFFU ,0x40000001U), + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF800611C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF800611C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF800611C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF800611C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF800611C[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF800611C[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF800611C[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF800611C[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF800611C[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. + EMIT_MASKWRITE(0XF800611C, 0x7FFFFFFFU ,0x40000001U), + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF8006120[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF8006120[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF8006120[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF8006120[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF8006120[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF8006120[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF8006120[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF8006120[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF8006120[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF8006120[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF8006120[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF8006120[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF8006120[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF8006120[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF8006120[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF8006120[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF8006120[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF8006120[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. + EMIT_MASKWRITE(0XF8006120, 0x7FFFFFFFU ,0x40000001U), + // .. reg_phy_data_slice_in_use = 0x1 + // .. ==> 0XF8006124[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_phy_rdlvl_inc_mode = 0x0 + // .. ==> 0XF8006124[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_gatelvl_inc_mode = 0x0 + // .. ==> 0XF8006124[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_wrlvl_inc_mode = 0x0 + // .. ==> 0XF8006124[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_board_lpbk_tx = 0x0 + // .. ==> 0XF8006124[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_board_lpbk_rx = 0x0 + // .. ==> 0XF8006124[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. reg_phy_bist_shift_dq = 0x0 + // .. ==> 0XF8006124[14:6] = 0x00000000U + // .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. reg_phy_bist_err_clr = 0x0 + // .. ==> 0XF8006124[23:15] = 0x00000000U + // .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. reg_phy_dq_offset = 0x40 + // .. ==> 0XF8006124[30:24] = 0x00000040U + // .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. + EMIT_MASKWRITE(0XF8006124, 0x7FFFFFFFU ,0x40000001U), + // .. reg_phy_wrlvl_init_ratio = 0x0 + // .. ==> 0XF800612C[9:0] = 0x00000000U + // .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. reg_phy_gatelvl_init_ratio = 0x8f + // .. ==> 0XF800612C[19:10] = 0x0000008FU + // .. ==> MASK : 0x000FFC00U VAL : 0x00023C00U + // .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00023C00U), + // .. reg_phy_wrlvl_init_ratio = 0x0 + // .. ==> 0XF8006130[9:0] = 0x00000000U + // .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. reg_phy_gatelvl_init_ratio = 0x8a + // .. ==> 0XF8006130[19:10] = 0x0000008AU + // .. ==> MASK : 0x000FFC00U VAL : 0x00022800U + // .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00022800U), + // .. reg_phy_wrlvl_init_ratio = 0x0 + // .. ==> 0XF8006134[9:0] = 0x00000000U + // .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. reg_phy_gatelvl_init_ratio = 0x8b + // .. ==> 0XF8006134[19:10] = 0x0000008BU + // .. ==> MASK : 0x000FFC00U VAL : 0x00022C00U + // .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00022C00U), + // .. reg_phy_wrlvl_init_ratio = 0x0 + // .. ==> 0XF8006138[9:0] = 0x00000000U + // .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. reg_phy_gatelvl_init_ratio = 0x92 + // .. ==> 0XF8006138[19:10] = 0x00000092U + // .. ==> MASK : 0x000FFC00U VAL : 0x00024800U + // .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00024800U), + // .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. ==> 0XF8006140[9:0] = 0x00000035U + // .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. reg_phy_rd_dqs_slave_force = 0x0 + // .. ==> 0XF8006140[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. ==> 0XF8006140[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006140, 0x000FFFFFU ,0x00000035U), + // .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. ==> 0XF8006144[9:0] = 0x00000035U + // .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. reg_phy_rd_dqs_slave_force = 0x0 + // .. ==> 0XF8006144[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. ==> 0XF8006144[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006144, 0x000FFFFFU ,0x00000035U), + // .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. ==> 0XF8006148[9:0] = 0x00000035U + // .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. reg_phy_rd_dqs_slave_force = 0x0 + // .. ==> 0XF8006148[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. ==> 0XF8006148[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006148, 0x000FFFFFU ,0x00000035U), + // .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. ==> 0XF800614C[9:0] = 0x00000035U + // .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. reg_phy_rd_dqs_slave_force = 0x0 + // .. ==> 0XF800614C[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. ==> 0XF800614C[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800614C, 0x000FFFFFU ,0x00000035U), + // .. reg_phy_wr_dqs_slave_ratio = 0x77 + // .. ==> 0XF8006154[9:0] = 0x00000077U + // .. ==> MASK : 0x000003FFU VAL : 0x00000077U + // .. reg_phy_wr_dqs_slave_force = 0x0 + // .. ==> 0XF8006154[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. ==> 0XF8006154[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006154, 0x000FFFFFU ,0x00000077U), + // .. reg_phy_wr_dqs_slave_ratio = 0x7c + // .. ==> 0XF8006158[9:0] = 0x0000007CU + // .. ==> MASK : 0x000003FFU VAL : 0x0000007CU + // .. reg_phy_wr_dqs_slave_force = 0x0 + // .. ==> 0XF8006158[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. ==> 0XF8006158[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006158, 0x000FFFFFU ,0x0000007CU), + // .. reg_phy_wr_dqs_slave_ratio = 0x7c + // .. ==> 0XF800615C[9:0] = 0x0000007CU + // .. ==> MASK : 0x000003FFU VAL : 0x0000007CU + // .. reg_phy_wr_dqs_slave_force = 0x0 + // .. ==> 0XF800615C[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. ==> 0XF800615C[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800615C, 0x000FFFFFU ,0x0000007CU), + // .. reg_phy_wr_dqs_slave_ratio = 0x75 + // .. ==> 0XF8006160[9:0] = 0x00000075U + // .. ==> MASK : 0x000003FFU VAL : 0x00000075U + // .. reg_phy_wr_dqs_slave_force = 0x0 + // .. ==> 0XF8006160[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. ==> 0XF8006160[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006160, 0x000FFFFFU ,0x00000075U), + // .. reg_phy_fifo_we_slave_ratio = 0xe4 + // .. ==> 0XF8006168[10:0] = 0x000000E4U + // .. ==> MASK : 0x000007FFU VAL : 0x000000E4U + // .. reg_phy_fifo_we_in_force = 0x0 + // .. ==> 0XF8006168[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reg_phy_fifo_we_in_delay = 0x0 + // .. ==> 0XF8006168[20:12] = 0x00000000U + // .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006168, 0x001FFFFFU ,0x000000E4U), + // .. reg_phy_fifo_we_slave_ratio = 0xdf + // .. ==> 0XF800616C[10:0] = 0x000000DFU + // .. ==> MASK : 0x000007FFU VAL : 0x000000DFU + // .. reg_phy_fifo_we_in_force = 0x0 + // .. ==> 0XF800616C[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reg_phy_fifo_we_in_delay = 0x0 + // .. ==> 0XF800616C[20:12] = 0x00000000U + // .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800616C, 0x001FFFFFU ,0x000000DFU), + // .. reg_phy_fifo_we_slave_ratio = 0xe0 + // .. ==> 0XF8006170[10:0] = 0x000000E0U + // .. ==> MASK : 0x000007FFU VAL : 0x000000E0U + // .. reg_phy_fifo_we_in_force = 0x0 + // .. ==> 0XF8006170[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reg_phy_fifo_we_in_delay = 0x0 + // .. ==> 0XF8006170[20:12] = 0x00000000U + // .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006170, 0x001FFFFFU ,0x000000E0U), + // .. reg_phy_fifo_we_slave_ratio = 0xe7 + // .. ==> 0XF8006174[10:0] = 0x000000E7U + // .. ==> MASK : 0x000007FFU VAL : 0x000000E7U + // .. reg_phy_fifo_we_in_force = 0x0 + // .. ==> 0XF8006174[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reg_phy_fifo_we_in_delay = 0x0 + // .. ==> 0XF8006174[20:12] = 0x00000000U + // .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006174, 0x001FFFFFU ,0x000000E7U), + // .. reg_phy_wr_data_slave_ratio = 0xb7 + // .. ==> 0XF800617C[9:0] = 0x000000B7U + // .. ==> MASK : 0x000003FFU VAL : 0x000000B7U + // .. reg_phy_wr_data_slave_force = 0x0 + // .. ==> 0XF800617C[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_data_slave_delay = 0x0 + // .. ==> 0XF800617C[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800617C, 0x000FFFFFU ,0x000000B7U), + // .. reg_phy_wr_data_slave_ratio = 0xbc + // .. ==> 0XF8006180[9:0] = 0x000000BCU + // .. ==> MASK : 0x000003FFU VAL : 0x000000BCU + // .. reg_phy_wr_data_slave_force = 0x0 + // .. ==> 0XF8006180[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_data_slave_delay = 0x0 + // .. ==> 0XF8006180[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006180, 0x000FFFFFU ,0x000000BCU), + // .. reg_phy_wr_data_slave_ratio = 0xbc + // .. ==> 0XF8006184[9:0] = 0x000000BCU + // .. ==> MASK : 0x000003FFU VAL : 0x000000BCU + // .. reg_phy_wr_data_slave_force = 0x0 + // .. ==> 0XF8006184[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_data_slave_delay = 0x0 + // .. ==> 0XF8006184[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006184, 0x000FFFFFU ,0x000000BCU), + // .. reg_phy_wr_data_slave_ratio = 0xb5 + // .. ==> 0XF8006188[9:0] = 0x000000B5U + // .. ==> MASK : 0x000003FFU VAL : 0x000000B5U + // .. reg_phy_wr_data_slave_force = 0x0 + // .. ==> 0XF8006188[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reg_phy_wr_data_slave_delay = 0x0 + // .. ==> 0XF8006188[19:11] = 0x00000000U + // .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006188, 0x000FFFFFU ,0x000000B5U), + // .. reg_phy_loopback = 0x0 + // .. ==> 0XF8006190[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. reg_phy_bl2 = 0x0 + // .. ==> 0XF8006190[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_phy_at_spd_atpg = 0x0 + // .. ==> 0XF8006190[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_phy_bist_enable = 0x0 + // .. ==> 0XF8006190[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. reg_phy_bist_force_err = 0x0 + // .. ==> 0XF8006190[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. reg_phy_bist_mode = 0x0 + // .. ==> 0XF8006190[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. reg_phy_invert_clkout = 0x1 + // .. ==> 0XF8006190[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. reg_phy_all_dq_mpr_rd_resp = 0x0 + // .. ==> 0XF8006190[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. reg_phy_sel_logic = 0x0 + // .. ==> 0XF8006190[9:9] = 0x00000000U + // .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. reg_phy_ctrl_slave_ratio = 0x100 + // .. ==> 0XF8006190[19:10] = 0x00000100U + // .. ==> MASK : 0x000FFC00U VAL : 0x00040000U + // .. reg_phy_ctrl_slave_force = 0x0 + // .. ==> 0XF8006190[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. reg_phy_ctrl_slave_delay = 0x0 + // .. ==> 0XF8006190[27:21] = 0x00000000U + // .. ==> MASK : 0x0FE00000U VAL : 0x00000000U + // .. reg_phy_use_rank0_delays = 0x1 + // .. ==> 0XF8006190[28:28] = 0x00000001U + // .. ==> MASK : 0x10000000U VAL : 0x10000000U + // .. reg_phy_lpddr = 0x0 + // .. ==> 0XF8006190[29:29] = 0x00000000U + // .. ==> MASK : 0x20000000U VAL : 0x00000000U + // .. reg_phy_cmd_latency = 0x0 + // .. ==> 0XF8006190[30:30] = 0x00000000U + // .. ==> MASK : 0x40000000U VAL : 0x00000000U + // .. reg_phy_int_lpbk = 0x0 + // .. ==> 0XF8006190[31:31] = 0x00000000U + // .. ==> MASK : 0x80000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006190, 0xFFFFFFFFU ,0x10040080U), + // .. reg_phy_wr_rl_delay = 0x2 + // .. ==> 0XF8006194[4:0] = 0x00000002U + // .. ==> MASK : 0x0000001FU VAL : 0x00000002U + // .. reg_phy_rd_rl_delay = 0x4 + // .. ==> 0XF8006194[9:5] = 0x00000004U + // .. ==> MASK : 0x000003E0U VAL : 0x00000080U + // .. reg_phy_dll_lock_diff = 0xf + // .. ==> 0XF8006194[13:10] = 0x0000000FU + // .. ==> MASK : 0x00003C00U VAL : 0x00003C00U + // .. reg_phy_use_wr_level = 0x1 + // .. ==> 0XF8006194[14:14] = 0x00000001U + // .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. reg_phy_use_rd_dqs_gate_level = 0x1 + // .. ==> 0XF8006194[15:15] = 0x00000001U + // .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. reg_phy_use_rd_data_eye_level = 0x1 + // .. ==> 0XF8006194[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. reg_phy_dis_calib_rst = 0x0 + // .. ==> 0XF8006194[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_phy_ctrl_slave_delay = 0x0 + // .. ==> 0XF8006194[19:18] = 0x00000000U + // .. ==> MASK : 0x000C0000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006194, 0x000FFFFFU ,0x0001FC82U), + // .. reg_arb_page_addr_mask = 0x0 + // .. ==> 0XF8006204[31:0] = 0x00000000U + // .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006204, 0xFFFFFFFFU ,0x00000000U), + // .. reg_arb_pri_wr_portn = 0x3ff + // .. ==> 0XF8006208[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_wr_portn = 0x0 + // .. ==> 0XF8006208[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. ==> 0XF8006208[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. ==> 0XF8006208[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_dis_rmw_portn = 0x1 + // .. ==> 0XF8006208[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XF8006208, 0x000F03FFU ,0x000803FFU), + // .. reg_arb_pri_wr_portn = 0x3ff + // .. ==> 0XF800620C[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_wr_portn = 0x0 + // .. ==> 0XF800620C[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. ==> 0XF800620C[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. ==> 0XF800620C[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_dis_rmw_portn = 0x1 + // .. ==> 0XF800620C[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XF800620C, 0x000F03FFU ,0x000803FFU), + // .. reg_arb_pri_wr_portn = 0x3ff + // .. ==> 0XF8006210[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_wr_portn = 0x0 + // .. ==> 0XF8006210[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. ==> 0XF8006210[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. ==> 0XF8006210[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_dis_rmw_portn = 0x1 + // .. ==> 0XF8006210[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XF8006210, 0x000F03FFU ,0x000803FFU), + // .. reg_arb_pri_wr_portn = 0x3ff + // .. ==> 0XF8006214[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_wr_portn = 0x0 + // .. ==> 0XF8006214[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. ==> 0XF8006214[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. ==> 0XF8006214[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_dis_rmw_portn = 0x1 + // .. ==> 0XF8006214[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XF8006214, 0x000F03FFU ,0x000803FFU), + // .. reg_arb_pri_rd_portn = 0x3ff + // .. ==> 0XF8006218[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_rd_portn = 0x0 + // .. ==> 0XF8006218[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. ==> 0XF8006218[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. ==> 0XF8006218[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_set_hpr_rd_portn = 0x0 + // .. ==> 0XF8006218[19:19] = 0x00000000U + // .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006218, 0x000F03FFU ,0x000003FFU), + // .. reg_arb_pri_rd_portn = 0x3ff + // .. ==> 0XF800621C[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_rd_portn = 0x0 + // .. ==> 0XF800621C[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. ==> 0XF800621C[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. ==> 0XF800621C[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_set_hpr_rd_portn = 0x0 + // .. ==> 0XF800621C[19:19] = 0x00000000U + // .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800621C, 0x000F03FFU ,0x000003FFU), + // .. reg_arb_pri_rd_portn = 0x3ff + // .. ==> 0XF8006220[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_rd_portn = 0x0 + // .. ==> 0XF8006220[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. ==> 0XF8006220[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. ==> 0XF8006220[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_set_hpr_rd_portn = 0x0 + // .. ==> 0XF8006220[19:19] = 0x00000000U + // .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006220, 0x000F03FFU ,0x000003FFU), + // .. reg_arb_pri_rd_portn = 0x3ff + // .. ==> 0XF8006224[9:0] = 0x000003FFU + // .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. reg_arb_disable_aging_rd_portn = 0x0 + // .. ==> 0XF8006224[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. ==> 0XF8006224[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. ==> 0XF8006224[18:18] = 0x00000000U + // .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. reg_arb_set_hpr_rd_portn = 0x0 + // .. ==> 0XF8006224[19:19] = 0x00000000U + // .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006224, 0x000F03FFU ,0x000003FFU), + // .. reg_ddrc_lpddr2 = 0x0 + // .. ==> 0XF80062A8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. reg_ddrc_per_bank_refresh = 0x0 + // .. ==> 0XF80062A8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_ddrc_derate_enable = 0x0 + // .. ==> 0XF80062A8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. reg_ddrc_mr4_margin = 0x0 + // .. ==> 0XF80062A8[11:4] = 0x00000000U + // .. ==> MASK : 0x00000FF0U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80062A8, 0x00000FF7U ,0x00000000U), + // .. reg_ddrc_mr4_read_interval = 0x0 + // .. ==> 0XF80062AC[31:0] = 0x00000000U + // .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80062AC, 0xFFFFFFFFU ,0x00000000U), + // .. reg_ddrc_min_stable_clock_x1 = 0x5 + // .. ==> 0XF80062B0[3:0] = 0x00000005U + // .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. reg_ddrc_idle_after_reset_x32 = 0x12 + // .. ==> 0XF80062B0[11:4] = 0x00000012U + // .. ==> MASK : 0x00000FF0U VAL : 0x00000120U + // .. reg_ddrc_t_mrw = 0x5 + // .. ==> 0XF80062B0[21:12] = 0x00000005U + // .. ==> MASK : 0x003FF000U VAL : 0x00005000U + // .. + EMIT_MASKWRITE(0XF80062B0, 0x003FFFFFU ,0x00005125U), + // .. reg_ddrc_max_auto_init_x1024 = 0xa6 + // .. ==> 0XF80062B4[7:0] = 0x000000A6U + // .. ==> MASK : 0x000000FFU VAL : 0x000000A6U + // .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A6U), + // .. START: POLL ON DCI STATUS + // .. DONE = 1 + // .. ==> 0XF8000B74[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKPOLL(0XF8000B74, 0x00002000U), + // .. FINISH: POLL ON DCI STATUS + // .. START: UNLOCK DDR + // .. reg_ddrc_soft_rstb = 0x1 + // .. ==> 0XF8006000[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. reg_ddrc_powerdown_en = 0x0 + // .. ==> 0XF8006000[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. reg_ddrc_data_bus_width = 0x0 + // .. ==> 0XF8006000[3:2] = 0x00000000U + // .. ==> MASK : 0x0000000CU VAL : 0x00000000U + // .. reg_ddrc_burst8_refresh = 0x0 + // .. ==> 0XF8006000[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. reg_ddrc_rdwr_idle_gap = 1 + // .. ==> 0XF8006000[13:7] = 0x00000001U + // .. ==> MASK : 0x00003F80U VAL : 0x00000080U + // .. reg_ddrc_dis_rd_bypass = 0x0 + // .. ==> 0XF8006000[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. reg_ddrc_dis_act_bypass = 0x0 + // .. ==> 0XF8006000[15:15] = 0x00000000U + // .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. reg_ddrc_dis_auto_refresh = 0x0 + // .. ==> 0XF8006000[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8006000, 0x0001FFFFU ,0x00000081U), + // .. FINISH: UNLOCK DDR + // .. START: CHECK DDR STATUS + // .. ddrc_reg_operating_mode = 1 + // .. ==> 0XF8006054[2:0] = 0x00000001U + // .. ==> MASK : 0x00000007U VAL : 0x00000001U + // .. + EMIT_MASKPOLL(0XF8006054, 0x00000007U), + // .. FINISH: CHECK DDR STATUS + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_mio_init_data_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. VREF_EN = 0x1 + // .. ==> 0XF8000B00[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B00[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. CLK_PULLUP_EN = 0x0 + // .. ==> 0XF8000B00[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. SRSTN_PULLUP_EN = 0x0 + // .. ==> 0XF8000B00[9:9] = 0x00000000U + // .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B00, 0x00000303U ,0x00000001U), + // .. FINISH: OCM REMAPPING + // .. START: DDRIOB SETTINGS + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B40[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B40[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B40[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B40[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B40[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B40[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B40[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B40[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B40[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B40, 0x00000FFFU ,0x00000600U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B44[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B44[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B44[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B44[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B44[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B44[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B44[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B44[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B44[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B44, 0x00000FFFU ,0x00000600U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B48[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x1 + // .. ==> 0XF8000B48[2:1] = 0x00000001U + // .. ==> MASK : 0x00000006U VAL : 0x00000002U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B48[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B48[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCR_TYPE = 0x3 + // .. ==> 0XF8000B48[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B48[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B48[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B48[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B48[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B48, 0x00000FFFU ,0x00000672U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B4C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x1 + // .. ==> 0XF8000B4C[2:1] = 0x00000001U + // .. ==> MASK : 0x00000006U VAL : 0x00000002U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B4C[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCR_TYPE = 0x3 + // .. ==> 0XF8000B4C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B4C[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B4C[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFFU ,0x00000672U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B50[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x2 + // .. ==> 0XF8000B50[2:1] = 0x00000002U + // .. ==> MASK : 0x00000006U VAL : 0x00000004U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B50[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B50[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCR_TYPE = 0x3 + // .. ==> 0XF8000B50[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B50[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B50[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B50[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B50[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B50, 0x00000FFFU ,0x00000674U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B54[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x2 + // .. ==> 0XF8000B54[2:1] = 0x00000002U + // .. ==> MASK : 0x00000006U VAL : 0x00000004U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B54[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCR_TYPE = 0x3 + // .. ==> 0XF8000B54[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B54[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B54[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFFU ,0x00000674U), + // .. INP_POWER = 0x0 + // .. ==> 0XF8000B58[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B58[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE = 0x0 + // .. ==> 0XF8000B58[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B58[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCR_TYPE = 0x0 + // .. ==> 0XF8000B58[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B58[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B58[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B58[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B58[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B58, 0x00000FFFU ,0x00000600U), + // .. DRIVE_P = 0x1c + // .. ==> 0XF8000B5C[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. DRIVE_N = 0xc + // .. ==> 0XF8000B5C[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. SLEW_P = 0x1a + // .. ==> 0XF8000B5C[18:14] = 0x0000001AU + // .. ==> MASK : 0x0007C000U VAL : 0x00068000U + // .. SLEW_N = 0x1a + // .. ==> 0XF8000B5C[23:19] = 0x0000001AU + // .. ==> MASK : 0x00F80000U VAL : 0x00D00000U + // .. GTL = 0x0 + // .. ==> 0XF8000B5C[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B5C[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B5C, 0xFFFFFFFFU ,0x00D6861CU), + // .. DRIVE_P = 0x1c + // .. ==> 0XF8000B60[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. DRIVE_N = 0xc + // .. ==> 0XF8000B60[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B60[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B60[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B60[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B60[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B60, 0xFFFFFFFFU ,0x00F9861CU), + // .. DRIVE_P = 0x1c + // .. ==> 0XF8000B64[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. DRIVE_N = 0xc + // .. ==> 0XF8000B64[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. SLEW_P = 0x6 + // .. ==> 0XF8000B64[18:14] = 0x00000006U + // .. ==> MASK : 0x0007C000U VAL : 0x00018000U + // .. SLEW_N = 0x1f + // .. ==> 0XF8000B64[23:19] = 0x0000001FU + // .. ==> MASK : 0x00F80000U VAL : 0x00F80000U + // .. GTL = 0x0 + // .. ==> 0XF8000B64[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B64[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B64, 0xFFFFFFFFU ,0x00F9861CU), + // .. DRIVE_P = 0x1c + // .. ==> 0XF8000B68[6:0] = 0x0000001CU + // .. ==> MASK : 0x0000007FU VAL : 0x0000001CU + // .. DRIVE_N = 0xc + // .. ==> 0XF8000B68[13:7] = 0x0000000CU + // .. ==> MASK : 0x00003F80U VAL : 0x00000600U + // .. SLEW_P = 0x1a + // .. ==> 0XF8000B68[18:14] = 0x0000001AU + // .. ==> MASK : 0x0007C000U VAL : 0x00068000U + // .. SLEW_N = 0x1a + // .. ==> 0XF8000B68[23:19] = 0x0000001AU + // .. ==> MASK : 0x00F80000U VAL : 0x00D00000U + // .. GTL = 0x0 + // .. ==> 0XF8000B68[26:24] = 0x00000000U + // .. ==> MASK : 0x07000000U VAL : 0x00000000U + // .. RTERM = 0x0 + // .. ==> 0XF8000B68[31:27] = 0x00000000U + // .. ==> MASK : 0xF8000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B68, 0xFFFFFFFFU ,0x00D6861CU), + // .. VREF_INT_EN = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. VREF_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[8:7] = 0x00000000U + // .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. REFIO_TEST = 0x3 + // .. ==> 0XF8000B6C[11:10] = 0x00000003U + // .. ==> MASK : 0x00000C00U VAL : 0x00000C00U + // .. REFIO_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DRST_B_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. CKE_PULLUP_EN = 0x0 + // .. ==> 0XF8000B6C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x00007FFFU ,0x00000E60U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000021U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000021U ,0x00000020U), + // .. .. FINISH: DEASSERT RESET + // .. .. RESET = 0x1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. ENABLE = 0x1 + // .. .. ==> 0XF8000B70[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. VRP_TRI = 0x0 + // .. .. ==> 0XF8000B70[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. VRN_TRI = 0x0 + // .. .. ==> 0XF8000B70[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. VRP_OUT = 0x0 + // .. .. ==> 0XF8000B70[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. VRN_OUT = 0x1 + // .. .. ==> 0XF8000B70[5:5] = 0x00000001U + // .. .. ==> MASK : 0x00000020U VAL : 0x00000020U + // .. .. NREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[7:6] = 0x00000000U + // .. .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. .. NREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[10:8] = 0x00000000U + // .. .. ==> MASK : 0x00000700U VAL : 0x00000000U + // .. .. NREF_OPT4 = 0x1 + // .. .. ==> 0XF8000B70[13:11] = 0x00000001U + // .. .. ==> MASK : 0x00003800U VAL : 0x00000800U + // .. .. PREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[16:14] = 0x00000000U + // .. .. ==> MASK : 0x0001C000U VAL : 0x00000000U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. INIT_COMPLETE = 0x0 + // .. .. ==> 0XF8000B70[21:21] = 0x00000000U + // .. .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. .. TST_CLK = 0x0 + // .. .. ==> 0XF8000B70[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. TST_HLN = 0x0 + // .. .. ==> 0XF8000B70[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. TST_HLP = 0x0 + // .. .. ==> 0XF8000B70[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. TST_RST = 0x0 + // .. .. ==> 0XF8000B70[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. INT_DCI_EN = 0x0 + // .. .. ==> 0XF8000B70[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x07FFFFFFU ,0x00000823U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000700[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000700[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000700[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000700[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000700[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000700[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000704[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000704[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000704[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000704[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000704[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000704[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000704[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000708[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000708[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000708[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000708[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000708[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000708[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000708[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800070C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF800070C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800070C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800070C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800070C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800070C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF800070C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000710[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000710[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000710[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000710[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000710[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000710[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000710[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000714[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000714[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000714[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000714[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000714[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000714[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000714[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000718[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000718[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000718[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000718[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000718[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000718[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000718[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800071C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800071C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800071C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800071C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800071C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800071C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800071C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000720[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000720[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000720[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000720[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000720[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000724[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000724[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000724[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000724[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000724[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000724[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000728[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000728[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000728[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000728[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 2 + // .. ==> 0XF8000728[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800072C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800072C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800072C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800072C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 2 + // .. ==> 0XF800072C[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000730[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000730[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000730[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000730[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000730[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000730[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000730[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000730[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000734[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000734[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000734[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000734[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000734[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000734[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000734[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000734[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000738[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000738[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000738[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000738[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000738[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000738[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000738[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000738[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800073C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800073C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800073C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800073C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800073C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800073C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800073C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000740[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000740[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000740[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000740[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000740[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000740[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000740[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000740[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000740[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000744[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000744[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000744[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000744[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000744[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000744[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000744[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000744[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000744[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000748[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000748[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000748[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000748[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000748[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000748[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000748[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000748[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000748[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800074C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF800074C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800074C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800074C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800074C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800074C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800074C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800074C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF800074C[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000750[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000750[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000750[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000750[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000750[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000750[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000750[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000750[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000750[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000754[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000754[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000754[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000754[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000754[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000754[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000754[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000754[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000754[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000758[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000758[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000758[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000758[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000758[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000758[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000758[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000758[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800075C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF800075C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800075C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800075C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800075C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800075C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800075C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800075C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000760[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000760[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000760[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000760[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000760[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000760[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000760[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000760[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000764[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000764[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000764[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000764[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000764[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000764[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000764[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000764[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000768[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000768[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000768[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000768[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000768[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000768[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000768[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000768[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800076C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF800076C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800076C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800076C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800076C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800076C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800076C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800076C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000770[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000770[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000770[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000770[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000770[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000770[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000770[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000770[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000774[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF8000774[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000774[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000774[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000774[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000774[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000774[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000774[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000778[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000778[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000778[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000778[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000778[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000778[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000778[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000778[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800077C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF800077C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800077C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800077C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800077C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800077C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800077C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800077C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000780[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000780[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000780[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000780[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000780[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000780[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000780[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000780[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000784[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000784[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000784[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000784[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000784[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000784[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000784[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000784[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000788[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000788[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000788[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000788[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000788[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000788[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000788[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000788[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800078C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800078C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800078C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800078C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800078C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800078C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800078C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800078C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000790[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF8000790[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000790[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000790[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000790[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000790[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000790[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000790[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000794[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000794[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000794[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000794[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000794[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000794[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000794[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000794[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000798[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000798[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000798[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000798[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000798[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000798[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000798[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000798[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800079C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800079C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800079C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800079C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800079C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800079C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800079C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800079C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A0[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A4[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A8[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A8[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007AC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007AC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007AC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007AC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007AC[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007AC[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007AC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007AC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007B0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007B0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007B0[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007B0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007B4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007B4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007B4[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007B4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003F01U ,0x00000200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007BC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00000201U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007C0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF80007C0[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000002E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007C4[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007C4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF80007C4[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000002E1U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007C8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007C8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF80007C8[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00000201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007CC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007CC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007CC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007CC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF80007CC[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007CC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00000201U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007D0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007D0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007D0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007D0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007D0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007D0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007D0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00000280U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007D4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007D4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007D4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007D4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007D4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007D4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007D4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00000280U), + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F0000U ,0x002F0000U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_peripherals_init_data_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B48[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B48[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B48, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B4C[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B4C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B50[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B50[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B50, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B54[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B54[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000180U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x5 + // .. ==> 0XE0001034[7:0] = 0x00000005U + // .. ==> MASK : 0x000000FFU VAL : 0x00000005U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000005U), + // .. CD = 0x9 + // .. ==> 0XE0001018[15:0] = 0x00000009U + // .. ==> MASK : 0x0000FFFFU VAL : 0x00000009U + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x00000009U), + // .. STPBRK = 0x0 + // .. ==> 0XE0001000[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. STTBRK = 0x0 + // .. ==> 0XE0001000[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. RSTTO = 0x0 + // .. ==> 0XE0001000[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. TXDIS = 0x0 + // .. ==> 0XE0001000[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. TXEN = 0x1 + // .. ==> 0XE0001000[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. RXDIS = 0x0 + // .. ==> 0XE0001000[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. RXEN = 0x1 + // .. ==> 0XE0001000[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. TXRES = 0x1 + // .. ==> 0XE0001000[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. RXRES = 0x1 + // .. ==> 0XE0001000[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XE0001000, 0x000001FFU ,0x00000017U), + // .. IRMODE = 0x0 + // .. ==> 0XE0001004[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. UCLKEN = 0x0 + // .. ==> 0XE0001004[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. CHMODE = 0x0 + // .. ==> 0XE0001004[9:8] = 0x00000000U + // .. ==> MASK : 0x00000300U VAL : 0x00000000U + // .. NBSTOP = 0x0 + // .. ==> 0XE0001004[7:6] = 0x00000000U + // .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. PAR = 0x4 + // .. ==> 0XE0001004[5:3] = 0x00000004U + // .. ==> MASK : 0x00000038U VAL : 0x00000020U + // .. CHRL = 0x0 + // .. ==> 0XE0001004[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. CLKS = 0x0 + // .. ==> 0XE0001004[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XE0001004, 0x00000FFFU ,0x00000020U), + // .. BDIV = 0x5 + // .. ==> 0XE0000034[7:0] = 0x00000005U + // .. ==> MASK : 0x000000FFU VAL : 0x00000005U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000005U), + // .. CD = 0x9 + // .. ==> 0XE0000018[15:0] = 0x00000009U + // .. ==> MASK : 0x0000FFFFU VAL : 0x00000009U + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x00000009U), + // .. STPBRK = 0x0 + // .. ==> 0XE0000000[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. STTBRK = 0x0 + // .. ==> 0XE0000000[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. RSTTO = 0x0 + // .. ==> 0XE0000000[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. TXDIS = 0x0 + // .. ==> 0XE0000000[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. TXEN = 0x1 + // .. ==> 0XE0000000[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. RXDIS = 0x0 + // .. ==> 0XE0000000[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. RXEN = 0x1 + // .. ==> 0XE0000000[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. TXRES = 0x1 + // .. ==> 0XE0000000[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. RXRES = 0x1 + // .. ==> 0XE0000000[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XE0000000, 0x000001FFU ,0x00000017U), + // .. IRMODE = 0x0 + // .. ==> 0XE0000004[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. UCLKEN = 0x0 + // .. ==> 0XE0000004[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. CHMODE = 0x0 + // .. ==> 0XE0000004[9:8] = 0x00000000U + // .. ==> MASK : 0x00000300U VAL : 0x00000000U + // .. NBSTOP = 0x0 + // .. ==> 0XE0000004[7:6] = 0x00000000U + // .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. PAR = 0x4 + // .. ==> 0XE0000004[5:3] = 0x00000004U + // .. ==> MASK : 0x00000038U VAL : 0x00000020U + // .. CHRL = 0x0 + // .. ==> 0XE0000004[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. CLKS = 0x0 + // .. ==> 0XE0000004[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XE0000004, 0x00000FFFU ,0x00000020U), + // .. FINISH: UART REGISTERS + // .. START: QSPI REGISTERS + // .. Holdb_dr = 1 + // .. ==> 0XE000D000[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XE000D000, 0x00080000U ,0x00080000U), + // .. FINISH: QSPI REGISTERS + // .. START: PL POWER ON RESET REGISTERS + // .. PCFG_POR_CNT_4K = 0 + // .. ==> 0XF8007000[29:29] = 0x00000000U + // .. ==> MASK : 0x20000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8007000, 0x20000000U ,0x00000000U), + // .. FINISH: PL POWER ON RESET REGISTERS + // .. START: SMC TIMING CALCULATION REGISTER UPDATE + // .. .. START: NAND SET CYCLE + // .. .. FINISH: NAND SET CYCLE + // .. .. START: OPMODE + // .. .. FINISH: OPMODE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: SRAM/NOR CS0 SET CYCLE + // .. .. FINISH: SRAM/NOR CS0 SET CYCLE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: NOR CS0 BASE ADDRESS + // .. .. FINISH: NOR CS0 BASE ADDRESS + // .. .. START: SRAM/NOR CS1 SET CYCLE + // .. .. FINISH: SRAM/NOR CS1 SET CYCLE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: NOR CS1 BASE ADDRESS + // .. .. FINISH: NOR CS1 BASE ADDRESS + // .. .. START: USB RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. DIRECTION_1 = 0x4000 + // .. .. .. ==> 0XE000A244[21:0] = 0x00004000U + // .. .. .. ==> MASK : 0x003FFFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A244, 0x003FFFFFU ,0x00004000U), + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x4000 + // .. .. .. ==> 0XE000A008[15:0] = 0x00004000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF4000U), + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. OP_ENABLE_1 = 0x4000 + // .. .. .. ==> 0XE000A248[21:0] = 0x00004000U + // .. .. .. ==> MASK : 0x003FFFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A248, 0x003FFFFFU ,0x00004000U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x0 + // .. .. .. ==> 0XE000A008[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF0000U), + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x4000 + // .. .. .. ==> 0XE000A008[15:0] = 0x00004000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF4000U), + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: I2C RESET + // .. FINISH: SMC TIMING CALCULATION REGISTER UPDATE + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_post_config_2_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: ENABLING LEVEL SHIFTER + // .. USER_INP_ICT_EN_0 = 3 + // .. ==> 0XF8000900[1:0] = 0x00000003U + // .. ==> MASK : 0x00000003U VAL : 0x00000003U + // .. USER_INP_ICT_EN_1 = 3 + // .. ==> 0XF8000900[3:2] = 0x00000003U + // .. ==> MASK : 0x0000000CU VAL : 0x0000000CU + // .. + EMIT_MASKWRITE(0XF8000900, 0x0000000FU ,0x0000000FU), + // .. FINISH: ENABLING LEVEL SHIFTER + // .. START: FPGA RESETS TO 1 + // .. reserved_3 = 127 + // .. ==> 0XF8000240[31:25] = 0x0000007FU + // .. ==> MASK : 0xFE000000U VAL : 0xFE000000U + // .. FPGA_ACP_RST = 1 + // .. ==> 0XF8000240[24:24] = 0x00000001U + // .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. FPGA_AXDS3_RST = 1 + // .. ==> 0XF8000240[23:23] = 0x00000001U + // .. ==> MASK : 0x00800000U VAL : 0x00800000U + // .. FPGA_AXDS2_RST = 1 + // .. ==> 0XF8000240[22:22] = 0x00000001U + // .. ==> MASK : 0x00400000U VAL : 0x00400000U + // .. FPGA_AXDS1_RST = 1 + // .. ==> 0XF8000240[21:21] = 0x00000001U + // .. ==> MASK : 0x00200000U VAL : 0x00200000U + // .. FPGA_AXDS0_RST = 1 + // .. ==> 0XF8000240[20:20] = 0x00000001U + // .. ==> MASK : 0x00100000U VAL : 0x00100000U + // .. reserved_2 = 3 + // .. ==> 0XF8000240[19:18] = 0x00000003U + // .. ==> MASK : 0x000C0000U VAL : 0x000C0000U + // .. FSSW1_FPGA_RST = 1 + // .. ==> 0XF8000240[17:17] = 0x00000001U + // .. ==> MASK : 0x00020000U VAL : 0x00020000U + // .. FSSW0_FPGA_RST = 1 + // .. ==> 0XF8000240[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. reserved_1 = 15 + // .. ==> 0XF8000240[15:14] = 0x0000000FU + // .. ==> MASK : 0x0000C000U VAL : 0x0000C000U + // .. FPGA_FMSW1_RST = 1 + // .. ==> 0XF8000240[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. FPGA_FMSW0_RST = 1 + // .. ==> 0XF8000240[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. FPGA_DMA3_RST = 1 + // .. ==> 0XF8000240[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. FPGA_DMA2_RST = 1 + // .. ==> 0XF8000240[10:10] = 0x00000001U + // .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. FPGA_DMA1_RST = 1 + // .. ==> 0XF8000240[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. FPGA_DMA0_RST = 1 + // .. ==> 0XF8000240[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. reserved = 15 + // .. ==> 0XF8000240[7:4] = 0x0000000FU + // .. ==> MASK : 0x000000F0U VAL : 0x000000F0U + // .. FPGA3_OUT_RST = 1 + // .. ==> 0XF8000240[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. FPGA2_OUT_RST = 1 + // .. ==> 0XF8000240[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. FPGA1_OUT_RST = 1 + // .. ==> 0XF8000240[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. FPGA0_OUT_RST = 1 + // .. ==> 0XF8000240[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XF8000240, 0xFFFFFFFFU ,0xFFFFFFFFU), + // .. FINISH: FPGA RESETS TO 1 + // .. START: FPGA RESETS TO 0 + // .. reserved_3 = 0 + // .. ==> 0XF8000240[31:25] = 0x00000000U + // .. ==> MASK : 0xFE000000U VAL : 0x00000000U + // .. FPGA_ACP_RST = 0 + // .. ==> 0XF8000240[24:24] = 0x00000000U + // .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. FPGA_AXDS3_RST = 0 + // .. ==> 0XF8000240[23:23] = 0x00000000U + // .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. FPGA_AXDS2_RST = 0 + // .. ==> 0XF8000240[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. FPGA_AXDS1_RST = 0 + // .. ==> 0XF8000240[21:21] = 0x00000000U + // .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. FPGA_AXDS0_RST = 0 + // .. ==> 0XF8000240[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. reserved_2 = 0 + // .. ==> 0XF8000240[19:18] = 0x00000000U + // .. ==> MASK : 0x000C0000U VAL : 0x00000000U + // .. FSSW1_FPGA_RST = 0 + // .. ==> 0XF8000240[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. FSSW0_FPGA_RST = 0 + // .. ==> 0XF8000240[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reserved_1 = 0 + // .. ==> 0XF8000240[15:14] = 0x00000000U + // .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. FPGA_FMSW1_RST = 0 + // .. ==> 0XF8000240[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. FPGA_FMSW0_RST = 0 + // .. ==> 0XF8000240[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. FPGA_DMA3_RST = 0 + // .. ==> 0XF8000240[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. FPGA_DMA2_RST = 0 + // .. ==> 0XF8000240[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. FPGA_DMA1_RST = 0 + // .. ==> 0XF8000240[9:9] = 0x00000000U + // .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. FPGA_DMA0_RST = 0 + // .. ==> 0XF8000240[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. reserved = 0 + // .. ==> 0XF8000240[7:4] = 0x00000000U + // .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. FPGA3_OUT_RST = 0 + // .. ==> 0XF8000240[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. FPGA2_OUT_RST = 0 + // .. ==> 0XF8000240[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. FPGA1_OUT_RST = 0 + // .. ==> 0XF8000240[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. FPGA0_OUT_RST = 0 + // .. ==> 0XF8000240[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000240, 0xFFFFFFFFU ,0x00000000U), + // .. FINISH: FPGA RESETS TO 0 + // .. START: AFI REGISTERS + // .. .. START: AFI0 REGISTERS + // .. .. FINISH: AFI0 REGISTERS + // .. .. START: AFI1 REGISTERS + // .. .. FINISH: AFI1 REGISTERS + // .. .. START: AFI2 REGISTERS + // .. .. FINISH: AFI2 REGISTERS + // .. .. START: AFI3 REGISTERS + // .. .. FINISH: AFI3 REGISTERS + // .. FINISH: AFI REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_pll_init_data_3_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: PLL SLCR REGISTERS + // .. .. START: ARM PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000110[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000110[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x177 + // .. .. ==> 0XF8000110[21:12] = 0x00000177U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00177000U + // .. .. + EMIT_MASKWRITE(0XF8000110, 0x003FFFF0U ,0x001772C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x1a + // .. .. .. ==> 0XF8000100[18:12] = 0x0000001AU + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x0001A000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x0007F000U ,0x0001A000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000100[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000100[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000100[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. ARM_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000001U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000100[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000100, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. .. SRCSEL = 0x0 + // .. .. .. ==> 0XF8000120[5:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. .. .. DIVISOR = 0x2 + // .. .. .. ==> 0XF8000120[13:8] = 0x00000002U + // .. .. .. ==> MASK : 0x00003F00U VAL : 0x00000200U + // .. .. .. CPU_6OR4XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[24:24] = 0x00000001U + // .. .. .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. .. .. CPU_3OR2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[25:25] = 0x00000001U + // .. .. .. ==> MASK : 0x02000000U VAL : 0x02000000U + // .. .. .. CPU_2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[26:26] = 0x00000001U + // .. .. .. ==> MASK : 0x04000000U VAL : 0x04000000U + // .. .. .. CPU_1XCLKACT = 0x1 + // .. .. .. ==> 0XF8000120[27:27] = 0x00000001U + // .. .. .. ==> MASK : 0x08000000U VAL : 0x08000000U + // .. .. .. CPU_PERI_CLKACT = 0x1 + // .. .. .. ==> 0XF8000120[28:28] = 0x00000001U + // .. .. .. ==> MASK : 0x10000000U VAL : 0x10000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000120, 0x1F003F30U ,0x1F000200U), + // .. .. FINISH: ARM PLL INIT + // .. .. START: DDR PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000114[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000114[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x1db + // .. .. ==> 0XF8000114[21:12] = 0x000001DBU + // .. .. ==> MASK : 0x003FF000U VAL : 0x001DB000U + // .. .. + EMIT_MASKWRITE(0XF8000114, 0x003FFFF0U ,0x001DB2C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x15 + // .. .. .. ==> 0XF8000104[18:12] = 0x00000015U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00015000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x0007F000U ,0x00015000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000104[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000104[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000104[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. DDR_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[1:1] = 0x00000001U + // .. .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000002U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000104[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000104, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. .. DDR_3XCLKACT = 0x1 + // .. .. .. ==> 0XF8000124[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. DDR_2XCLKACT = 0x1 + // .. .. .. ==> 0XF8000124[1:1] = 0x00000001U + // .. .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. .. DDR_3XCLK_DIVISOR = 0x2 + // .. .. .. ==> 0XF8000124[25:20] = 0x00000002U + // .. .. .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. .. .. DDR_2XCLK_DIVISOR = 0x3 + // .. .. .. ==> 0XF8000124[31:26] = 0x00000003U + // .. .. .. ==> MASK : 0xFC000000U VAL : 0x0C000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000124, 0xFFF00003U ,0x0C200003U), + // .. .. FINISH: DDR PLL INIT + // .. .. START: IO PLL INIT + // .. .. PLL_RES = 0xc + // .. .. ==> 0XF8000118[7:4] = 0x0000000CU + // .. .. ==> MASK : 0x000000F0U VAL : 0x000000C0U + // .. .. PLL_CP = 0x2 + // .. .. ==> 0XF8000118[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. LOCK_CNT = 0x1f4 + // .. .. ==> 0XF8000118[21:12] = 0x000001F4U + // .. .. ==> MASK : 0x003FF000U VAL : 0x001F4000U + // .. .. + EMIT_MASKWRITE(0XF8000118, 0x003FFFF0U ,0x001F42C0U), + // .. .. .. START: UPDATE FB_DIV + // .. .. .. PLL_FDIV = 0x14 + // .. .. .. ==> 0XF8000108[18:12] = 0x00000014U + // .. .. .. ==> MASK : 0x0007F000U VAL : 0x00014000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x0007F000U ,0x00014000U), + // .. .. .. FINISH: UPDATE FB_DIV + // .. .. .. START: BY PASS PLL + // .. .. .. PLL_BYPASS_FORCE = 1 + // .. .. .. ==> 0XF8000108[4:4] = 0x00000001U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000010U ,0x00000010U), + // .. .. .. FINISH: BY PASS PLL + // .. .. .. START: ASSERT RESET + // .. .. .. PLL_RESET = 1 + // .. .. .. ==> 0XF8000108[0:0] = 0x00000001U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000001U ,0x00000001U), + // .. .. .. FINISH: ASSERT RESET + // .. .. .. START: DEASSERT RESET + // .. .. .. PLL_RESET = 0 + // .. .. .. ==> 0XF8000108[0:0] = 0x00000000U + // .. .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000001U ,0x00000000U), + // .. .. .. FINISH: DEASSERT RESET + // .. .. .. START: CHECK PLL STATUS + // .. .. .. IO_PLL_LOCK = 1 + // .. .. .. ==> 0XF800010C[2:2] = 0x00000001U + // .. .. .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. .. .. + EMIT_MASKPOLL(0XF800010C, 0x00000004U), + // .. .. .. FINISH: CHECK PLL STATUS + // .. .. .. START: REMOVE PLL BY PASS + // .. .. .. PLL_BYPASS_FORCE = 0 + // .. .. .. ==> 0XF8000108[4:4] = 0x00000000U + // .. .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XF8000108, 0x00000010U ,0x00000000U), + // .. .. .. FINISH: REMOVE PLL BY PASS + // .. .. FINISH: IO PLL INIT + // .. FINISH: PLL SLCR REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_clock_init_data_3_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: CLOCK CONTROL SLCR REGISTERS + // .. CLKACT = 0x1 + // .. ==> 0XF8000128[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. DIVISOR0 = 0x34 + // .. ==> 0XF8000128[13:8] = 0x00000034U + // .. ==> MASK : 0x00003F00U VAL : 0x00003400U + // .. DIVISOR1 = 0x2 + // .. ==> 0XF8000128[25:20] = 0x00000002U + // .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. + EMIT_MASKWRITE(0XF8000128, 0x03F03F01U ,0x00203401U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000138[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000138[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000138, 0x00000011U ,0x00000001U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000140[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000140[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. DIVISOR = 0x8 + // .. ==> 0XF8000140[13:8] = 0x00000008U + // .. ==> MASK : 0x00003F00U VAL : 0x00000800U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000140[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000140, 0x03F03F71U ,0x00100801U), + // .. CLKACT = 0x1 + // .. ==> 0XF800014C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF800014C[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x5 + // .. ==> 0XF800014C[13:8] = 0x00000005U + // .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. + EMIT_MASKWRITE(0XF800014C, 0x00003F31U ,0x00000501U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000150[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x0 + // .. ==> 0XF8000150[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000150[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x14 + // .. ==> 0XF8000150[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. + EMIT_MASKWRITE(0XF8000150, 0x00003F33U ,0x00001401U), + // .. CLKACT0 = 0x1 + // .. ==> 0XF8000154[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. CLKACT1 = 0x1 + // .. ==> 0XF8000154[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000154[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x14 + // .. ==> 0XF8000154[13:8] = 0x00000014U + // .. ==> MASK : 0x00003F00U VAL : 0x00001400U + // .. + EMIT_MASKWRITE(0XF8000154, 0x00003F33U ,0x00001403U), + // .. CLKACT = 0x1 + // .. ==> 0XF8000168[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. SRCSEL = 0x0 + // .. ==> 0XF8000168[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR = 0x5 + // .. ==> 0XF8000168[13:8] = 0x00000005U + // .. ==> MASK : 0x00003F00U VAL : 0x00000500U + // .. + EMIT_MASKWRITE(0XF8000168, 0x00003F31U ,0x00000501U), + // .. SRCSEL = 0x0 + // .. ==> 0XF8000170[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xa + // .. ==> 0XF8000170[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000170[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000170, 0x03F03F30U ,0x00100A00U), + // .. SRCSEL = 0x3 + // .. ==> 0XF8000180[5:4] = 0x00000003U + // .. ==> MASK : 0x00000030U VAL : 0x00000030U + // .. DIVISOR0 = 0x6 + // .. ==> 0XF8000180[13:8] = 0x00000006U + // .. ==> MASK : 0x00003F00U VAL : 0x00000600U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF8000180[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF8000180, 0x03F03F30U ,0x00100630U), + // .. SRCSEL = 0x2 + // .. ==> 0XF8000190[5:4] = 0x00000002U + // .. ==> MASK : 0x00000030U VAL : 0x00000020U + // .. DIVISOR0 = 0x35 + // .. ==> 0XF8000190[13:8] = 0x00000035U + // .. ==> MASK : 0x00003F00U VAL : 0x00003500U + // .. DIVISOR1 = 0x2 + // .. ==> 0XF8000190[25:20] = 0x00000002U + // .. ==> MASK : 0x03F00000U VAL : 0x00200000U + // .. + EMIT_MASKWRITE(0XF8000190, 0x03F03F30U ,0x00203520U), + // .. SRCSEL = 0x0 + // .. ==> 0XF80001A0[5:4] = 0x00000000U + // .. ==> MASK : 0x00000030U VAL : 0x00000000U + // .. DIVISOR0 = 0xa + // .. ==> 0XF80001A0[13:8] = 0x0000000AU + // .. ==> MASK : 0x00003F00U VAL : 0x00000A00U + // .. DIVISOR1 = 0x1 + // .. ==> 0XF80001A0[25:20] = 0x00000001U + // .. ==> MASK : 0x03F00000U VAL : 0x00100000U + // .. + EMIT_MASKWRITE(0XF80001A0, 0x03F03F30U ,0x00100A00U), + // .. CLK_621_TRUE = 0x1 + // .. ==> 0XF80001C4[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XF80001C4, 0x00000001U ,0x00000001U), + // .. DMA_CPU_2XCLKACT = 0x1 + // .. ==> 0XF800012C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. USB0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. USB1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. GEM0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[6:6] = 0x00000001U + // .. ==> MASK : 0x00000040U VAL : 0x00000040U + // .. GEM1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. SDI0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[10:10] = 0x00000001U + // .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. SDI1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. SPI0_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[14:14] = 0x00000000U + // .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. SPI1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[15:15] = 0x00000000U + // .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. CAN0_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. CAN1_CPU_1XCLKACT = 0x0 + // .. ==> 0XF800012C[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. I2C0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[18:18] = 0x00000001U + // .. ==> MASK : 0x00040000U VAL : 0x00040000U + // .. I2C1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. UART0_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[20:20] = 0x00000001U + // .. ==> MASK : 0x00100000U VAL : 0x00100000U + // .. UART1_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[21:21] = 0x00000001U + // .. ==> MASK : 0x00200000U VAL : 0x00200000U + // .. GPIO_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[22:22] = 0x00000001U + // .. ==> MASK : 0x00400000U VAL : 0x00400000U + // .. LQSPI_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[23:23] = 0x00000001U + // .. ==> MASK : 0x00800000U VAL : 0x00800000U + // .. SMC_CPU_1XCLKACT = 0x1 + // .. ==> 0XF800012C[24:24] = 0x00000001U + // .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. + EMIT_MASKWRITE(0XF800012C, 0x01FFCCCDU ,0x01FC044DU), + // .. FINISH: CLOCK CONTROL SLCR REGISTERS + // .. START: THIS SHOULD BE BLANK + // .. FINISH: THIS SHOULD BE BLANK + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_ddr_init_data_3_0[] = { + // START: top + // .. START: DDR INITIALIZATION + // .. .. START: LOCK DDR + // .. .. reg_ddrc_soft_rstb = 0 + // .. .. ==> 0XF8006000[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_powerdown_en = 0x0 + // .. .. ==> 0XF8006000[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_ddrc_data_bus_width = 0x0 + // .. .. ==> 0XF8006000[3:2] = 0x00000000U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000000U + // .. .. reg_ddrc_burst8_refresh = 0x0 + // .. .. ==> 0XF8006000[6:4] = 0x00000000U + // .. .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. .. reg_ddrc_rdwr_idle_gap = 0x1 + // .. .. ==> 0XF8006000[13:7] = 0x00000001U + // .. .. ==> MASK : 0x00003F80U VAL : 0x00000080U + // .. .. reg_ddrc_dis_rd_bypass = 0x0 + // .. .. ==> 0XF8006000[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. reg_ddrc_dis_act_bypass = 0x0 + // .. .. ==> 0XF8006000[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. reg_ddrc_dis_auto_refresh = 0x0 + // .. .. ==> 0XF8006000[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006000, 0x0001FFFFU ,0x00000080U), + // .. .. FINISH: LOCK DDR + // .. .. reg_ddrc_t_rfc_nom_x32 = 0x7f + // .. .. ==> 0XF8006004[11:0] = 0x0000007FU + // .. .. ==> MASK : 0x00000FFFU VAL : 0x0000007FU + // .. .. reserved_reg_ddrc_active_ranks = 0x1 + // .. .. ==> 0XF8006004[13:12] = 0x00000001U + // .. .. ==> MASK : 0x00003000U VAL : 0x00001000U + // .. .. reg_ddrc_addrmap_cs_bit0 = 0x0 + // .. .. ==> 0XF8006004[18:14] = 0x00000000U + // .. .. ==> MASK : 0x0007C000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006004, 0x0007FFFFU ,0x0000107FU), + // .. .. reg_ddrc_hpr_min_non_critical_x32 = 0xf + // .. .. ==> 0XF8006008[10:0] = 0x0000000FU + // .. .. ==> MASK : 0x000007FFU VAL : 0x0000000FU + // .. .. reg_ddrc_hpr_max_starve_x32 = 0xf + // .. .. ==> 0XF8006008[21:11] = 0x0000000FU + // .. .. ==> MASK : 0x003FF800U VAL : 0x00007800U + // .. .. reg_ddrc_hpr_xact_run_length = 0xf + // .. .. ==> 0XF8006008[25:22] = 0x0000000FU + // .. .. ==> MASK : 0x03C00000U VAL : 0x03C00000U + // .. .. + EMIT_MASKWRITE(0XF8006008, 0x03FFFFFFU ,0x03C0780FU), + // .. .. reg_ddrc_lpr_min_non_critical_x32 = 0x1 + // .. .. ==> 0XF800600C[10:0] = 0x00000001U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000001U + // .. .. reg_ddrc_lpr_max_starve_x32 = 0x2 + // .. .. ==> 0XF800600C[21:11] = 0x00000002U + // .. .. ==> MASK : 0x003FF800U VAL : 0x00001000U + // .. .. reg_ddrc_lpr_xact_run_length = 0x8 + // .. .. ==> 0XF800600C[25:22] = 0x00000008U + // .. .. ==> MASK : 0x03C00000U VAL : 0x02000000U + // .. .. + EMIT_MASKWRITE(0XF800600C, 0x03FFFFFFU ,0x02001001U), + // .. .. reg_ddrc_w_min_non_critical_x32 = 0x1 + // .. .. ==> 0XF8006010[10:0] = 0x00000001U + // .. .. ==> MASK : 0x000007FFU VAL : 0x00000001U + // .. .. reg_ddrc_w_xact_run_length = 0x8 + // .. .. ==> 0XF8006010[14:11] = 0x00000008U + // .. .. ==> MASK : 0x00007800U VAL : 0x00004000U + // .. .. reg_ddrc_w_max_starve_x32 = 0x2 + // .. .. ==> 0XF8006010[25:15] = 0x00000002U + // .. .. ==> MASK : 0x03FF8000U VAL : 0x00010000U + // .. .. + EMIT_MASKWRITE(0XF8006010, 0x03FFFFFFU ,0x00014001U), + // .. .. reg_ddrc_t_rc = 0x1a + // .. .. ==> 0XF8006014[5:0] = 0x0000001AU + // .. .. ==> MASK : 0x0000003FU VAL : 0x0000001AU + // .. .. reg_ddrc_t_rfc_min = 0x54 + // .. .. ==> 0XF8006014[13:6] = 0x00000054U + // .. .. ==> MASK : 0x00003FC0U VAL : 0x00001500U + // .. .. reg_ddrc_post_selfref_gap_x32 = 0x10 + // .. .. ==> 0XF8006014[20:14] = 0x00000010U + // .. .. ==> MASK : 0x001FC000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006014, 0x001FFFFFU ,0x0004151AU), + // .. .. reg_ddrc_wr2pre = 0x12 + // .. .. ==> 0XF8006018[4:0] = 0x00000012U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000012U + // .. .. reg_ddrc_powerdown_to_x32 = 0x6 + // .. .. ==> 0XF8006018[9:5] = 0x00000006U + // .. .. ==> MASK : 0x000003E0U VAL : 0x000000C0U + // .. .. reg_ddrc_t_faw = 0x15 + // .. .. ==> 0XF8006018[15:10] = 0x00000015U + // .. .. ==> MASK : 0x0000FC00U VAL : 0x00005400U + // .. .. reg_ddrc_t_ras_max = 0x23 + // .. .. ==> 0XF8006018[21:16] = 0x00000023U + // .. .. ==> MASK : 0x003F0000U VAL : 0x00230000U + // .. .. reg_ddrc_t_ras_min = 0x13 + // .. .. ==> 0XF8006018[26:22] = 0x00000013U + // .. .. ==> MASK : 0x07C00000U VAL : 0x04C00000U + // .. .. reg_ddrc_t_cke = 0x4 + // .. .. ==> 0XF8006018[31:28] = 0x00000004U + // .. .. ==> MASK : 0xF0000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006018, 0xF7FFFFFFU ,0x44E354D2U), + // .. .. reg_ddrc_write_latency = 0x5 + // .. .. ==> 0XF800601C[4:0] = 0x00000005U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000005U + // .. .. reg_ddrc_rd2wr = 0x7 + // .. .. ==> 0XF800601C[9:5] = 0x00000007U + // .. .. ==> MASK : 0x000003E0U VAL : 0x000000E0U + // .. .. reg_ddrc_wr2rd = 0xe + // .. .. ==> 0XF800601C[14:10] = 0x0000000EU + // .. .. ==> MASK : 0x00007C00U VAL : 0x00003800U + // .. .. reg_ddrc_t_xp = 0x4 + // .. .. ==> 0XF800601C[19:15] = 0x00000004U + // .. .. ==> MASK : 0x000F8000U VAL : 0x00020000U + // .. .. reg_ddrc_pad_pd = 0x0 + // .. .. ==> 0XF800601C[22:20] = 0x00000000U + // .. .. ==> MASK : 0x00700000U VAL : 0x00000000U + // .. .. reg_ddrc_rd2pre = 0x4 + // .. .. ==> 0XF800601C[27:23] = 0x00000004U + // .. .. ==> MASK : 0x0F800000U VAL : 0x02000000U + // .. .. reg_ddrc_t_rcd = 0x7 + // .. .. ==> 0XF800601C[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF800601C, 0xFFFFFFFFU ,0x720238E5U), + // .. .. reg_ddrc_t_ccd = 0x4 + // .. .. ==> 0XF8006020[4:2] = 0x00000004U + // .. .. ==> MASK : 0x0000001CU VAL : 0x00000010U + // .. .. reg_ddrc_t_rrd = 0x6 + // .. .. ==> 0XF8006020[7:5] = 0x00000006U + // .. .. ==> MASK : 0x000000E0U VAL : 0x000000C0U + // .. .. reg_ddrc_refresh_margin = 0x2 + // .. .. ==> 0XF8006020[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. reg_ddrc_t_rp = 0x7 + // .. .. ==> 0XF8006020[15:12] = 0x00000007U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00007000U + // .. .. reg_ddrc_refresh_to_x32 = 0x8 + // .. .. ==> 0XF8006020[20:16] = 0x00000008U + // .. .. ==> MASK : 0x001F0000U VAL : 0x00080000U + // .. .. reg_ddrc_mobile = 0x0 + // .. .. ==> 0XF8006020[22:22] = 0x00000000U + // .. .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. .. reg_ddrc_en_dfi_dram_clk_disable = 0x0 + // .. .. ==> 0XF8006020[23:23] = 0x00000000U + // .. .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. .. reg_ddrc_read_latency = 0x7 + // .. .. ==> 0XF8006020[28:24] = 0x00000007U + // .. .. ==> MASK : 0x1F000000U VAL : 0x07000000U + // .. .. reg_phy_mode_ddr1_ddr2 = 0x1 + // .. .. ==> 0XF8006020[29:29] = 0x00000001U + // .. .. ==> MASK : 0x20000000U VAL : 0x20000000U + // .. .. reg_ddrc_dis_pad_pd = 0x0 + // .. .. ==> 0XF8006020[30:30] = 0x00000000U + // .. .. ==> MASK : 0x40000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006020, 0x7FDFFFFCU ,0x270872D0U), + // .. .. reg_ddrc_en_2t_timing_mode = 0x0 + // .. .. ==> 0XF8006024[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_prefer_write = 0x0 + // .. .. ==> 0XF8006024[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_ddrc_mr_wr = 0x0 + // .. .. ==> 0XF8006024[6:6] = 0x00000000U + // .. .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. .. reg_ddrc_mr_addr = 0x0 + // .. .. ==> 0XF8006024[8:7] = 0x00000000U + // .. .. ==> MASK : 0x00000180U VAL : 0x00000000U + // .. .. reg_ddrc_mr_data = 0x0 + // .. .. ==> 0XF8006024[24:9] = 0x00000000U + // .. .. ==> MASK : 0x01FFFE00U VAL : 0x00000000U + // .. .. ddrc_reg_mr_wr_busy = 0x0 + // .. .. ==> 0XF8006024[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reg_ddrc_mr_type = 0x0 + // .. .. ==> 0XF8006024[26:26] = 0x00000000U + // .. .. ==> MASK : 0x04000000U VAL : 0x00000000U + // .. .. reg_ddrc_mr_rdata_valid = 0x0 + // .. .. ==> 0XF8006024[27:27] = 0x00000000U + // .. .. ==> MASK : 0x08000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006024, 0x0FFFFFC3U ,0x00000000U), + // .. .. reg_ddrc_final_wait_x32 = 0x7 + // .. .. ==> 0XF8006028[6:0] = 0x00000007U + // .. .. ==> MASK : 0x0000007FU VAL : 0x00000007U + // .. .. reg_ddrc_pre_ocd_x32 = 0x0 + // .. .. ==> 0XF8006028[10:7] = 0x00000000U + // .. .. ==> MASK : 0x00000780U VAL : 0x00000000U + // .. .. reg_ddrc_t_mrd = 0x4 + // .. .. ==> 0XF8006028[13:11] = 0x00000004U + // .. .. ==> MASK : 0x00003800U VAL : 0x00002000U + // .. .. + EMIT_MASKWRITE(0XF8006028, 0x00003FFFU ,0x00002007U), + // .. .. reg_ddrc_emr2 = 0x8 + // .. .. ==> 0XF800602C[15:0] = 0x00000008U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000008U + // .. .. reg_ddrc_emr3 = 0x0 + // .. .. ==> 0XF800602C[31:16] = 0x00000000U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800602C, 0xFFFFFFFFU ,0x00000008U), + // .. .. reg_ddrc_mr = 0x930 + // .. .. ==> 0XF8006030[15:0] = 0x00000930U + // .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000930U + // .. .. reg_ddrc_emr = 0x4 + // .. .. ==> 0XF8006030[31:16] = 0x00000004U + // .. .. ==> MASK : 0xFFFF0000U VAL : 0x00040000U + // .. .. + EMIT_MASKWRITE(0XF8006030, 0xFFFFFFFFU ,0x00040930U), + // .. .. reg_ddrc_burst_rdwr = 0x4 + // .. .. ==> 0XF8006034[3:0] = 0x00000004U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000004U + // .. .. reg_ddrc_pre_cke_x1024 = 0x101 + // .. .. ==> 0XF8006034[13:4] = 0x00000101U + // .. .. ==> MASK : 0x00003FF0U VAL : 0x00001010U + // .. .. reg_ddrc_post_cke_x1024 = 0x1 + // .. .. ==> 0XF8006034[25:16] = 0x00000001U + // .. .. ==> MASK : 0x03FF0000U VAL : 0x00010000U + // .. .. reg_ddrc_burstchop = 0x0 + // .. .. ==> 0XF8006034[28:28] = 0x00000000U + // .. .. ==> MASK : 0x10000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006034, 0x13FF3FFFU ,0x00011014U), + // .. .. reg_ddrc_force_low_pri_n = 0x0 + // .. .. ==> 0XF8006038[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_dis_dq = 0x0 + // .. .. ==> 0XF8006038[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006038, 0x00000003U ,0x00000000U), + // .. .. reg_ddrc_addrmap_bank_b0 = 0x7 + // .. .. ==> 0XF800603C[3:0] = 0x00000007U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000007U + // .. .. reg_ddrc_addrmap_bank_b1 = 0x7 + // .. .. ==> 0XF800603C[7:4] = 0x00000007U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000070U + // .. .. reg_ddrc_addrmap_bank_b2 = 0x7 + // .. .. ==> 0XF800603C[11:8] = 0x00000007U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000700U + // .. .. reg_ddrc_addrmap_col_b5 = 0x0 + // .. .. ==> 0XF800603C[15:12] = 0x00000000U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b6 = 0x0 + // .. .. ==> 0XF800603C[19:16] = 0x00000000U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800603C, 0x000FFFFFU ,0x00000777U), + // .. .. reg_ddrc_addrmap_col_b2 = 0x0 + // .. .. ==> 0XF8006040[3:0] = 0x00000000U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b3 = 0x0 + // .. .. ==> 0XF8006040[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b4 = 0x0 + // .. .. ==> 0XF8006040[11:8] = 0x00000000U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b7 = 0x0 + // .. .. ==> 0XF8006040[15:12] = 0x00000000U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b8 = 0x0 + // .. .. ==> 0XF8006040[19:16] = 0x00000000U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00000000U + // .. .. reg_ddrc_addrmap_col_b9 = 0xf + // .. .. ==> 0XF8006040[23:20] = 0x0000000FU + // .. .. ==> MASK : 0x00F00000U VAL : 0x00F00000U + // .. .. reg_ddrc_addrmap_col_b10 = 0xf + // .. .. ==> 0XF8006040[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. reg_ddrc_addrmap_col_b11 = 0xf + // .. .. ==> 0XF8006040[31:28] = 0x0000000FU + // .. .. ==> MASK : 0xF0000000U VAL : 0xF0000000U + // .. .. + EMIT_MASKWRITE(0XF8006040, 0xFFFFFFFFU ,0xFFF00000U), + // .. .. reg_ddrc_addrmap_row_b0 = 0x6 + // .. .. ==> 0XF8006044[3:0] = 0x00000006U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000006U + // .. .. reg_ddrc_addrmap_row_b1 = 0x6 + // .. .. ==> 0XF8006044[7:4] = 0x00000006U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000060U + // .. .. reg_ddrc_addrmap_row_b2_11 = 0x6 + // .. .. ==> 0XF8006044[11:8] = 0x00000006U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000600U + // .. .. reg_ddrc_addrmap_row_b12 = 0x6 + // .. .. ==> 0XF8006044[15:12] = 0x00000006U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00006000U + // .. .. reg_ddrc_addrmap_row_b13 = 0x6 + // .. .. ==> 0XF8006044[19:16] = 0x00000006U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00060000U + // .. .. reg_ddrc_addrmap_row_b14 = 0xf + // .. .. ==> 0XF8006044[23:20] = 0x0000000FU + // .. .. ==> MASK : 0x00F00000U VAL : 0x00F00000U + // .. .. reg_ddrc_addrmap_row_b15 = 0xf + // .. .. ==> 0XF8006044[27:24] = 0x0000000FU + // .. .. ==> MASK : 0x0F000000U VAL : 0x0F000000U + // .. .. + EMIT_MASKWRITE(0XF8006044, 0x0FFFFFFFU ,0x0FF66666U), + // .. .. reg_phy_rd_local_odt = 0x0 + // .. .. ==> 0XF8006048[13:12] = 0x00000000U + // .. .. ==> MASK : 0x00003000U VAL : 0x00000000U + // .. .. reg_phy_wr_local_odt = 0x3 + // .. .. ==> 0XF8006048[15:14] = 0x00000003U + // .. .. ==> MASK : 0x0000C000U VAL : 0x0000C000U + // .. .. reg_phy_idle_local_odt = 0x3 + // .. .. ==> 0XF8006048[17:16] = 0x00000003U + // .. .. ==> MASK : 0x00030000U VAL : 0x00030000U + // .. .. + EMIT_MASKWRITE(0XF8006048, 0x0003F000U ,0x0003C000U), + // .. .. reg_phy_rd_cmd_to_data = 0x0 + // .. .. ==> 0XF8006050[3:0] = 0x00000000U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. .. reg_phy_wr_cmd_to_data = 0x0 + // .. .. ==> 0XF8006050[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_phy_rdc_we_to_re_delay = 0x8 + // .. .. ==> 0XF8006050[11:8] = 0x00000008U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000800U + // .. .. reg_phy_rdc_fifo_rst_disable = 0x0 + // .. .. ==> 0XF8006050[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. reg_phy_use_fixed_re = 0x1 + // .. .. ==> 0XF8006050[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. reg_phy_rdc_fifo_rst_err_cnt_clr = 0x0 + // .. .. ==> 0XF8006050[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_phy_dis_phy_ctrl_rstn = 0x0 + // .. .. ==> 0XF8006050[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. reg_phy_clk_stall_level = 0x0 + // .. .. ==> 0XF8006050[19:19] = 0x00000000U + // .. .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. .. reg_phy_gatelvl_num_of_dq0 = 0x7 + // .. .. ==> 0XF8006050[27:24] = 0x00000007U + // .. .. ==> MASK : 0x0F000000U VAL : 0x07000000U + // .. .. reg_phy_wrlvl_num_of_dq0 = 0x7 + // .. .. ==> 0XF8006050[31:28] = 0x00000007U + // .. .. ==> MASK : 0xF0000000U VAL : 0x70000000U + // .. .. + EMIT_MASKWRITE(0XF8006050, 0xFF0F8FFFU ,0x77010800U), + // .. .. reg_ddrc_dis_dll_calib = 0x0 + // .. .. ==> 0XF8006058[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006058, 0x00010000U ,0x00000000U), + // .. .. reg_ddrc_rd_odt_delay = 0x3 + // .. .. ==> 0XF800605C[3:0] = 0x00000003U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000003U + // .. .. reg_ddrc_wr_odt_delay = 0x0 + // .. .. ==> 0XF800605C[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. reg_ddrc_rd_odt_hold = 0x0 + // .. .. ==> 0XF800605C[11:8] = 0x00000000U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000000U + // .. .. reg_ddrc_wr_odt_hold = 0x5 + // .. .. ==> 0XF800605C[15:12] = 0x00000005U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00005000U + // .. .. + EMIT_MASKWRITE(0XF800605C, 0x0000FFFFU ,0x00005003U), + // .. .. reg_ddrc_pageclose = 0x0 + // .. .. ==> 0XF8006060[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_lpr_num_entries = 0x1f + // .. .. ==> 0XF8006060[6:1] = 0x0000001FU + // .. .. ==> MASK : 0x0000007EU VAL : 0x0000003EU + // .. .. reg_ddrc_auto_pre_en = 0x0 + // .. .. ==> 0XF8006060[7:7] = 0x00000000U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. .. reg_ddrc_refresh_update_level = 0x0 + // .. .. ==> 0XF8006060[8:8] = 0x00000000U + // .. .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. .. reg_ddrc_dis_wc = 0x0 + // .. .. ==> 0XF8006060[9:9] = 0x00000000U + // .. .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. .. reg_ddrc_dis_collision_page_opt = 0x0 + // .. .. ==> 0XF8006060[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_ddrc_selfref_en = 0x0 + // .. .. ==> 0XF8006060[12:12] = 0x00000000U + // .. .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006060, 0x000017FFU ,0x0000003EU), + // .. .. reg_ddrc_go2critical_hysteresis = 0x0 + // .. .. ==> 0XF8006064[12:5] = 0x00000000U + // .. .. ==> MASK : 0x00001FE0U VAL : 0x00000000U + // .. .. reg_arb_go2critical_en = 0x1 + // .. .. ==> 0XF8006064[17:17] = 0x00000001U + // .. .. ==> MASK : 0x00020000U VAL : 0x00020000U + // .. .. + EMIT_MASKWRITE(0XF8006064, 0x00021FE0U ,0x00020000U), + // .. .. reg_ddrc_wrlvl_ww = 0x41 + // .. .. ==> 0XF8006068[7:0] = 0x00000041U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000041U + // .. .. reg_ddrc_rdlvl_rr = 0x41 + // .. .. ==> 0XF8006068[15:8] = 0x00000041U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00004100U + // .. .. reg_ddrc_dfi_t_wlmrd = 0x28 + // .. .. ==> 0XF8006068[25:16] = 0x00000028U + // .. .. ==> MASK : 0x03FF0000U VAL : 0x00280000U + // .. .. + EMIT_MASKWRITE(0XF8006068, 0x03FFFFFFU ,0x00284141U), + // .. .. dfi_t_ctrlupd_interval_min_x1024 = 0x10 + // .. .. ==> 0XF800606C[7:0] = 0x00000010U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000010U + // .. .. dfi_t_ctrlupd_interval_max_x1024 = 0x16 + // .. .. ==> 0XF800606C[15:8] = 0x00000016U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00001600U + // .. .. + EMIT_MASKWRITE(0XF800606C, 0x0000FFFFU ,0x00001610U), + // .. .. reg_ddrc_dfi_t_ctrl_delay = 0x1 + // .. .. ==> 0XF8006078[3:0] = 0x00000001U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000001U + // .. .. reg_ddrc_dfi_t_dram_clk_disable = 0x1 + // .. .. ==> 0XF8006078[7:4] = 0x00000001U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000010U + // .. .. reg_ddrc_dfi_t_dram_clk_enable = 0x1 + // .. .. ==> 0XF8006078[11:8] = 0x00000001U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000100U + // .. .. reg_ddrc_t_cksre = 0x6 + // .. .. ==> 0XF8006078[15:12] = 0x00000006U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00006000U + // .. .. reg_ddrc_t_cksrx = 0x6 + // .. .. ==> 0XF8006078[19:16] = 0x00000006U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00060000U + // .. .. reg_ddrc_t_ckesr = 0x4 + // .. .. ==> 0XF8006078[25:20] = 0x00000004U + // .. .. ==> MASK : 0x03F00000U VAL : 0x00400000U + // .. .. + EMIT_MASKWRITE(0XF8006078, 0x03FFFFFFU ,0x00466111U), + // .. .. reg_ddrc_t_ckpde = 0x2 + // .. .. ==> 0XF800607C[3:0] = 0x00000002U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000002U + // .. .. reg_ddrc_t_ckpdx = 0x2 + // .. .. ==> 0XF800607C[7:4] = 0x00000002U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000020U + // .. .. reg_ddrc_t_ckdpde = 0x2 + // .. .. ==> 0XF800607C[11:8] = 0x00000002U + // .. .. ==> MASK : 0x00000F00U VAL : 0x00000200U + // .. .. reg_ddrc_t_ckdpdx = 0x2 + // .. .. ==> 0XF800607C[15:12] = 0x00000002U + // .. .. ==> MASK : 0x0000F000U VAL : 0x00002000U + // .. .. reg_ddrc_t_ckcsx = 0x3 + // .. .. ==> 0XF800607C[19:16] = 0x00000003U + // .. .. ==> MASK : 0x000F0000U VAL : 0x00030000U + // .. .. + EMIT_MASKWRITE(0XF800607C, 0x000FFFFFU ,0x00032222U), + // .. .. reg_ddrc_dis_auto_zq = 0x0 + // .. .. ==> 0XF80060A4[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_ddr3 = 0x1 + // .. .. ==> 0XF80060A4[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. reg_ddrc_t_mod = 0x200 + // .. .. ==> 0XF80060A4[11:2] = 0x00000200U + // .. .. ==> MASK : 0x00000FFCU VAL : 0x00000800U + // .. .. reg_ddrc_t_zq_long_nop = 0x200 + // .. .. ==> 0XF80060A4[21:12] = 0x00000200U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00200000U + // .. .. reg_ddrc_t_zq_short_nop = 0x40 + // .. .. ==> 0XF80060A4[31:22] = 0x00000040U + // .. .. ==> MASK : 0xFFC00000U VAL : 0x10000000U + // .. .. + EMIT_MASKWRITE(0XF80060A4, 0xFFFFFFFFU ,0x10200802U), + // .. .. t_zq_short_interval_x1024 = 0xc845 + // .. .. ==> 0XF80060A8[19:0] = 0x0000C845U + // .. .. ==> MASK : 0x000FFFFFU VAL : 0x0000C845U + // .. .. dram_rstn_x1024 = 0x67 + // .. .. ==> 0XF80060A8[27:20] = 0x00000067U + // .. .. ==> MASK : 0x0FF00000U VAL : 0x06700000U + // .. .. + EMIT_MASKWRITE(0XF80060A8, 0x0FFFFFFFU ,0x0670C845U), + // .. .. deeppowerdown_en = 0x0 + // .. .. ==> 0XF80060AC[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. deeppowerdown_to_x1024 = 0xff + // .. .. ==> 0XF80060AC[8:1] = 0x000000FFU + // .. .. ==> MASK : 0x000001FEU VAL : 0x000001FEU + // .. .. + EMIT_MASKWRITE(0XF80060AC, 0x000001FFU ,0x000001FEU), + // .. .. dfi_wrlvl_max_x1024 = 0xfff + // .. .. ==> 0XF80060B0[11:0] = 0x00000FFFU + // .. .. ==> MASK : 0x00000FFFU VAL : 0x00000FFFU + // .. .. dfi_rdlvl_max_x1024 = 0xfff + // .. .. ==> 0XF80060B0[23:12] = 0x00000FFFU + // .. .. ==> MASK : 0x00FFF000U VAL : 0x00FFF000U + // .. .. ddrc_reg_twrlvl_max_error = 0x0 + // .. .. ==> 0XF80060B0[24:24] = 0x00000000U + // .. .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. .. ddrc_reg_trdlvl_max_error = 0x0 + // .. .. ==> 0XF80060B0[25:25] = 0x00000000U + // .. .. ==> MASK : 0x02000000U VAL : 0x00000000U + // .. .. reg_ddrc_dfi_wr_level_en = 0x1 + // .. .. ==> 0XF80060B0[26:26] = 0x00000001U + // .. .. ==> MASK : 0x04000000U VAL : 0x04000000U + // .. .. reg_ddrc_dfi_rd_dqs_gate_level = 0x1 + // .. .. ==> 0XF80060B0[27:27] = 0x00000001U + // .. .. ==> MASK : 0x08000000U VAL : 0x08000000U + // .. .. reg_ddrc_dfi_rd_data_eye_train = 0x1 + // .. .. ==> 0XF80060B0[28:28] = 0x00000001U + // .. .. ==> MASK : 0x10000000U VAL : 0x10000000U + // .. .. + EMIT_MASKWRITE(0XF80060B0, 0x1FFFFFFFU ,0x1CFFFFFFU), + // .. .. reg_ddrc_skip_ocd = 0x1 + // .. .. ==> 0XF80060B4[9:9] = 0x00000001U + // .. .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. .. + EMIT_MASKWRITE(0XF80060B4, 0x00000200U ,0x00000200U), + // .. .. reg_ddrc_dfi_t_rddata_en = 0x6 + // .. .. ==> 0XF80060B8[4:0] = 0x00000006U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000006U + // .. .. reg_ddrc_dfi_t_ctrlup_min = 0x3 + // .. .. ==> 0XF80060B8[14:5] = 0x00000003U + // .. .. ==> MASK : 0x00007FE0U VAL : 0x00000060U + // .. .. reg_ddrc_dfi_t_ctrlup_max = 0x40 + // .. .. ==> 0XF80060B8[24:15] = 0x00000040U + // .. .. ==> MASK : 0x01FF8000U VAL : 0x00200000U + // .. .. + EMIT_MASKWRITE(0XF80060B8, 0x01FFFFFFU ,0x00200066U), + // .. .. START: RESET ECC ERROR + // .. .. Clear_Uncorrectable_DRAM_ECC_error = 1 + // .. .. ==> 0XF80060C4[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. Clear_Correctable_DRAM_ECC_error = 1 + // .. .. ==> 0XF80060C4[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. + EMIT_MASKWRITE(0XF80060C4, 0x00000003U ,0x00000003U), + // .. .. FINISH: RESET ECC ERROR + // .. .. Clear_Uncorrectable_DRAM_ECC_error = 0x0 + // .. .. ==> 0XF80060C4[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. Clear_Correctable_DRAM_ECC_error = 0x0 + // .. .. ==> 0XF80060C4[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF80060C4, 0x00000003U ,0x00000000U), + // .. .. CORR_ECC_LOG_VALID = 0x0 + // .. .. ==> 0XF80060C8[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. ECC_CORRECTED_BIT_NUM = 0x0 + // .. .. ==> 0XF80060C8[7:1] = 0x00000000U + // .. .. ==> MASK : 0x000000FEU VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF80060C8, 0x000000FFU ,0x00000000U), + // .. .. UNCORR_ECC_LOG_VALID = 0x0 + // .. .. ==> 0XF80060DC[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF80060DC, 0x00000001U ,0x00000000U), + // .. .. STAT_NUM_CORR_ERR = 0x0 + // .. .. ==> 0XF80060F0[15:8] = 0x00000000U + // .. .. ==> MASK : 0x0000FF00U VAL : 0x00000000U + // .. .. STAT_NUM_UNCORR_ERR = 0x0 + // .. .. ==> 0XF80060F0[7:0] = 0x00000000U + // .. .. ==> MASK : 0x000000FFU VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF80060F0, 0x0000FFFFU ,0x00000000U), + // .. .. reg_ddrc_ecc_mode = 0x0 + // .. .. ==> 0XF80060F4[2:0] = 0x00000000U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000000U + // .. .. reg_ddrc_dis_scrub = 0x1 + // .. .. ==> 0XF80060F4[3:3] = 0x00000001U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. .. + EMIT_MASKWRITE(0XF80060F4, 0x0000000FU ,0x00000008U), + // .. .. reg_phy_dif_on = 0x0 + // .. .. ==> 0XF8006114[3:0] = 0x00000000U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000000U + // .. .. reg_phy_dif_off = 0x0 + // .. .. ==> 0XF8006114[7:4] = 0x00000000U + // .. .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006114, 0x000000FFU ,0x00000000U), + // .. .. reg_phy_data_slice_in_use = 0x1 + // .. .. ==> 0XF8006118[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. reg_phy_rdlvl_inc_mode = 0x0 + // .. .. ==> 0XF8006118[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_phy_gatelvl_inc_mode = 0x0 + // .. .. ==> 0XF8006118[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reg_phy_wrlvl_inc_mode = 0x0 + // .. .. ==> 0XF8006118[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reg_phy_bist_shift_dq = 0x0 + // .. .. ==> 0XF8006118[14:6] = 0x00000000U + // .. .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. .. reg_phy_bist_err_clr = 0x0 + // .. .. ==> 0XF8006118[23:15] = 0x00000000U + // .. .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. .. reg_phy_dq_offset = 0x40 + // .. .. ==> 0XF8006118[30:24] = 0x00000040U + // .. .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006118, 0x7FFFFFCFU ,0x40000001U), + // .. .. reg_phy_data_slice_in_use = 0x1 + // .. .. ==> 0XF800611C[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. reg_phy_rdlvl_inc_mode = 0x0 + // .. .. ==> 0XF800611C[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_phy_gatelvl_inc_mode = 0x0 + // .. .. ==> 0XF800611C[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reg_phy_wrlvl_inc_mode = 0x0 + // .. .. ==> 0XF800611C[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reg_phy_bist_shift_dq = 0x0 + // .. .. ==> 0XF800611C[14:6] = 0x00000000U + // .. .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. .. reg_phy_bist_err_clr = 0x0 + // .. .. ==> 0XF800611C[23:15] = 0x00000000U + // .. .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. .. reg_phy_dq_offset = 0x40 + // .. .. ==> 0XF800611C[30:24] = 0x00000040U + // .. .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF800611C, 0x7FFFFFCFU ,0x40000001U), + // .. .. reg_phy_data_slice_in_use = 0x1 + // .. .. ==> 0XF8006120[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. reg_phy_rdlvl_inc_mode = 0x0 + // .. .. ==> 0XF8006120[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_phy_gatelvl_inc_mode = 0x0 + // .. .. ==> 0XF8006120[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reg_phy_wrlvl_inc_mode = 0x0 + // .. .. ==> 0XF8006120[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reg_phy_bist_shift_dq = 0x0 + // .. .. ==> 0XF8006120[14:6] = 0x00000000U + // .. .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. .. reg_phy_bist_err_clr = 0x0 + // .. .. ==> 0XF8006120[23:15] = 0x00000000U + // .. .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. .. reg_phy_dq_offset = 0x40 + // .. .. ==> 0XF8006120[30:24] = 0x00000040U + // .. .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006120, 0x7FFFFFCFU ,0x40000001U), + // .. .. reg_phy_data_slice_in_use = 0x1 + // .. .. ==> 0XF8006124[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. reg_phy_rdlvl_inc_mode = 0x0 + // .. .. ==> 0XF8006124[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_phy_gatelvl_inc_mode = 0x0 + // .. .. ==> 0XF8006124[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reg_phy_wrlvl_inc_mode = 0x0 + // .. .. ==> 0XF8006124[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reg_phy_bist_shift_dq = 0x0 + // .. .. ==> 0XF8006124[14:6] = 0x00000000U + // .. .. ==> MASK : 0x00007FC0U VAL : 0x00000000U + // .. .. reg_phy_bist_err_clr = 0x0 + // .. .. ==> 0XF8006124[23:15] = 0x00000000U + // .. .. ==> MASK : 0x00FF8000U VAL : 0x00000000U + // .. .. reg_phy_dq_offset = 0x40 + // .. .. ==> 0XF8006124[30:24] = 0x00000040U + // .. .. ==> MASK : 0x7F000000U VAL : 0x40000000U + // .. .. + EMIT_MASKWRITE(0XF8006124, 0x7FFFFFCFU ,0x40000001U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF800612C[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0x8f + // .. .. ==> 0XF800612C[19:10] = 0x0000008FU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00023C00U + // .. .. + EMIT_MASKWRITE(0XF800612C, 0x000FFFFFU ,0x00023C00U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006130[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0x8a + // .. .. ==> 0XF8006130[19:10] = 0x0000008AU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00022800U + // .. .. + EMIT_MASKWRITE(0XF8006130, 0x000FFFFFU ,0x00022800U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006134[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0x8b + // .. .. ==> 0XF8006134[19:10] = 0x0000008BU + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00022C00U + // .. .. + EMIT_MASKWRITE(0XF8006134, 0x000FFFFFU ,0x00022C00U), + // .. .. reg_phy_wrlvl_init_ratio = 0x0 + // .. .. ==> 0XF8006138[9:0] = 0x00000000U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000000U + // .. .. reg_phy_gatelvl_init_ratio = 0x92 + // .. .. ==> 0XF8006138[19:10] = 0x00000092U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00024800U + // .. .. + EMIT_MASKWRITE(0XF8006138, 0x000FFFFFU ,0x00024800U), + // .. .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. .. ==> 0XF8006140[9:0] = 0x00000035U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. .. reg_phy_rd_dqs_slave_force = 0x0 + // .. .. ==> 0XF8006140[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. .. ==> 0XF8006140[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006140, 0x000FFFFFU ,0x00000035U), + // .. .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. .. ==> 0XF8006144[9:0] = 0x00000035U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. .. reg_phy_rd_dqs_slave_force = 0x0 + // .. .. ==> 0XF8006144[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. .. ==> 0XF8006144[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006144, 0x000FFFFFU ,0x00000035U), + // .. .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. .. ==> 0XF8006148[9:0] = 0x00000035U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. .. reg_phy_rd_dqs_slave_force = 0x0 + // .. .. ==> 0XF8006148[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. .. ==> 0XF8006148[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006148, 0x000FFFFFU ,0x00000035U), + // .. .. reg_phy_rd_dqs_slave_ratio = 0x35 + // .. .. ==> 0XF800614C[9:0] = 0x00000035U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000035U + // .. .. reg_phy_rd_dqs_slave_force = 0x0 + // .. .. ==> 0XF800614C[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_rd_dqs_slave_delay = 0x0 + // .. .. ==> 0XF800614C[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800614C, 0x000FFFFFU ,0x00000035U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x77 + // .. .. ==> 0XF8006154[9:0] = 0x00000077U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000077U + // .. .. reg_phy_wr_dqs_slave_force = 0x0 + // .. .. ==> 0XF8006154[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. .. ==> 0XF8006154[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006154, 0x000FFFFFU ,0x00000077U), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x7c + // .. .. ==> 0XF8006158[9:0] = 0x0000007CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000007CU + // .. .. reg_phy_wr_dqs_slave_force = 0x0 + // .. .. ==> 0XF8006158[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. .. ==> 0XF8006158[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006158, 0x000FFFFFU ,0x0000007CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x7c + // .. .. ==> 0XF800615C[9:0] = 0x0000007CU + // .. .. ==> MASK : 0x000003FFU VAL : 0x0000007CU + // .. .. reg_phy_wr_dqs_slave_force = 0x0 + // .. .. ==> 0XF800615C[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. .. ==> 0XF800615C[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800615C, 0x000FFFFFU ,0x0000007CU), + // .. .. reg_phy_wr_dqs_slave_ratio = 0x75 + // .. .. ==> 0XF8006160[9:0] = 0x00000075U + // .. .. ==> MASK : 0x000003FFU VAL : 0x00000075U + // .. .. reg_phy_wr_dqs_slave_force = 0x0 + // .. .. ==> 0XF8006160[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_wr_dqs_slave_delay = 0x0 + // .. .. ==> 0XF8006160[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006160, 0x000FFFFFU ,0x00000075U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xe4 + // .. .. ==> 0XF8006168[10:0] = 0x000000E4U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000E4U + // .. .. reg_phy_fifo_we_in_force = 0x0 + // .. .. ==> 0XF8006168[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. reg_phy_fifo_we_in_delay = 0x0 + // .. .. ==> 0XF8006168[20:12] = 0x00000000U + // .. .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006168, 0x001FFFFFU ,0x000000E4U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xdf + // .. .. ==> 0XF800616C[10:0] = 0x000000DFU + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000DFU + // .. .. reg_phy_fifo_we_in_force = 0x0 + // .. .. ==> 0XF800616C[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. reg_phy_fifo_we_in_delay = 0x0 + // .. .. ==> 0XF800616C[20:12] = 0x00000000U + // .. .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800616C, 0x001FFFFFU ,0x000000DFU), + // .. .. reg_phy_fifo_we_slave_ratio = 0xe0 + // .. .. ==> 0XF8006170[10:0] = 0x000000E0U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000E0U + // .. .. reg_phy_fifo_we_in_force = 0x0 + // .. .. ==> 0XF8006170[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. reg_phy_fifo_we_in_delay = 0x0 + // .. .. ==> 0XF8006170[20:12] = 0x00000000U + // .. .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006170, 0x001FFFFFU ,0x000000E0U), + // .. .. reg_phy_fifo_we_slave_ratio = 0xe7 + // .. .. ==> 0XF8006174[10:0] = 0x000000E7U + // .. .. ==> MASK : 0x000007FFU VAL : 0x000000E7U + // .. .. reg_phy_fifo_we_in_force = 0x0 + // .. .. ==> 0XF8006174[11:11] = 0x00000000U + // .. .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. .. reg_phy_fifo_we_in_delay = 0x0 + // .. .. ==> 0XF8006174[20:12] = 0x00000000U + // .. .. ==> MASK : 0x001FF000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006174, 0x001FFFFFU ,0x000000E7U), + // .. .. reg_phy_wr_data_slave_ratio = 0xb7 + // .. .. ==> 0XF800617C[9:0] = 0x000000B7U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000B7U + // .. .. reg_phy_wr_data_slave_force = 0x0 + // .. .. ==> 0XF800617C[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_wr_data_slave_delay = 0x0 + // .. .. ==> 0XF800617C[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800617C, 0x000FFFFFU ,0x000000B7U), + // .. .. reg_phy_wr_data_slave_ratio = 0xbc + // .. .. ==> 0XF8006180[9:0] = 0x000000BCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000BCU + // .. .. reg_phy_wr_data_slave_force = 0x0 + // .. .. ==> 0XF8006180[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_wr_data_slave_delay = 0x0 + // .. .. ==> 0XF8006180[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006180, 0x000FFFFFU ,0x000000BCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xbc + // .. .. ==> 0XF8006184[9:0] = 0x000000BCU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000BCU + // .. .. reg_phy_wr_data_slave_force = 0x0 + // .. .. ==> 0XF8006184[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_wr_data_slave_delay = 0x0 + // .. .. ==> 0XF8006184[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006184, 0x000FFFFFU ,0x000000BCU), + // .. .. reg_phy_wr_data_slave_ratio = 0xb5 + // .. .. ==> 0XF8006188[9:0] = 0x000000B5U + // .. .. ==> MASK : 0x000003FFU VAL : 0x000000B5U + // .. .. reg_phy_wr_data_slave_force = 0x0 + // .. .. ==> 0XF8006188[10:10] = 0x00000000U + // .. .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. .. reg_phy_wr_data_slave_delay = 0x0 + // .. .. ==> 0XF8006188[19:11] = 0x00000000U + // .. .. ==> MASK : 0x000FF800U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006188, 0x000FFFFFU ,0x000000B5U), + // .. .. reg_phy_bl2 = 0x0 + // .. .. ==> 0XF8006190[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_phy_at_spd_atpg = 0x0 + // .. .. ==> 0XF8006190[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reg_phy_bist_enable = 0x0 + // .. .. ==> 0XF8006190[3:3] = 0x00000000U + // .. .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. .. reg_phy_bist_force_err = 0x0 + // .. .. ==> 0XF8006190[4:4] = 0x00000000U + // .. .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. .. reg_phy_bist_mode = 0x0 + // .. .. ==> 0XF8006190[6:5] = 0x00000000U + // .. .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. .. reg_phy_invert_clkout = 0x1 + // .. .. ==> 0XF8006190[7:7] = 0x00000001U + // .. .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. .. reg_phy_sel_logic = 0x0 + // .. .. ==> 0XF8006190[9:9] = 0x00000000U + // .. .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. .. reg_phy_ctrl_slave_ratio = 0x100 + // .. .. ==> 0XF8006190[19:10] = 0x00000100U + // .. .. ==> MASK : 0x000FFC00U VAL : 0x00040000U + // .. .. reg_phy_ctrl_slave_force = 0x0 + // .. .. ==> 0XF8006190[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. reg_phy_ctrl_slave_delay = 0x0 + // .. .. ==> 0XF8006190[27:21] = 0x00000000U + // .. .. ==> MASK : 0x0FE00000U VAL : 0x00000000U + // .. .. reg_phy_lpddr = 0x0 + // .. .. ==> 0XF8006190[29:29] = 0x00000000U + // .. .. ==> MASK : 0x20000000U VAL : 0x00000000U + // .. .. reg_phy_cmd_latency = 0x0 + // .. .. ==> 0XF8006190[30:30] = 0x00000000U + // .. .. ==> MASK : 0x40000000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006190, 0x6FFFFEFEU ,0x00040080U), + // .. .. reg_phy_wr_rl_delay = 0x2 + // .. .. ==> 0XF8006194[4:0] = 0x00000002U + // .. .. ==> MASK : 0x0000001FU VAL : 0x00000002U + // .. .. reg_phy_rd_rl_delay = 0x4 + // .. .. ==> 0XF8006194[9:5] = 0x00000004U + // .. .. ==> MASK : 0x000003E0U VAL : 0x00000080U + // .. .. reg_phy_dll_lock_diff = 0xf + // .. .. ==> 0XF8006194[13:10] = 0x0000000FU + // .. .. ==> MASK : 0x00003C00U VAL : 0x00003C00U + // .. .. reg_phy_use_wr_level = 0x1 + // .. .. ==> 0XF8006194[14:14] = 0x00000001U + // .. .. ==> MASK : 0x00004000U VAL : 0x00004000U + // .. .. reg_phy_use_rd_dqs_gate_level = 0x1 + // .. .. ==> 0XF8006194[15:15] = 0x00000001U + // .. .. ==> MASK : 0x00008000U VAL : 0x00008000U + // .. .. reg_phy_use_rd_data_eye_level = 0x1 + // .. .. ==> 0XF8006194[16:16] = 0x00000001U + // .. .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. .. reg_phy_dis_calib_rst = 0x0 + // .. .. ==> 0XF8006194[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_phy_ctrl_slave_delay = 0x0 + // .. .. ==> 0XF8006194[19:18] = 0x00000000U + // .. .. ==> MASK : 0x000C0000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006194, 0x000FFFFFU ,0x0001FC82U), + // .. .. reg_arb_page_addr_mask = 0x0 + // .. .. ==> 0XF8006204[31:0] = 0x00000000U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006204, 0xFFFFFFFFU ,0x00000000U), + // .. .. reg_arb_pri_wr_portn = 0x3ff + // .. .. ==> 0XF8006208[9:0] = 0x000003FFU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. .. reg_arb_disable_aging_wr_portn = 0x0 + // .. .. ==> 0XF8006208[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. .. ==> 0XF8006208[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. .. ==> 0XF8006208[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006208, 0x000703FFU ,0x000003FFU), + // .. .. reg_arb_pri_wr_portn = 0x3ff + // .. .. ==> 0XF800620C[9:0] = 0x000003FFU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. .. reg_arb_disable_aging_wr_portn = 0x0 + // .. .. ==> 0XF800620C[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. .. ==> 0XF800620C[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. .. ==> 0XF800620C[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800620C, 0x000703FFU ,0x000003FFU), + // .. .. reg_arb_pri_wr_portn = 0x3ff + // .. .. ==> 0XF8006210[9:0] = 0x000003FFU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. .. reg_arb_disable_aging_wr_portn = 0x0 + // .. .. ==> 0XF8006210[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. .. ==> 0XF8006210[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. .. ==> 0XF8006210[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006210, 0x000703FFU ,0x000003FFU), + // .. .. reg_arb_pri_wr_portn = 0x3ff + // .. .. ==> 0XF8006214[9:0] = 0x000003FFU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. .. reg_arb_disable_aging_wr_portn = 0x0 + // .. .. ==> 0XF8006214[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. reg_arb_disable_urgent_wr_portn = 0x0 + // .. .. ==> 0XF8006214[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_arb_dis_page_match_wr_portn = 0x0 + // .. .. ==> 0XF8006214[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006214, 0x000703FFU ,0x000003FFU), + // .. .. reg_arb_pri_rd_portn = 0x3ff + // .. .. ==> 0XF8006218[9:0] = 0x000003FFU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. .. reg_arb_disable_aging_rd_portn = 0x0 + // .. .. ==> 0XF8006218[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. .. ==> 0XF8006218[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. .. ==> 0XF8006218[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. reg_arb_set_hpr_rd_portn = 0x0 + // .. .. ==> 0XF8006218[19:19] = 0x00000000U + // .. .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006218, 0x000F03FFU ,0x000003FFU), + // .. .. reg_arb_pri_rd_portn = 0x3ff + // .. .. ==> 0XF800621C[9:0] = 0x000003FFU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. .. reg_arb_disable_aging_rd_portn = 0x0 + // .. .. ==> 0XF800621C[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. .. ==> 0XF800621C[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. .. ==> 0XF800621C[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. reg_arb_set_hpr_rd_portn = 0x0 + // .. .. ==> 0XF800621C[19:19] = 0x00000000U + // .. .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF800621C, 0x000F03FFU ,0x000003FFU), + // .. .. reg_arb_pri_rd_portn = 0x3ff + // .. .. ==> 0XF8006220[9:0] = 0x000003FFU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. .. reg_arb_disable_aging_rd_portn = 0x0 + // .. .. ==> 0XF8006220[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. .. ==> 0XF8006220[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. .. ==> 0XF8006220[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. reg_arb_set_hpr_rd_portn = 0x0 + // .. .. ==> 0XF8006220[19:19] = 0x00000000U + // .. .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006220, 0x000F03FFU ,0x000003FFU), + // .. .. reg_arb_pri_rd_portn = 0x3ff + // .. .. ==> 0XF8006224[9:0] = 0x000003FFU + // .. .. ==> MASK : 0x000003FFU VAL : 0x000003FFU + // .. .. reg_arb_disable_aging_rd_portn = 0x0 + // .. .. ==> 0XF8006224[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. reg_arb_disable_urgent_rd_portn = 0x0 + // .. .. ==> 0XF8006224[17:17] = 0x00000000U + // .. .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. .. reg_arb_dis_page_match_rd_portn = 0x0 + // .. .. ==> 0XF8006224[18:18] = 0x00000000U + // .. .. ==> MASK : 0x00040000U VAL : 0x00000000U + // .. .. reg_arb_set_hpr_rd_portn = 0x0 + // .. .. ==> 0XF8006224[19:19] = 0x00000000U + // .. .. ==> MASK : 0x00080000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006224, 0x000F03FFU ,0x000003FFU), + // .. .. reg_ddrc_lpddr2 = 0x0 + // .. .. ==> 0XF80062A8[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. reg_ddrc_derate_enable = 0x0 + // .. .. ==> 0XF80062A8[2:2] = 0x00000000U + // .. .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. .. reg_ddrc_mr4_margin = 0x0 + // .. .. ==> 0XF80062A8[11:4] = 0x00000000U + // .. .. ==> MASK : 0x00000FF0U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF80062A8, 0x00000FF5U ,0x00000000U), + // .. .. reg_ddrc_mr4_read_interval = 0x0 + // .. .. ==> 0XF80062AC[31:0] = 0x00000000U + // .. .. ==> MASK : 0xFFFFFFFFU VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF80062AC, 0xFFFFFFFFU ,0x00000000U), + // .. .. reg_ddrc_min_stable_clock_x1 = 0x5 + // .. .. ==> 0XF80062B0[3:0] = 0x00000005U + // .. .. ==> MASK : 0x0000000FU VAL : 0x00000005U + // .. .. reg_ddrc_idle_after_reset_x32 = 0x12 + // .. .. ==> 0XF80062B0[11:4] = 0x00000012U + // .. .. ==> MASK : 0x00000FF0U VAL : 0x00000120U + // .. .. reg_ddrc_t_mrw = 0x5 + // .. .. ==> 0XF80062B0[21:12] = 0x00000005U + // .. .. ==> MASK : 0x003FF000U VAL : 0x00005000U + // .. .. + EMIT_MASKWRITE(0XF80062B0, 0x003FFFFFU ,0x00005125U), + // .. .. reg_ddrc_max_auto_init_x1024 = 0xa6 + // .. .. ==> 0XF80062B4[7:0] = 0x000000A6U + // .. .. ==> MASK : 0x000000FFU VAL : 0x000000A6U + // .. .. reg_ddrc_dev_zqinit_x32 = 0x12 + // .. .. ==> 0XF80062B4[17:8] = 0x00000012U + // .. .. ==> MASK : 0x0003FF00U VAL : 0x00001200U + // .. .. + EMIT_MASKWRITE(0XF80062B4, 0x0003FFFFU ,0x000012A6U), + // .. .. START: POLL ON DCI STATUS + // .. .. DONE = 1 + // .. .. ==> 0XF8000B74[13:13] = 0x00000001U + // .. .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. .. + EMIT_MASKPOLL(0XF8000B74, 0x00002000U), + // .. .. FINISH: POLL ON DCI STATUS + // .. .. START: UNLOCK DDR + // .. .. reg_ddrc_soft_rstb = 0x1 + // .. .. ==> 0XF8006000[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. reg_ddrc_powerdown_en = 0x0 + // .. .. ==> 0XF8006000[1:1] = 0x00000000U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. .. reg_ddrc_data_bus_width = 0x0 + // .. .. ==> 0XF8006000[3:2] = 0x00000000U + // .. .. ==> MASK : 0x0000000CU VAL : 0x00000000U + // .. .. reg_ddrc_burst8_refresh = 0x0 + // .. .. ==> 0XF8006000[6:4] = 0x00000000U + // .. .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. .. reg_ddrc_rdwr_idle_gap = 1 + // .. .. ==> 0XF8006000[13:7] = 0x00000001U + // .. .. ==> MASK : 0x00003F80U VAL : 0x00000080U + // .. .. reg_ddrc_dis_rd_bypass = 0x0 + // .. .. ==> 0XF8006000[14:14] = 0x00000000U + // .. .. ==> MASK : 0x00004000U VAL : 0x00000000U + // .. .. reg_ddrc_dis_act_bypass = 0x0 + // .. .. ==> 0XF8006000[15:15] = 0x00000000U + // .. .. ==> MASK : 0x00008000U VAL : 0x00000000U + // .. .. reg_ddrc_dis_auto_refresh = 0x0 + // .. .. ==> 0XF8006000[16:16] = 0x00000000U + // .. .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8006000, 0x0001FFFFU ,0x00000081U), + // .. .. FINISH: UNLOCK DDR + // .. .. START: CHECK DDR STATUS + // .. .. ddrc_reg_operating_mode = 1 + // .. .. ==> 0XF8006054[2:0] = 0x00000001U + // .. .. ==> MASK : 0x00000007U VAL : 0x00000001U + // .. .. + EMIT_MASKPOLL(0XF8006054, 0x00000007U), + // .. .. FINISH: CHECK DDR STATUS + // .. FINISH: DDR INITIALIZATION + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_mio_init_data_3_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: OCM REMAPPING + // .. VREF_EN = 0x1 + // .. ==> 0XF8000B00[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B00[6:4] = 0x00000000U + // .. ==> MASK : 0x00000070U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B00, 0x00000071U ,0x00000001U), + // .. FINISH: OCM REMAPPING + // .. START: DDRIOB SETTINGS + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B40[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B40[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B40[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B40[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B40[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B40[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B40[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B40[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B40, 0x00000FFEU ,0x00000600U), + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B44[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B44[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B44[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B44[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B44[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B44[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B44[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B44[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B44, 0x00000FFEU ,0x00000600U), + // .. INP_TYPE = 0x1 + // .. ==> 0XF8000B48[2:1] = 0x00000001U + // .. ==> MASK : 0x00000006U VAL : 0x00000002U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B48[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B48[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCI_TYPE = 0x3 + // .. ==> 0XF8000B48[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B48[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B48[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B48[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B48[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B48, 0x00000FFEU ,0x00000672U), + // .. INP_TYPE = 0x1 + // .. ==> 0XF8000B4C[2:1] = 0x00000001U + // .. ==> MASK : 0x00000006U VAL : 0x00000002U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B4C[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B4C[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCI_TYPE = 0x3 + // .. ==> 0XF8000B4C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B4C[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B4C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B4C[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B4C[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000FFEU ,0x00000672U), + // .. INP_TYPE = 0x2 + // .. ==> 0XF8000B50[2:1] = 0x00000002U + // .. ==> MASK : 0x00000006U VAL : 0x00000004U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B50[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B50[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCI_TYPE = 0x3 + // .. ==> 0XF8000B50[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B50[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B50[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B50[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B50[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B50, 0x00000FFEU ,0x00000674U), + // .. INP_TYPE = 0x2 + // .. ==> 0XF8000B54[2:1] = 0x00000002U + // .. ==> MASK : 0x00000006U VAL : 0x00000004U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B54[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x1 + // .. ==> 0XF8000B54[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. DCI_TYPE = 0x3 + // .. ==> 0XF8000B54[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. IBUF_DISABLE_MODE = 0 + // .. ==> 0XF8000B54[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0 + // .. ==> 0XF8000B54[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B54[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B54[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000FFEU ,0x00000674U), + // .. INP_TYPE = 0x0 + // .. ==> 0XF8000B58[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. DCI_UPDATE_B = 0x0 + // .. ==> 0XF8000B58[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. TERM_EN = 0x0 + // .. ==> 0XF8000B58[4:4] = 0x00000000U + // .. ==> MASK : 0x00000010U VAL : 0x00000000U + // .. DCI_TYPE = 0x0 + // .. ==> 0XF8000B58[6:5] = 0x00000000U + // .. ==> MASK : 0x00000060U VAL : 0x00000000U + // .. IBUF_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B58[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. TERM_DISABLE_MODE = 0x0 + // .. ==> 0XF8000B58[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. OUTPUT_EN = 0x3 + // .. ==> 0XF8000B58[10:9] = 0x00000003U + // .. ==> MASK : 0x00000600U VAL : 0x00000600U + // .. PULLUP_EN = 0x0 + // .. ==> 0XF8000B58[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000B58, 0x00000FFEU ,0x00000600U), + // .. VREF_INT_EN = 0x0 + // .. ==> 0XF8000B6C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. VREF_SEL = 0x0 + // .. ==> 0XF8000B6C[4:1] = 0x00000000U + // .. ==> MASK : 0x0000001EU VAL : 0x00000000U + // .. VREF_EXT_EN = 0x3 + // .. ==> 0XF8000B6C[6:5] = 0x00000003U + // .. ==> MASK : 0x00000060U VAL : 0x00000060U + // .. REFIO_EN = 0x1 + // .. ==> 0XF8000B6C[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. + EMIT_MASKWRITE(0XF8000B6C, 0x0000027FU ,0x00000260U), + // .. .. START: ASSERT RESET + // .. .. RESET = 1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000001U ,0x00000001U), + // .. .. FINISH: ASSERT RESET + // .. .. START: DEASSERT RESET + // .. .. RESET = 0 + // .. .. ==> 0XF8000B70[0:0] = 0x00000000U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x00000001U ,0x00000000U), + // .. .. FINISH: DEASSERT RESET + // .. .. RESET = 0x1 + // .. .. ==> 0XF8000B70[0:0] = 0x00000001U + // .. .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. .. ENABLE = 0x1 + // .. .. ==> 0XF8000B70[1:1] = 0x00000001U + // .. .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. .. NREF_OPT1 = 0x0 + // .. .. ==> 0XF8000B70[7:6] = 0x00000000U + // .. .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. .. NREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[10:8] = 0x00000000U + // .. .. ==> MASK : 0x00000700U VAL : 0x00000000U + // .. .. NREF_OPT4 = 0x1 + // .. .. ==> 0XF8000B70[13:11] = 0x00000001U + // .. .. ==> MASK : 0x00003800U VAL : 0x00000800U + // .. .. PREF_OPT2 = 0x0 + // .. .. ==> 0XF8000B70[19:17] = 0x00000000U + // .. .. ==> MASK : 0x000E0000U VAL : 0x00000000U + // .. .. UPDATE_CONTROL = 0x0 + // .. .. ==> 0XF8000B70[20:20] = 0x00000000U + // .. .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. .. + EMIT_MASKWRITE(0XF8000B70, 0x001E3FC3U ,0x00000803U), + // .. FINISH: DDRIOB SETTINGS + // .. START: MIO PROGRAMMING + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000700[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000700[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000700[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000700[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000700[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000700[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000700[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000700[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000700[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000700, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000704[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000704[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000704[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000704[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000704[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000704[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000704[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000704[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000704[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000704, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000708[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000708[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000708[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000708[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000708[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000708[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000708[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000708[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000708[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000708, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800070C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF800070C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800070C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800070C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800070C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800070C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF800070C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800070C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800070C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800070C, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000710[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000710[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000710[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000710[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000710[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000710[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000710[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000710[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000710[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000710, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000714[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000714[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000714[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000714[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000714[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000714[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000714[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000714[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000714[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000714, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000718[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000718[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000718[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000718[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000718[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000718[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000718[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000718[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000718[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000718, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800071C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800071C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800071C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800071C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800071C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800071C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800071C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800071C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800071C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800071C, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000720[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000720[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000720[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000720[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000720[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000720[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 3 + // .. ==> 0XF8000720[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000720[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000720[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000720, 0x00003FFFU ,0x00000702U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000724[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000724[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000724[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000724[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000724[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000724[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000724[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000724[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000724[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000724, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000728[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000728[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000728[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000728[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 2 + // .. ==> 0XF8000728[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF8000728[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000728[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF8000728[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000728[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000728, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800072C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800072C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800072C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800072C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 2 + // .. ==> 0XF800072C[7:5] = 0x00000002U + // .. ==> MASK : 0x000000E0U VAL : 0x00000040U + // .. Speed = 0 + // .. ==> 0XF800072C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800072C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 1 + // .. ==> 0XF800072C[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. DisableRcvr = 0 + // .. ==> 0XF800072C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800072C, 0x00003FFFU ,0x00001640U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000730[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000730[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000730[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000730[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000730[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000730[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000730[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000730[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000730[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000730, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000734[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000734[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000734[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000734[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000734[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000734[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000734[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000734[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000734[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000734, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000738[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000738[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF8000738[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000738[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000738[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF8000738[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF8000738[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF8000738[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000738[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000738, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800073C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800073C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF800073C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800073C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800073C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF800073C[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 3 + // .. ==> 0XF800073C[11:9] = 0x00000003U + // .. ==> MASK : 0x00000E00U VAL : 0x00000600U + // .. PULLUP = 0 + // .. ==> 0XF800073C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800073C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800073C, 0x00003FFFU ,0x00000600U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000740[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000740[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000740[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000740[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000740[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000740[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000740[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000740[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000740[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000740, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000744[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000744[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000744[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000744[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000744[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000744[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000744[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000744[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000744[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000744, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000748[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000748[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000748[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000748[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000748[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000748[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000748[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000748[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000748[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000748, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800074C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF800074C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800074C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800074C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800074C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800074C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800074C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800074C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF800074C[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF800074C, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000750[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000750[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000750[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000750[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000750[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000750[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000750[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000750[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000750[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000750, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000754[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 1 + // .. ==> 0XF8000754[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000754[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000754[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000754[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000754[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000754[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000754[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 1 + // .. ==> 0XF8000754[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. + EMIT_MASKWRITE(0XF8000754, 0x00003FFFU ,0x00002902U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000758[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000758[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000758[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000758[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000758[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000758[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000758[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000758[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000758[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000758, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800075C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF800075C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800075C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800075C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800075C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800075C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800075C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800075C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800075C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800075C, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000760[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000760[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000760[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000760[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000760[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000760[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000760[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000760[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000760[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000760, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000764[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000764[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000764[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000764[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000764[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000764[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000764[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000764[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000764[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000764, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000768[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF8000768[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF8000768[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF8000768[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000768[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000768[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF8000768[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF8000768[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000768[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000768, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800076C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 1 + // .. ==> 0XF800076C[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. L1_SEL = 0 + // .. ==> 0XF800076C[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF800076C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800076C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800076C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 4 + // .. ==> 0XF800076C[11:9] = 0x00000004U + // .. ==> MASK : 0x00000E00U VAL : 0x00000800U + // .. PULLUP = 0 + // .. ==> 0XF800076C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800076C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800076C, 0x00003FFFU ,0x00000903U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000770[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000770[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000770[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000770[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000770[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000770[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000770[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000770[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000770[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000770, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000774[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF8000774[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000774[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000774[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000774[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000774[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000774[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000774[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000774[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000774, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000778[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000778[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000778[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000778[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000778[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000778[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000778[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000778[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000778[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000778, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF800077C[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF800077C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800077C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800077C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800077C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800077C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800077C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800077C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800077C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800077C, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000780[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000780[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000780[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000780[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000780[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000780[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000780[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000780[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000780[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000780, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000784[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000784[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000784[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000784[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000784[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000784[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000784[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000784[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000784[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000784, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000788[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000788[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000788[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000788[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000788[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000788[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000788[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000788[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000788[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000788, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800078C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800078C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800078C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800078C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800078C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800078C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800078C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800078C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800078C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800078C, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF8000790[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF8000790[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000790[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000790[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000790[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000790[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000790[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000790[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000790[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000790, 0x00003FFFU ,0x00000305U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000794[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000794[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000794[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000794[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000794[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000794[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000794[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000794[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000794[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000794, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF8000798[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF8000798[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF8000798[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF8000798[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF8000798[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF8000798[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF8000798[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF8000798[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF8000798[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000798, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF800079C[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF800079C[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 1 + // .. ==> 0XF800079C[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. L2_SEL = 0 + // .. ==> 0XF800079C[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF800079C[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 1 + // .. ==> 0XF800079C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF800079C[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF800079C[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF800079C[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF800079C, 0x00003FFFU ,0x00000304U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A0[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A0, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A4[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A4, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007A8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007A8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007A8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007A8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007A8[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007A8[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007A8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007A8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007A8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007A8, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007AC[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007AC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007AC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007AC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007AC[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007AC[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007AC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007AC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007AC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007AC, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007B0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007B0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007B0[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007B0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B0, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007B4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007B4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007B4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007B4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 1 + // .. ==> 0XF80007B4[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. IO_Type = 1 + // .. ==> 0XF80007B4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B4, 0x00003FFFU ,0x00000380U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007B8[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007B8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007B8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007B8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007B8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007B8, 0x00003F01U ,0x00000200U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007BC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. Speed = 0 + // .. ==> 0XF80007BC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007BC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007BC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007BC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007BC, 0x00003F01U ,0x00000201U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007C0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007C0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF80007C0[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF80007C0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C0, 0x00003FFFU ,0x000002E0U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007C4[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007C4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 7 + // .. ==> 0XF80007C4[7:5] = 0x00000007U + // .. ==> MASK : 0x000000E0U VAL : 0x000000E0U + // .. Speed = 0 + // .. ==> 0XF80007C4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C4, 0x00003FFFU ,0x000002E1U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007C8[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007C8[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007C8[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007C8[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF80007C8[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007C8[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007C8[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007C8[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007C8[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007C8, 0x00003FFFU ,0x00000201U), + // .. TRI_ENABLE = 1 + // .. ==> 0XF80007CC[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. L0_SEL = 0 + // .. ==> 0XF80007CC[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007CC[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007CC[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 0 + // .. ==> 0XF80007CC[7:5] = 0x00000000U + // .. ==> MASK : 0x000000E0U VAL : 0x00000000U + // .. Speed = 0 + // .. ==> 0XF80007CC[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007CC[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007CC[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007CC[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007CC, 0x00003FFFU ,0x00000201U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007D0[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007D0[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007D0[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007D0[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007D0[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF80007D0[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007D0[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007D0[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D0[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D0, 0x00003FFFU ,0x00000280U), + // .. TRI_ENABLE = 0 + // .. ==> 0XF80007D4[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. L0_SEL = 0 + // .. ==> 0XF80007D4[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. L1_SEL = 0 + // .. ==> 0XF80007D4[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. L2_SEL = 0 + // .. ==> 0XF80007D4[4:3] = 0x00000000U + // .. ==> MASK : 0x00000018U VAL : 0x00000000U + // .. L3_SEL = 4 + // .. ==> 0XF80007D4[7:5] = 0x00000004U + // .. ==> MASK : 0x000000E0U VAL : 0x00000080U + // .. Speed = 0 + // .. ==> 0XF80007D4[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. IO_Type = 1 + // .. ==> 0XF80007D4[11:9] = 0x00000001U + // .. ==> MASK : 0x00000E00U VAL : 0x00000200U + // .. PULLUP = 0 + // .. ==> 0XF80007D4[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. DisableRcvr = 0 + // .. ==> 0XF80007D4[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF80007D4, 0x00003FFFU ,0x00000280U), + // .. SDIO0_CD_SEL = 47 + // .. ==> 0XF8000830[21:16] = 0x0000002FU + // .. ==> MASK : 0x003F0000U VAL : 0x002F0000U + // .. + EMIT_MASKWRITE(0XF8000830, 0x003F0000U ,0x002F0000U), + // .. FINISH: MIO PROGRAMMING + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_peripherals_init_data_3_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B48[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B48[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B48, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B4C[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B4C[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B4C, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B50[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B50[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B50, 0x00000180U ,0x00000180U), + // .. IBUF_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B54[7:7] = 0x00000001U + // .. ==> MASK : 0x00000080U VAL : 0x00000080U + // .. TERM_DISABLE_MODE = 0x1 + // .. ==> 0XF8000B54[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. + EMIT_MASKWRITE(0XF8000B54, 0x00000180U ,0x00000180U), + // .. FINISH: DDR TERM/IBUF_DISABLE_MODE SETTINGS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // .. START: SRAM/NOR SET OPMODE + // .. FINISH: SRAM/NOR SET OPMODE + // .. START: UART REGISTERS + // .. BDIV = 0x5 + // .. ==> 0XE0001034[7:0] = 0x00000005U + // .. ==> MASK : 0x000000FFU VAL : 0x00000005U + // .. + EMIT_MASKWRITE(0XE0001034, 0x000000FFU ,0x00000005U), + // .. CD = 0x9 + // .. ==> 0XE0001018[15:0] = 0x00000009U + // .. ==> MASK : 0x0000FFFFU VAL : 0x00000009U + // .. + EMIT_MASKWRITE(0XE0001018, 0x0000FFFFU ,0x00000009U), + // .. STPBRK = 0x0 + // .. ==> 0XE0001000[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. STTBRK = 0x0 + // .. ==> 0XE0001000[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. RSTTO = 0x0 + // .. ==> 0XE0001000[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. TXDIS = 0x0 + // .. ==> 0XE0001000[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. TXEN = 0x1 + // .. ==> 0XE0001000[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. RXDIS = 0x0 + // .. ==> 0XE0001000[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. RXEN = 0x1 + // .. ==> 0XE0001000[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. TXRES = 0x1 + // .. ==> 0XE0001000[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. RXRES = 0x1 + // .. ==> 0XE0001000[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XE0001000, 0x000001FFU ,0x00000017U), + // .. CHMODE = 0x0 + // .. ==> 0XE0001004[9:8] = 0x00000000U + // .. ==> MASK : 0x00000300U VAL : 0x00000000U + // .. NBSTOP = 0x0 + // .. ==> 0XE0001004[7:6] = 0x00000000U + // .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. PAR = 0x4 + // .. ==> 0XE0001004[5:3] = 0x00000004U + // .. ==> MASK : 0x00000038U VAL : 0x00000020U + // .. CHRL = 0x0 + // .. ==> 0XE0001004[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. CLKS = 0x0 + // .. ==> 0XE0001004[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XE0001004, 0x000003FFU ,0x00000020U), + // .. BDIV = 0x5 + // .. ==> 0XE0000034[7:0] = 0x00000005U + // .. ==> MASK : 0x000000FFU VAL : 0x00000005U + // .. + EMIT_MASKWRITE(0XE0000034, 0x000000FFU ,0x00000005U), + // .. CD = 0x9 + // .. ==> 0XE0000018[15:0] = 0x00000009U + // .. ==> MASK : 0x0000FFFFU VAL : 0x00000009U + // .. + EMIT_MASKWRITE(0XE0000018, 0x0000FFFFU ,0x00000009U), + // .. STPBRK = 0x0 + // .. ==> 0XE0000000[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. STTBRK = 0x0 + // .. ==> 0XE0000000[7:7] = 0x00000000U + // .. ==> MASK : 0x00000080U VAL : 0x00000000U + // .. RSTTO = 0x0 + // .. ==> 0XE0000000[6:6] = 0x00000000U + // .. ==> MASK : 0x00000040U VAL : 0x00000000U + // .. TXDIS = 0x0 + // .. ==> 0XE0000000[5:5] = 0x00000000U + // .. ==> MASK : 0x00000020U VAL : 0x00000000U + // .. TXEN = 0x1 + // .. ==> 0XE0000000[4:4] = 0x00000001U + // .. ==> MASK : 0x00000010U VAL : 0x00000010U + // .. RXDIS = 0x0 + // .. ==> 0XE0000000[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. RXEN = 0x1 + // .. ==> 0XE0000000[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. TXRES = 0x1 + // .. ==> 0XE0000000[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. RXRES = 0x1 + // .. ==> 0XE0000000[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XE0000000, 0x000001FFU ,0x00000017U), + // .. CHMODE = 0x0 + // .. ==> 0XE0000004[9:8] = 0x00000000U + // .. ==> MASK : 0x00000300U VAL : 0x00000000U + // .. NBSTOP = 0x0 + // .. ==> 0XE0000004[7:6] = 0x00000000U + // .. ==> MASK : 0x000000C0U VAL : 0x00000000U + // .. PAR = 0x4 + // .. ==> 0XE0000004[5:3] = 0x00000004U + // .. ==> MASK : 0x00000038U VAL : 0x00000020U + // .. CHRL = 0x0 + // .. ==> 0XE0000004[2:1] = 0x00000000U + // .. ==> MASK : 0x00000006U VAL : 0x00000000U + // .. CLKS = 0x0 + // .. ==> 0XE0000004[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XE0000004, 0x000003FFU ,0x00000020U), + // .. FINISH: UART REGISTERS + // .. START: QSPI REGISTERS + // .. Holdb_dr = 1 + // .. ==> 0XE000D000[19:19] = 0x00000001U + // .. ==> MASK : 0x00080000U VAL : 0x00080000U + // .. + EMIT_MASKWRITE(0XE000D000, 0x00080000U ,0x00080000U), + // .. FINISH: QSPI REGISTERS + // .. START: PL POWER ON RESET REGISTERS + // .. PCFG_POR_CNT_4K = 0 + // .. ==> 0XF8007000[29:29] = 0x00000000U + // .. ==> MASK : 0x20000000U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8007000, 0x20000000U ,0x00000000U), + // .. FINISH: PL POWER ON RESET REGISTERS + // .. START: SMC TIMING CALCULATION REGISTER UPDATE + // .. .. START: NAND SET CYCLE + // .. .. FINISH: NAND SET CYCLE + // .. .. START: OPMODE + // .. .. FINISH: OPMODE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: SRAM/NOR CS0 SET CYCLE + // .. .. FINISH: SRAM/NOR CS0 SET CYCLE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: NOR CS0 BASE ADDRESS + // .. .. FINISH: NOR CS0 BASE ADDRESS + // .. .. START: SRAM/NOR CS1 SET CYCLE + // .. .. FINISH: SRAM/NOR CS1 SET CYCLE + // .. .. START: DIRECT COMMAND + // .. .. FINISH: DIRECT COMMAND + // .. .. START: NOR CS1 BASE ADDRESS + // .. .. FINISH: NOR CS1 BASE ADDRESS + // .. .. START: USB RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. DIRECTION_1 = 0x4000 + // .. .. .. ==> 0XE000A244[21:0] = 0x00004000U + // .. .. .. ==> MASK : 0x003FFFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A244, 0x003FFFFFU ,0x00004000U), + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x4000 + // .. .. .. ==> 0XE000A008[15:0] = 0x00004000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF4000U), + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. OP_ENABLE_1 = 0x4000 + // .. .. .. ==> 0XE000A248[21:0] = 0x00004000U + // .. .. .. ==> MASK : 0x003FFFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A248, 0x003FFFFFU ,0x00004000U), + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x0 + // .. .. .. ==> 0XE000A008[15:0] = 0x00000000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00000000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF0000U), + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. MASK_1_LSW = 0xbfff + // .. .. .. ==> 0XE000A008[31:16] = 0x0000BFFFU + // .. .. .. ==> MASK : 0xFFFF0000U VAL : 0xBFFF0000U + // .. .. .. DATA_1_LSW = 0x4000 + // .. .. .. ==> 0XE000A008[15:0] = 0x00004000U + // .. .. .. ==> MASK : 0x0000FFFFU VAL : 0x00004000U + // .. .. .. + EMIT_MASKWRITE(0XE000A008, 0xFFFFFFFFU ,0xBFFF4000U), + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: USB RESET + // .. .. START: ENET RESET + // .. .. .. START: DIR MODE BANK 0 + // .. .. .. FINISH: DIR MODE BANK 0 + // .. .. .. START: DIR MODE BANK 1 + // .. .. .. FINISH: DIR MODE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE BANK 0 + // .. .. .. FINISH: OUTPUT ENABLE BANK 0 + // .. .. .. START: OUTPUT ENABLE BANK 1 + // .. .. .. FINISH: OUTPUT ENABLE BANK 1 + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: ENET RESET + // .. .. START: I2C RESET + // .. .. .. START: DIR MODE GPIO BANK0 + // .. .. .. FINISH: DIR MODE GPIO BANK0 + // .. .. .. START: DIR MODE GPIO BANK1 + // .. .. .. FINISH: DIR MODE GPIO BANK1 + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: OUTPUT ENABLE + // .. .. .. FINISH: OUTPUT ENABLE + // .. .. .. START: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW LOW BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW LOW BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW LOW BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW LOW BANK [53:48] + // .. .. .. START: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. FINISH: MASK_DATA_0_LSW HIGH BANK [15:0] + // .. .. .. START: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. FINISH: MASK_DATA_0_MSW HIGH BANK [31:16] + // .. .. .. START: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. FINISH: MASK_DATA_1_LSW HIGH BANK [47:32] + // .. .. .. START: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. .. FINISH: MASK_DATA_1_MSW HIGH BANK [53:48] + // .. .. FINISH: I2C RESET + // .. FINISH: SMC TIMING CALCULATION REGISTER UPDATE + // FINISH: top + // + EMIT_EXIT(), + + // +}; + +unsigned long ps7_post_config_3_0[] = { + // START: top + // .. START: SLCR SETTINGS + // .. UNLOCK_KEY = 0XDF0D + // .. ==> 0XF8000008[15:0] = 0x0000DF0DU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000DF0DU + // .. + EMIT_MASKWRITE(0XF8000008, 0x0000FFFFU ,0x0000DF0DU), + // .. FINISH: SLCR SETTINGS + // .. START: ENABLING LEVEL SHIFTER + // .. USER_LVL_INP_EN_0 = 1 + // .. ==> 0XF8000900[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. USER_LVL_OUT_EN_0 = 1 + // .. ==> 0XF8000900[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. USER_LVL_INP_EN_1 = 1 + // .. ==> 0XF8000900[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. USER_LVL_OUT_EN_1 = 1 + // .. ==> 0XF8000900[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XF8000900, 0x0000000FU ,0x0000000FU), + // .. FINISH: ENABLING LEVEL SHIFTER + // .. START: FPGA RESETS TO 1 + // .. reserved_3 = 127 + // .. ==> 0XF8000240[31:25] = 0x0000007FU + // .. ==> MASK : 0xFE000000U VAL : 0xFE000000U + // .. reserved_FPGA_ACP_RST = 1 + // .. ==> 0XF8000240[24:24] = 0x00000001U + // .. ==> MASK : 0x01000000U VAL : 0x01000000U + // .. reserved_FPGA_AXDS3_RST = 1 + // .. ==> 0XF8000240[23:23] = 0x00000001U + // .. ==> MASK : 0x00800000U VAL : 0x00800000U + // .. reserved_FPGA_AXDS2_RST = 1 + // .. ==> 0XF8000240[22:22] = 0x00000001U + // .. ==> MASK : 0x00400000U VAL : 0x00400000U + // .. reserved_FPGA_AXDS1_RST = 1 + // .. ==> 0XF8000240[21:21] = 0x00000001U + // .. ==> MASK : 0x00200000U VAL : 0x00200000U + // .. reserved_FPGA_AXDS0_RST = 1 + // .. ==> 0XF8000240[20:20] = 0x00000001U + // .. ==> MASK : 0x00100000U VAL : 0x00100000U + // .. reserved_2 = 3 + // .. ==> 0XF8000240[19:18] = 0x00000003U + // .. ==> MASK : 0x000C0000U VAL : 0x000C0000U + // .. reserved_FSSW1_FPGA_RST = 1 + // .. ==> 0XF8000240[17:17] = 0x00000001U + // .. ==> MASK : 0x00020000U VAL : 0x00020000U + // .. reserved_FSSW0_FPGA_RST = 1 + // .. ==> 0XF8000240[16:16] = 0x00000001U + // .. ==> MASK : 0x00010000U VAL : 0x00010000U + // .. reserved_1 = 15 + // .. ==> 0XF8000240[15:14] = 0x0000000FU + // .. ==> MASK : 0x0000C000U VAL : 0x0000C000U + // .. reserved_FPGA_FMSW1_RST = 1 + // .. ==> 0XF8000240[13:13] = 0x00000001U + // .. ==> MASK : 0x00002000U VAL : 0x00002000U + // .. reserved_FPGA_FMSW0_RST = 1 + // .. ==> 0XF8000240[12:12] = 0x00000001U + // .. ==> MASK : 0x00001000U VAL : 0x00001000U + // .. reserved_FPGA_DMA3_RST = 1 + // .. ==> 0XF8000240[11:11] = 0x00000001U + // .. ==> MASK : 0x00000800U VAL : 0x00000800U + // .. reserved_FPGA_DMA2_RST = 1 + // .. ==> 0XF8000240[10:10] = 0x00000001U + // .. ==> MASK : 0x00000400U VAL : 0x00000400U + // .. reserved_FPGA_DMA1_RST = 1 + // .. ==> 0XF8000240[9:9] = 0x00000001U + // .. ==> MASK : 0x00000200U VAL : 0x00000200U + // .. reserved_FPGA_DMA0_RST = 1 + // .. ==> 0XF8000240[8:8] = 0x00000001U + // .. ==> MASK : 0x00000100U VAL : 0x00000100U + // .. reserved = 15 + // .. ==> 0XF8000240[7:4] = 0x0000000FU + // .. ==> MASK : 0x000000F0U VAL : 0x000000F0U + // .. FPGA3_OUT_RST = 1 + // .. ==> 0XF8000240[3:3] = 0x00000001U + // .. ==> MASK : 0x00000008U VAL : 0x00000008U + // .. FPGA2_OUT_RST = 1 + // .. ==> 0XF8000240[2:2] = 0x00000001U + // .. ==> MASK : 0x00000004U VAL : 0x00000004U + // .. FPGA1_OUT_RST = 1 + // .. ==> 0XF8000240[1:1] = 0x00000001U + // .. ==> MASK : 0x00000002U VAL : 0x00000002U + // .. FPGA0_OUT_RST = 1 + // .. ==> 0XF8000240[0:0] = 0x00000001U + // .. ==> MASK : 0x00000001U VAL : 0x00000001U + // .. + EMIT_MASKWRITE(0XF8000240, 0xFFFFFFFFU ,0xFFFFFFFFU), + // .. FINISH: FPGA RESETS TO 1 + // .. START: FPGA RESETS TO 0 + // .. reserved_3 = 0 + // .. ==> 0XF8000240[31:25] = 0x00000000U + // .. ==> MASK : 0xFE000000U VAL : 0x00000000U + // .. reserved_FPGA_ACP_RST = 0 + // .. ==> 0XF8000240[24:24] = 0x00000000U + // .. ==> MASK : 0x01000000U VAL : 0x00000000U + // .. reserved_FPGA_AXDS3_RST = 0 + // .. ==> 0XF8000240[23:23] = 0x00000000U + // .. ==> MASK : 0x00800000U VAL : 0x00000000U + // .. reserved_FPGA_AXDS2_RST = 0 + // .. ==> 0XF8000240[22:22] = 0x00000000U + // .. ==> MASK : 0x00400000U VAL : 0x00000000U + // .. reserved_FPGA_AXDS1_RST = 0 + // .. ==> 0XF8000240[21:21] = 0x00000000U + // .. ==> MASK : 0x00200000U VAL : 0x00000000U + // .. reserved_FPGA_AXDS0_RST = 0 + // .. ==> 0XF8000240[20:20] = 0x00000000U + // .. ==> MASK : 0x00100000U VAL : 0x00000000U + // .. reserved_2 = 0 + // .. ==> 0XF8000240[19:18] = 0x00000000U + // .. ==> MASK : 0x000C0000U VAL : 0x00000000U + // .. reserved_FSSW1_FPGA_RST = 0 + // .. ==> 0XF8000240[17:17] = 0x00000000U + // .. ==> MASK : 0x00020000U VAL : 0x00000000U + // .. reserved_FSSW0_FPGA_RST = 0 + // .. ==> 0XF8000240[16:16] = 0x00000000U + // .. ==> MASK : 0x00010000U VAL : 0x00000000U + // .. reserved_1 = 0 + // .. ==> 0XF8000240[15:14] = 0x00000000U + // .. ==> MASK : 0x0000C000U VAL : 0x00000000U + // .. reserved_FPGA_FMSW1_RST = 0 + // .. ==> 0XF8000240[13:13] = 0x00000000U + // .. ==> MASK : 0x00002000U VAL : 0x00000000U + // .. reserved_FPGA_FMSW0_RST = 0 + // .. ==> 0XF8000240[12:12] = 0x00000000U + // .. ==> MASK : 0x00001000U VAL : 0x00000000U + // .. reserved_FPGA_DMA3_RST = 0 + // .. ==> 0XF8000240[11:11] = 0x00000000U + // .. ==> MASK : 0x00000800U VAL : 0x00000000U + // .. reserved_FPGA_DMA2_RST = 0 + // .. ==> 0XF8000240[10:10] = 0x00000000U + // .. ==> MASK : 0x00000400U VAL : 0x00000000U + // .. reserved_FPGA_DMA1_RST = 0 + // .. ==> 0XF8000240[9:9] = 0x00000000U + // .. ==> MASK : 0x00000200U VAL : 0x00000000U + // .. reserved_FPGA_DMA0_RST = 0 + // .. ==> 0XF8000240[8:8] = 0x00000000U + // .. ==> MASK : 0x00000100U VAL : 0x00000000U + // .. reserved = 0 + // .. ==> 0XF8000240[7:4] = 0x00000000U + // .. ==> MASK : 0x000000F0U VAL : 0x00000000U + // .. FPGA3_OUT_RST = 0 + // .. ==> 0XF8000240[3:3] = 0x00000000U + // .. ==> MASK : 0x00000008U VAL : 0x00000000U + // .. FPGA2_OUT_RST = 0 + // .. ==> 0XF8000240[2:2] = 0x00000000U + // .. ==> MASK : 0x00000004U VAL : 0x00000000U + // .. FPGA1_OUT_RST = 0 + // .. ==> 0XF8000240[1:1] = 0x00000000U + // .. ==> MASK : 0x00000002U VAL : 0x00000000U + // .. FPGA0_OUT_RST = 0 + // .. ==> 0XF8000240[0:0] = 0x00000000U + // .. ==> MASK : 0x00000001U VAL : 0x00000000U + // .. + EMIT_MASKWRITE(0XF8000240, 0xFFFFFFFFU ,0x00000000U), + // .. FINISH: FPGA RESETS TO 0 + // .. START: AFI REGISTERS + // .. .. START: AFI0 REGISTERS + // .. .. FINISH: AFI0 REGISTERS + // .. .. START: AFI1 REGISTERS + // .. .. FINISH: AFI1 REGISTERS + // .. .. START: AFI2 REGISTERS + // .. .. FINISH: AFI2 REGISTERS + // .. .. START: AFI3 REGISTERS + // .. .. FINISH: AFI3 REGISTERS + // .. FINISH: AFI REGISTERS + // .. START: LOCK IT BACK + // .. LOCK_KEY = 0X767B + // .. ==> 0XF8000004[15:0] = 0x0000767BU + // .. ==> MASK : 0x0000FFFFU VAL : 0x0000767BU + // .. + EMIT_MASKWRITE(0XF8000004, 0x0000FFFFU ,0x0000767BU), + // .. FINISH: LOCK IT BACK + // FINISH: top + // + EMIT_EXIT(), + + // +}; + + +#include "xil_io.h" +#define PS7_MASK_POLL_TIME 100000000 + +char* +getPS7MessageInfo(unsigned key) { + + char* err_msg = ""; + switch (key) { + case PS7_INIT_SUCCESS: err_msg = "PS7 initialization successful"; break; + case PS7_INIT_CORRUPT: err_msg = "PS7 init Data Corrupted"; break; + case PS7_INIT_TIMEOUT: err_msg = "PS7 init mask poll timeout"; break; + case PS7_POLL_FAILED_DDR_INIT: err_msg = "Mask Poll failed for DDR Init"; break; + case PS7_POLL_FAILED_DMA: err_msg = "Mask Poll failed for PLL Init"; break; + case PS7_POLL_FAILED_PLL: err_msg = "Mask Poll failed for DMA done bit"; break; + default: err_msg = "Undefined error status"; break; + } + + return err_msg; +} + +unsigned long +ps7GetSiliconVersion () { + // Read PS version from MCTRL register [31:28] + unsigned long mask = 0xF0000000; + unsigned long *addr = (unsigned long*) 0XF8007080; + unsigned long ps_version = (*addr & mask) >> 28; + return ps_version; +} + +void mask_write (unsigned long add , unsigned long mask, unsigned long val ) { + unsigned long *addr = (unsigned long*) add; + *addr = ( val & mask ) | ( *addr & ~mask); + //xil_printf("MaskWrite : 0x%x--> 0x%x \n \r" ,add, *addr); +} + + +int mask_poll(unsigned long add , unsigned long mask ) { + unsigned long *addr = (unsigned long*) add; + int i = 0; + while (!(*addr & mask)) { + if (i == PS7_MASK_POLL_TIME) { + return -1; + } + i++; + } + return 1; + //xil_printf("MaskPoll : 0x%x --> 0x%x \n \r" , add, *addr); +} + +unsigned long mask_read(unsigned long add , unsigned long mask ) { + unsigned long *addr = (unsigned long*) add; + unsigned long val = (*addr & mask); + //xil_printf("MaskRead : 0x%x --> 0x%x \n \r" , add, val); + return val; +} + + + +int +ps7_config(unsigned long * ps7_config_init) +{ + unsigned long *ptr = ps7_config_init; + + unsigned long opcode; // current instruction .. + unsigned long args[16]; // no opcode has so many args ... + int numargs; // number of arguments of this instruction + int j; // general purpose index + + volatile unsigned long *addr; // some variable to make code readable + unsigned long val,mask; // some variable to make code readable + + int finish = -1 ; // loop while this is negative ! + int i = 0; // Timeout variable + + while( finish < 0 ) { + numargs = ptr[0] & 0xF; + opcode = ptr[0] >> 4; + + for( j = 0 ; j < numargs ; j ++ ) + args[j] = ptr[j+1]; + ptr += numargs + 1; + + + switch ( opcode ) { + + case OPCODE_EXIT: + finish = PS7_INIT_SUCCESS; + break; + + case OPCODE_CLEAR: + addr = (unsigned long*) args[0]; + *addr = 0; + break; + + case OPCODE_WRITE: + addr = (unsigned long*) args[0]; + val = args[1]; + *addr = val; + break; + + case OPCODE_MASKWRITE: + addr = (unsigned long*) args[0]; + mask = args[1]; + val = args[2]; + *addr = ( val & mask ) | ( *addr & ~mask); + break; + + case OPCODE_MASKPOLL: + addr = (unsigned long*) args[0]; + mask = args[1]; + i = 0; + while (!(*addr & mask)) { + if (i == PS7_MASK_POLL_TIME) { + finish = PS7_INIT_TIMEOUT; + break; + } + i++; + } + break; + default: + finish = PS7_INIT_CORRUPT; + break; + } + } + return finish; +} + +unsigned long *ps7_mio_init_data = ps7_mio_init_data_3_0; +unsigned long *ps7_pll_init_data = ps7_pll_init_data_3_0; +unsigned long *ps7_clock_init_data = ps7_clock_init_data_3_0; +unsigned long *ps7_ddr_init_data = ps7_ddr_init_data_3_0; +unsigned long *ps7_peripherals_init_data = ps7_peripherals_init_data_3_0; + +int +ps7_post_config() +{ + // Get the PS_VERSION on run time + unsigned long si_ver = ps7GetSiliconVersion (); + int ret = -1; + if (si_ver == PCW_SILICON_VERSION_1) { + ret = ps7_config (ps7_post_config_1_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else if (si_ver == PCW_SILICON_VERSION_2) { + ret = ps7_config (ps7_post_config_2_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } else { + ret = ps7_config (ps7_post_config_3_0); + if (ret != PS7_INIT_SUCCESS) return ret; + } + return PS7_INIT_SUCCESS; +} + +int +ps7_init() +{ + // Get the PS_VERSION on run time + unsigned long si_ver = ps7GetSiliconVersion (); + //int pcw_ver = 0; + + if (si_ver == PCW_SILICON_VERSION_1) { + ps7_mio_init_data = ps7_mio_init_data_1_0; + ps7_pll_init_data = ps7_pll_init_data_1_0; + ps7_clock_init_data = ps7_clock_init_data_1_0; + ps7_ddr_init_data = ps7_ddr_init_data_1_0; + ps7_peripherals_init_data = ps7_peripherals_init_data_1_0; + //pcw_ver = 1; + + } else if (si_ver == PCW_SILICON_VERSION_2) { + ps7_mio_init_data = ps7_mio_init_data_2_0; + ps7_pll_init_data = ps7_pll_init_data_2_0; + ps7_clock_init_data = ps7_clock_init_data_2_0; + ps7_ddr_init_data = ps7_ddr_init_data_2_0; + ps7_peripherals_init_data = ps7_peripherals_init_data_2_0; + //pcw_ver = 2; + + } else { + ps7_mio_init_data = ps7_mio_init_data_3_0; + ps7_pll_init_data = ps7_pll_init_data_3_0; + ps7_clock_init_data = ps7_clock_init_data_3_0; + ps7_ddr_init_data = ps7_ddr_init_data_3_0; + ps7_peripherals_init_data = ps7_peripherals_init_data_3_0; + //pcw_ver = 3; + } + + // MIO init + int ret = ps7_config (ps7_mio_init_data); + if (ret != PS7_INIT_SUCCESS) return ret; + + // PLL init + ret = ps7_config (ps7_pll_init_data); + if (ret != PS7_INIT_SUCCESS) return ret; + + // Clock init + ret = ps7_config (ps7_clock_init_data); + if (ret != PS7_INIT_SUCCESS) return ret; + + // DDR init + ret = ps7_config (ps7_ddr_init_data); + if (ret != PS7_INIT_SUCCESS) return ret; + + + // Peripherals init + ret = ps7_config (ps7_peripherals_init_data); + if (ret != PS7_INIT_SUCCESS) return ret; + //xil_printf ("\n PCW Silicon Version : %d.0", pcw_ver); + return PS7_INIT_SUCCESS; +} + diff --git a/quad/zybo_fsbl/src/ps7_init.h b/quad/zybo_fsbl/src/ps7_init.h new file mode 100644 index 000000000..d63682e6a --- /dev/null +++ b/quad/zybo_fsbl/src/ps7_init.h @@ -0,0 +1,139 @@ + +/****************************************************************************** +* +* (c) Copyright 2010-2012 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file ps7_init.h +* +* This file can be included in FSBL code +* to get prototype of ps7_init() function +* and error codes +* +*****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + + +//typedef unsigned int u32; + + +/** do we need to make this name more unique ? **/ +//extern u32 ps7_init_data[]; +extern unsigned long * ps7_ddr_init_data; +extern unsigned long * ps7_mio_init_data; +extern unsigned long * ps7_pll_init_data; +extern unsigned long * ps7_clock_init_data; +extern unsigned long * ps7_peripherals_init_data; + + + +#define OPCODE_EXIT 0U +#define OPCODE_CLEAR 1U +#define OPCODE_WRITE 2U +#define OPCODE_MASKWRITE 3U +#define OPCODE_MASKPOLL 4U +#define NEW_PS7_ERR_CODE 1 + + +/* Encode number of arguments in last nibble */ +#define EMIT_EXIT() ( (OPCODE_EXIT << 4 ) | 0 ) +#define EMIT_CLEAR(addr) ( (OPCODE_CLEAR << 4 ) | 1 ) , addr +#define EMIT_WRITE(addr,val) ( (OPCODE_WRITE << 4 ) | 2 ) , addr, val +#define EMIT_MASKWRITE(addr,mask,val) ( (OPCODE_MASKWRITE << 4 ) | 3 ) , addr, mask, val +#define EMIT_MASKPOLL(addr,mask) ( (OPCODE_MASKPOLL << 4 ) | 2 ) , addr, mask + + + +/* Returns codes of PS7_Init */ +#define PS7_INIT_SUCCESS (0) // 0 is success in good old C +#define PS7_INIT_CORRUPT (1) // 1 the data is corrupted, and slcr reg are in corrupted state now +#define PS7_INIT_TIMEOUT (2) // 2 when a poll operation timed out +#define PS7_POLL_FAILED_DDR_INIT (3) // 3 when a poll operation timed out for ddr init +#define PS7_POLL_FAILED_DMA (4) // 4 when a poll operation timed out for dma done bit +#define PS7_POLL_FAILED_PLL (5) // 5 when a poll operation timed out for pll sequence init + + +/* Silicon Versions */ +#define PCW_SILICON_VERSION_1 0 +#define PCW_SILICON_VERSION_2 1 +#define PCW_SILICON_VERSION_3 2 + +/* This flag to be used by FSBL to check whether ps7_post_config() proc exixts */ +#define PS7_POST_CONFIG + +/* Freq of all peripherals */ + +#define APU_FREQ 650000000 +#define DDR_FREQ 525000000 +#define DCI_FREQ 10159000 +#define QSPI_FREQ 200000000 +#define SMC_FREQ 100000000 +#define ENET0_FREQ 125000000 +#define ENET1_FREQ 125000000 +#define USB0_FREQ 60000000 +#define USB1_FREQ 60000000 +#define SDIO_FREQ 50000000 +#define UART_FREQ 50000000 +#define SPI_FREQ 166666666 +#define I2C_FREQ 108333336 +#define WDT_FREQ 133333333 +#define TTC_FREQ 50000000 +#define CAN_FREQ 100000000 +#define PCAP_FREQ 200000000 +#define TPIU_FREQ 0 +#define FPGA0_FREQ 100000000 +#define FPGA1_FREQ 175000000 +#define FPGA2_FREQ 12288000 +#define FPGA3_FREQ 100000000 +#define C_CPU_REF_CLK_FREQ_HZ 50000000 + + +int ps7_config( unsigned long*); +int ps7_init(); +int ps7_post_config(); +char* getPS7MessageInfo(unsigned key); + +#ifdef __cplusplus +} +#endif diff --git a/quad/zybo_fsbl/src/qspi.c b/quad/zybo_fsbl/src/qspi.c new file mode 100644 index 000000000..6e1c15f71 --- /dev/null +++ b/quad/zybo_fsbl/src/qspi.c @@ -0,0 +1,724 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file qspi.c +* +* Contains code for the QSPI FLASH functionality. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 01/10/10 Initial release +* 3.00a mb 25/06/12 InitQspi, data is read first and required config bits +* are set +* 4.00a sg 02/28/13 Cleanup +* Removed LPBK_DLY_ADJ register setting code as we use +* divisor 8 +* 5.00a sgd 05/17/13 Added Flash Size > 128Mbit support +* Dual Stack support +* Fix for CR:721674 - FSBL- Failed to boot from Dual +* stacked QSPI +* 6.00a kc 08/30/13 Fix for CR#722979 - Provide customer-friendly +* changelogs in FSBL +* Fix for CR#739711 - FSBL not able to read Large QSPI +* (512M) in IO Mode +* </pre> +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "qspi.h" +#include "image_mover.h" + +#ifdef XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR +#include "xqspips_hw.h" +#include "xqspips.h" + +/************************** Constant Definitions *****************************/ + +/* + * The following constants map to the XPAR parameters created in the + * xparameters.h file. They are defined here such that a user can easily + * change all the needed parameters in one place. + */ +#define QSPI_DEVICE_ID XPAR_XQSPIPS_0_DEVICE_ID + +/* + * The following constants define the commands which may be sent to the FLASH + * device. + */ +#define QUAD_READ_CMD 0x6B +#define READ_ID_CMD 0x9F + +#define WRITE_ENABLE_CMD 0x06 +#define BANK_REG_RD 0x16 +#define BANK_REG_WR 0x17 +/* Bank register is called Extended Address Reg in Micron */ +#define EXTADD_REG_RD 0xC8 +#define EXTADD_REG_WR 0xC5 + +#define COMMAND_OFFSET 0 /* FLASH instruction */ +#define ADDRESS_1_OFFSET 1 /* MSB byte of address to read or write */ +#define ADDRESS_2_OFFSET 2 /* Middle byte of address to read or write */ +#define ADDRESS_3_OFFSET 3 /* LSB byte of address to read or write */ +#define DATA_OFFSET 4 /* Start of Data for Read/Write */ +#define DUMMY_OFFSET 4 /* Dummy byte offset for fast, dual and quad + reads */ +#define DUMMY_SIZE 1 /* Number of dummy bytes for fast, dual and + quad reads */ +#define RD_ID_SIZE 4 /* Read ID command + 3 bytes ID response */ +#define BANK_SEL_SIZE 2 /* BRWR or EARWR command + 1 byte bank value */ +#define WRITE_ENABLE_CMD_SIZE 1 /* WE command */ +/* + * The following constants specify the extra bytes which are sent to the + * FLASH on the QSPI interface, that are not data, but control information + * which includes the command and address + */ +#define OVERHEAD_SIZE 4 + +/* + * The following constants specify the max amount of data and the size of the + * the buffer required to hold the data and overhead to transfer the data to + * and from the FLASH. + */ +#define DATA_SIZE 4096 + +/* + * The following defines are for dual flash interface. + */ +#define LQSPI_CR_FAST_QUAD_READ 0x0000006B /* Fast Quad Read output */ +#define LQSPI_CR_1_DUMMY_BYTE 0x00000100 /* 1 Dummy Byte between + address and return data */ + +#define SINGLE_QSPI_CONFIG_QUAD_READ (XQSPIPS_LQSPI_CR_LINEAR_MASK | \ + LQSPI_CR_1_DUMMY_BYTE | \ + LQSPI_CR_FAST_QUAD_READ) + +#define DUAL_QSPI_CONFIG_QUAD_READ (XQSPIPS_LQSPI_CR_LINEAR_MASK | \ + XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \ + XQSPIPS_LQSPI_CR_SEP_BUS_MASK | \ + LQSPI_CR_1_DUMMY_BYTE | \ + LQSPI_CR_FAST_QUAD_READ) + +#define DUAL_STACK_CONFIG_READ (XQSPIPS_LQSPI_CR_TWO_MEM_MASK | \ + LQSPI_CR_1_DUMMY_BYTE | \ + LQSPI_CR_FAST_QUAD_READ) + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +XQspiPs QspiInstance; +XQspiPs *QspiInstancePtr; +u32 QspiFlashSize; +u32 QspiFlashMake; +extern u32 FlashReadBaseAddress; +extern u8 LinearBootDeviceFlag; + +/* + * The following variables are used to read and write to the eeprom and they + * are global to avoid having large buffers on the stack + */ +u8 ReadBuffer[DATA_SIZE + DATA_OFFSET + DUMMY_SIZE]; +u8 WriteBuffer[DATA_OFFSET + DUMMY_SIZE]; + +/******************************************************************************/ +/** +* +* This function initializes the controller for the QSPI interface. +* +* @param None +* +* @return None +* +* @note None +* +****************************************************************************/ +u32 InitQspi(void) +{ + XQspiPs_Config *QspiConfig; + int Status; + + QspiInstancePtr = &QspiInstance; + + /* + * Set up the base address for access + */ + FlashReadBaseAddress = XPS_QSPI_LINEAR_BASEADDR; + + /* + * Initialize the QSPI driver so that it's ready to use + */ + QspiConfig = XQspiPs_LookupConfig(QSPI_DEVICE_ID); + if (NULL == QspiConfig) { + return XST_FAILURE; + } + + Status = XQspiPs_CfgInitialize(QspiInstancePtr, QspiConfig, + QspiConfig->BaseAddress); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + + /* + * Set Manual Chip select options and drive HOLD_B pin high. + */ + XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_FORCE_SSELECT_OPTION | + XQSPIPS_HOLD_B_DRIVE_OPTION); + + /* + * Set the prescaler for QSPI clock + */ + XQspiPs_SetClkPrescaler(QspiInstancePtr, XQSPIPS_CLK_PRESCALE_8); + + /* + * Assert the FLASH chip select. + */ + XQspiPs_SetSlaveSelect(QspiInstancePtr); + + /* + * Read Flash ID and extract Manufacture and Size information + */ + Status = FlashReadID(); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + + if (XPAR_PS7_QSPI_0_QSPI_MODE == SINGLE_FLASH_CONNECTION) { + + fsbl_printf(DEBUG_INFO,"QSPI is in single flash connection\r\n"); + /* + * For Flash size <128Mbit controller configured in linear mode + */ + if (QspiFlashSize <= FLASH_SIZE_16MB) { + LinearBootDeviceFlag = 1; + + /* + * Enable linear mode + */ + XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_LQSPI_MODE_OPTION | + XQSPIPS_HOLD_B_DRIVE_OPTION); + + /* + * Single linear read + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, SINGLE_QSPI_CONFIG_QUAD_READ); + + /* + * Enable the controller + */ + XQspiPs_Enable(QspiInstancePtr); + } + } + + if (XPAR_PS7_QSPI_0_QSPI_MODE == DUAL_PARALLEL_CONNECTION) { + + fsbl_printf(DEBUG_INFO,"QSPI is in Dual Parallel connection\r\n"); + /* + * For Single Flash size <128Mbit controller configured in linear mode + */ + if (QspiFlashSize <= FLASH_SIZE_16MB) { + /* + * Setting linear access flag + */ + LinearBootDeviceFlag = 1; + + /* + * Enable linear mode + */ + XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_LQSPI_MODE_OPTION | + XQSPIPS_HOLD_B_DRIVE_OPTION); + + /* + * Dual linear read + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, DUAL_QSPI_CONFIG_QUAD_READ); + + /* + * Enable the controller + */ + XQspiPs_Enable(QspiInstancePtr); + } + + /* + * Total flash size is two time of single flash size + */ + QspiFlashSize = 2 * QspiFlashSize; + } + + /* + * It is expected to same flash size for both chip selection + */ + if (XPAR_PS7_QSPI_0_QSPI_MODE == DUAL_STACK_CONNECTION) { + + fsbl_printf(DEBUG_INFO,"QSPI is in Dual Stack connection\r\n"); + + QspiFlashSize = 2 * QspiFlashSize; + + /* + * Enable two flash memories on separate buses + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, DUAL_STACK_CONFIG_READ); + } + + return XST_SUCCESS; +} + +/****************************************************************************** +* +* This function reads serial FLASH ID connected to the SPI interface. +* It then deduces the make and size of the flash and obtains the +* connection mode to point to corresponding parameters in the flash +* configuration table. The flash driver will function based on this and +* it presently supports Micron and Spansion - 128, 256 and 512Mbit and +* Winbond 128Mbit +* +* @param none +* +* @return XST_SUCCESS if read id, otherwise XST_FAILURE. +* +* @note None. +* +******************************************************************************/ +u32 FlashReadID(void) +{ + u32 Status; + + /* + * Read ID in Auto mode. + */ + WriteBuffer[COMMAND_OFFSET] = READ_ID_CMD; + WriteBuffer[ADDRESS_1_OFFSET] = 0x00; /* 3 dummy bytes */ + WriteBuffer[ADDRESS_2_OFFSET] = 0x00; + WriteBuffer[ADDRESS_3_OFFSET] = 0x00; + + Status = XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, + RD_ID_SIZE); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + + fsbl_printf(DEBUG_INFO,"Single Flash Information\r\n"); + + fsbl_printf(DEBUG_INFO,"FlashID=0x%x 0x%x 0x%x\r\n", ReadBuffer[1], + ReadBuffer[2], + ReadBuffer[3]); + + /* + * Deduce flash make + */ + if (ReadBuffer[1] == MICRON_ID) { + QspiFlashMake = MICRON_ID; + fsbl_printf(DEBUG_INFO, "MICRON "); + } else if(ReadBuffer[1] == SPANSION_ID) { + QspiFlashMake = SPANSION_ID; + fsbl_printf(DEBUG_INFO, "SPANSION "); + } else if(ReadBuffer[1] == WINBOND_ID) { + QspiFlashMake = WINBOND_ID; + fsbl_printf(DEBUG_INFO, "WINBOND "); + } + + /* + * Deduce flash Size + */ + if (ReadBuffer[3] == FLASH_SIZE_ID_128M) { + QspiFlashSize = FLASH_SIZE_128M; + fsbl_printf(DEBUG_INFO, "128M Bits\r\n"); + } else if (ReadBuffer[3] == FLASH_SIZE_ID_256M) { + QspiFlashSize = FLASH_SIZE_256M; + fsbl_printf(DEBUG_INFO, "256M Bits\r\n"); + } else if (ReadBuffer[3] == FLASH_SIZE_ID_512M) { + QspiFlashSize = FLASH_SIZE_512M; + fsbl_printf(DEBUG_INFO, "512M Bits\r\n"); + } else if (ReadBuffer[3] == FLASH_SIZE_ID_1G) { + QspiFlashSize = FLASH_SIZE_1G; + fsbl_printf(DEBUG_INFO, "1G Bits\r\n"); + } + + return XST_SUCCESS; +} + + +/****************************************************************************** +* +* This function reads from the serial FLASH connected to the +* QSPI interface. +* +* @param Address contains the address to read data from in the FLASH. +* @param ByteCount contains the number of bytes to read. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void FlashRead(u32 Address, u32 ByteCount) +{ + /* + * Setup the write command with the specified address and data for the + * FLASH + */ + WriteBuffer[COMMAND_OFFSET] = QUAD_READ_CMD; + WriteBuffer[ADDRESS_1_OFFSET] = (u8)((Address & 0xFF0000) >> 16); + WriteBuffer[ADDRESS_2_OFFSET] = (u8)((Address & 0xFF00) >> 8); + WriteBuffer[ADDRESS_3_OFFSET] = (u8)(Address & 0xFF); + + ByteCount += DUMMY_SIZE; + + /* + * Send the read command to the FLASH to read the specified number + * of bytes from the FLASH, send the read command and address and + * receive the specified number of bytes of data in the data buffer + */ + XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, + ByteCount + OVERHEAD_SIZE); +} + +/******************************************************************************/ +/** +* +* This function provides the QSPI FLASH interface for the Simplified header +* functionality. +* +* @param SourceAddress is address in FLASH data space +* @param DestinationAddress is address in DDR data space +* @param LengthBytes is the length of the data in Bytes +* +* @return +* - XST_SUCCESS if the write completes correctly +* - XST_FAILURE if the write fails to completes correctly +* +* @note none. +* +****************************************************************************/ +u32 QspiAccess( u32 SourceAddress, u32 DestinationAddress, u32 LengthBytes) +{ + u8 *BufferPtr; + u32 Length = 0; + u32 BankSel = 0; + u32 LqspiCrReg; + u32 Status; + u8 BankSwitchFlag = 1; + + /* + * Linear access check + */ + if (LinearBootDeviceFlag == 1) { + /* + * Check for non-word tail, add bytes to cover the end + */ + if ((LengthBytes%4) != 0){ + LengthBytes += (4 - (LengthBytes & 0x00000003)); + } + + memcpy((void*)DestinationAddress, + (const void*)(SourceAddress + FlashReadBaseAddress), + (size_t)LengthBytes); + } else { + /* + * Non Linear access + */ + BufferPtr = (u8*)DestinationAddress; + + /* + * Dual parallel connection actual flash is half + */ + if (XPAR_PS7_QSPI_0_QSPI_MODE == DUAL_PARALLEL_CONNECTION) { + SourceAddress = SourceAddress/2; + } + + while(LengthBytes > 0) { + /* + * Local of DATA_SIZE size used for read/write buffer + */ + if(LengthBytes > DATA_SIZE) { + Length = DATA_SIZE; + } else { + Length = LengthBytes; + } + + /* + * Dual stack connection + */ + if (XPAR_PS7_QSPI_0_QSPI_MODE == DUAL_STACK_CONNECTION) { + /* + * Get the current LQSPI configuration value + */ + LqspiCrReg = XQspiPs_GetLqspiConfigReg(QspiInstancePtr); + + /* + * Select lower or upper Flash based on sector address + */ + if (SourceAddress >= (QspiFlashSize/2)) { + /* + * Set selection to U_PAGE + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, + LqspiCrReg | XQSPIPS_LQSPI_CR_U_PAGE_MASK); + + /* + * Subtract first flash size when accessing second flash + */ + SourceAddress = SourceAddress - (QspiFlashSize/2); + + fsbl_printf(DEBUG_INFO, "stacked - upper CS \n\r"); + + /* + * Assert the FLASH chip select. + */ + XQspiPs_SetSlaveSelect(QspiInstancePtr); + } + } + + /* + * Select bank + */ + if ((SourceAddress >= FLASH_SIZE_16MB) && (BankSwitchFlag == 1)) { + BankSel = SourceAddress/FLASH_SIZE_16MB; + + fsbl_printf(DEBUG_INFO, "Bank Selection %d\n\r", BankSel); + + Status = SendBankSelect(BankSel); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO, "Bank Selection Failed\n\r"); + return XST_FAILURE; + } + + BankSwitchFlag = 0; + } + + /* + * If data to be read spans beyond the current bank, then + * calculate length in current bank else no change in length + */ + if (XPAR_PS7_QSPI_0_QSPI_MODE == DUAL_PARALLEL_CONNECTION) { + /* + * In dual parallel mode, check should be for half + * the length. + */ + if((SourceAddress & BANKMASK) != ((SourceAddress + (Length/2)) & BANKMASK)) + { + Length = (SourceAddress & BANKMASK) + FLASH_SIZE_16MB - SourceAddress; + /* + * Above length calculated is for single flash + * Length should be doubled since dual parallel + */ + Length = Length * 2; + BankSwitchFlag = 1; + } + } else { + if((SourceAddress & BANKMASK) != ((SourceAddress + Length) & BANKMASK)) + { + Length = (SourceAddress & BANKMASK) + FLASH_SIZE_16MB - SourceAddress; + BankSwitchFlag = 1; + } + } + + /* + * Copying the image to local buffer + */ + FlashRead(SourceAddress, Length); + + /* + * Moving the data from local buffer to DDR destination address + */ + memcpy(BufferPtr, &ReadBuffer[DATA_OFFSET + DUMMY_SIZE], Length); + + /* + * Updated the variables + */ + LengthBytes -= Length; + + /* + * For Dual parallel connection address increment should be half + */ + if (XPAR_PS7_QSPI_0_QSPI_MODE == DUAL_PARALLEL_CONNECTION) { + SourceAddress += Length/2; + } else { + SourceAddress += Length; + } + + BufferPtr = (u8*)((u32)BufferPtr + Length); + } + + /* + * Reset Bank selection to zero + */ + Status = SendBankSelect(0); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO, "Bank Selection Reset Failed\n\r"); + return XST_FAILURE; + } + + if (XPAR_PS7_QSPI_0_QSPI_MODE == DUAL_STACK_CONNECTION) { + + /* + * Reset selection to L_PAGE + */ + XQspiPs_SetLqspiConfigReg(QspiInstancePtr, + LqspiCrReg & (~XQSPIPS_LQSPI_CR_U_PAGE_MASK)); + + fsbl_printf(DEBUG_INFO, "stacked - lower CS \n\r"); + + /* + * Assert the FLASH chip select. + */ + XQspiPs_SetSlaveSelect(QspiInstancePtr); + } + } + + return XST_SUCCESS; +} + + + +/****************************************************************************** +* +* This functions selects the current bank +* +* @param BankSel is the bank to be selected in the flash device(s). +* +* @return XST_SUCCESS if bank selected +* XST_FAILURE if selection failed +* @note None. +* +******************************************************************************/ +u32 SendBankSelect(u8 BankSel) +{ + u32 Status; + + /* + * bank select commands for Micron and Spansion are different + */ + if (QspiFlashMake == MICRON_ID) { + /* + * For micron command WREN should be sent first + * except for some specific feature set + */ + WriteBuffer[COMMAND_OFFSET] = WRITE_ENABLE_CMD; + Status = XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, + WRITE_ENABLE_CMD_SIZE); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + + /* + * Send the Extended address register write command + * written, no receive buffer required + */ + WriteBuffer[COMMAND_OFFSET] = EXTADD_REG_WR; + WriteBuffer[ADDRESS_1_OFFSET] = BankSel; + Status = XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, + BANK_SEL_SIZE); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + } + + if (QspiFlashMake == SPANSION_ID) { + WriteBuffer[COMMAND_OFFSET] = BANK_REG_WR; + WriteBuffer[ADDRESS_1_OFFSET] = BankSel; + + /* + * Send the Extended address register write command + * written, no receive buffer required + */ + Status = XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, NULL, + BANK_SEL_SIZE); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + } + + /* + * For testing - Read bank to verify + */ + if (QspiFlashMake == SPANSION_ID) { + WriteBuffer[COMMAND_OFFSET] = BANK_REG_RD; + WriteBuffer[ADDRESS_1_OFFSET] = 0x00; + + /* + * Send the Extended address register write command + * written, no receive buffer required + */ + Status = XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, + BANK_SEL_SIZE); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + } + + if (QspiFlashMake == MICRON_ID) { + WriteBuffer[COMMAND_OFFSET] = EXTADD_REG_RD; + WriteBuffer[ADDRESS_1_OFFSET] = 0x00; + + /* + * Send the Extended address register write command + * written, no receive buffer required + */ + Status = XQspiPs_PolledTransfer(QspiInstancePtr, WriteBuffer, ReadBuffer, + BANK_SEL_SIZE); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + } + + if (ReadBuffer[1] != BankSel) { + fsbl_printf(DEBUG_INFO, "BankSel %d != Register Read %d\n\r", BankSel, + ReadBuffer[1]); + return XST_FAILURE; + } + + return XST_SUCCESS; +} +#endif + diff --git a/quad/zybo_fsbl/src/qspi.h b/quad/zybo_fsbl/src/qspi.h new file mode 100644 index 000000000..9bac79c38 --- /dev/null +++ b/quad/zybo_fsbl/src/qspi.h @@ -0,0 +1,133 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file qspi.h +* +* This file contains the interface for the QSPI FLASH functionality +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a ecm 01/10/10 Initial release +* 3.00a mb 01/09/12 Added the Delay Values defines for qspi +* 5.00a sgd 05/17/13 Added Flash Size > 128Mbit support +* Dual Stack support +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef ___QSPI_H___ +#define ___QSPI_H___ + +#include "fsbl.h" +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "fsbl.h" + +/************************** Constant Definitions *****************************/ +#define SINGLE_FLASH_CONNECTION 0 +#define DUAL_STACK_CONNECTION 1 +#define DUAL_PARALLEL_CONNECTION 2 +#define FLASH_SIZE_16MB 0x1000000 + +/* + * Bank mask + */ +#define BANKMASK 0xF000000 + +/* + * Identification of Flash + * Micron: + * Byte 0 is Manufacturer ID; + * Byte 1 is first byte of Device ID - 0xBB or 0xBA + * Byte 2 is second byte of Device ID describes flash size: + * 128Mbit : 0x18; 256Mbit : 0x19; 512Mbit : 0x20 + * Spansion: + * Byte 0 is Manufacturer ID; + * Byte 1 is Device ID - Memory Interface type - 0x20 or 0x02 + * Byte 2 is second byte of Device ID describes flash size: + * 128Mbit : 0x18; 256Mbit : 0x19; 512Mbit : 0x20 + */ + +#define MICRON_ID 0x20 +#define SPANSION_ID 0x01 +#define WINBOND_ID 0xEF + +#define FLASH_SIZE_ID_128M 0x18 +#define FLASH_SIZE_ID_256M 0x19 +#define FLASH_SIZE_ID_512M 0x20 +#define FLASH_SIZE_ID_1G 0x21 + +/* + * Size in bytes + */ +#define FLASH_SIZE_128M 0x1000000 +#define FLASH_SIZE_256M 0x2000000 +#define FLASH_SIZE_512M 0x4000000 +#define FLASH_SIZE_1G 0x8000000 + +/************************** Function Prototypes ******************************/ +u32 InitQspi(void); + +u32 QspiAccess( u32 SourceAddress, + u32 DestinationAddress, + u32 LengthBytes); + +u32 FlashReadID(void); +u32 SendBankSelect(u8 BankSel); +/************************** Variable Definitions *****************************/ + + +#ifdef __cplusplus +} +#endif + + +#endif /* ___QSPI_H___ */ + diff --git a/quad/zybo_fsbl/src/rsa.c b/quad/zybo_fsbl/src/rsa.c new file mode 100644 index 000000000..1f43b6053 --- /dev/null +++ b/quad/zybo_fsbl/src/rsa.c @@ -0,0 +1,353 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file rsa.c +* +* Contains code for the RSA authentication +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 4.00a sgd 02/28/13 Initial release +* 6.00a kc 07/30/13 Added FSBL_DEBUG_RSA to print more RSA buffers +* Fix for CR#724165 - Partition Header used by FSBL is +* not authenticated +* Fix for CR#724166 - FSBL doesn’t use PPK authenticated +* by Boot ROM for authenticating +* the Partition images +* Fix for CR#722979 - Provide customer-friendly +* changelogs in FSBL +* </pre> +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "fsbl.h" +#include "rsa.h" + +#ifdef XPAR_XWDTPS_0_BASEADDR +#include "xwdtps.h" +#endif + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ +#ifdef XPAR_XWDTPS_0_BASEADDR +extern XWdtPs Watchdog; /* Instance of WatchDog Timer */ +#endif + + +/************************** Variable Definitions *****************************/ + +#ifdef RSA_SUPPORT +static u8 *PpkModular; +static u8 *PpkModularEx; +static u32 PpkExp; + + +extern u32 FsblLength; + +void FsblPrintArray (u8 *Buf, u32 Len, char *Str) +{ +#ifdef FSBL_DEBUG_RSA + int Index; + fsbl_printf(DEBUG_INFO, "%s START\r\n", Str); + for (Index=0;Index<Len;Index++) + { + fsbl_printf(DEBUG_INFO, "%02x",Buf[Index]); + if ((Index+1)%16 == 0){ + fsbl_printf(DEBUG_INFO, "\r\n"); + } + } + fsbl_printf(DEBUG_INFO, "\r\n %s END\r\n",Str); +#endif + return; +} + + +/*****************************************************************************/ +/** +* +* This function is used to set ppk pointer to ppk in OCM +* +* @param None +* +* @return +* +* @note None +* +******************************************************************************/ + +void SetPpk(void ) +{ + u32 PadSize; + u8 *PpkPtr; + + /* + * Set PpkPtr to PPK in OCM + */ + + /* + * Skip FSBL Length + */ + PpkPtr = (u8 *)(FsblLength); + /* + * Skip to 64 byte Boundary + */ + PadSize = ((u32)PpkPtr % 64); + if(PadSize != 0) + { + PpkPtr += (64 - PadSize); + } + + /* + * Increment the pointer by authentication Header size + */ + PpkPtr += RSA_HEADER_SIZE; + + /* + * Increment the pointer by Magic word size + */ + PpkPtr += RSA_MAGIC_WORD_SIZE; + + /* + * Set pointer to PPK + */ + PpkModular = (u8 *)PpkPtr; + PpkPtr += RSA_PPK_MODULAR_SIZE; + PpkModularEx = (u8 *)PpkPtr; + PpkPtr += RSA_PPK_MODULAR_EXT_SIZE; + PpkExp = *((u32 *)PpkPtr); + + return; +} + + +/*****************************************************************************/ +/** +* +* This function Authenticate Partition Signature +* +* @param Partition header pointer +* +* @return +* - XST_SUCCESS if Authentication passed +* - XST_FAILURE if Authentication failed +* +* @note None +* +******************************************************************************/ +u32 AuthenticatePartition(u8 *Buffer, u32 Size) +{ + u8 DecryptSignature[256]; + u8 HashSignature[32]; + u8 *SpkModular; + u8 *SpkModularEx; + u32 SpkExp; + u8 *SignaturePtr; + u32 Status; + +#ifdef XPAR_XWDTPS_0_BASEADDR + /* + * Prevent WDT reset + */ + XWdtPs_RestartWdt(&Watchdog); +#endif + + /* + * Point to Authentication Certificate + */ + SignaturePtr = (u8 *)(Buffer + Size - RSA_SIGNATURE_SIZE); + + /* + * Increment the pointer by authentication Header size + */ + SignaturePtr += RSA_HEADER_SIZE; + + /* + * Increment the pointer by Magic word size + */ + SignaturePtr += RSA_MAGIC_WORD_SIZE; + + /* + * Increment the pointer beyond the PPK + */ + SignaturePtr += RSA_PPK_MODULAR_SIZE; + SignaturePtr += RSA_PPK_MODULAR_EXT_SIZE; + SignaturePtr += RSA_PPK_EXPO_SIZE; + + /* + * Calculate Hash Signature + */ + sha_256((u8 *)SignaturePtr, (RSA_SPK_MODULAR_EXT_SIZE + + RSA_SPK_EXPO_SIZE + RSA_SPK_MODULAR_SIZE), + HashSignature); + FsblPrintArray(HashSignature, 32, "SPK Hash Calculated"); + + /* + * Extract SPK signature + */ + SpkModular = (u8 *)SignaturePtr; + SignaturePtr += RSA_SPK_MODULAR_SIZE; + SpkModularEx = (u8 *)SignaturePtr; + SignaturePtr += RSA_SPK_MODULAR_EXT_SIZE; + SpkExp = *((u32 *)SignaturePtr); + SignaturePtr += RSA_SPK_EXPO_SIZE; + + /* + * Decrypt SPK Signature + */ + rsa2048_pubexp((RSA_NUMBER)DecryptSignature, + (RSA_NUMBER)SignaturePtr, + (u32)PpkExp, + (RSA_NUMBER)PpkModular, + (RSA_NUMBER)PpkModularEx); + FsblPrintArray(DecryptSignature, RSA_SPK_SIGNATURE_SIZE, + "SPK Decrypted Hash"); + + + Status = RecreatePaddingAndCheck(DecryptSignature, HashSignature); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO, "Partition SPK Signature " + "Authentication failed\r\n"); + return XST_FAILURE; + } + SignaturePtr += RSA_SPK_SIGNATURE_SIZE; + + /* + * Decrypt Partition Signature + */ + rsa2048_pubexp((RSA_NUMBER)DecryptSignature, + (RSA_NUMBER)SignaturePtr, + (u32)SpkExp, + (RSA_NUMBER)SpkModular, + (RSA_NUMBER)SpkModularEx); + FsblPrintArray(DecryptSignature, RSA_PARTITION_SIGNATURE_SIZE, + "Partition Decrypted Hash"); + + /* + * Partition Authentication + * Calculate Hash Signature + */ + sha_256((u8 *)Buffer, + (Size - RSA_PARTITION_SIGNATURE_SIZE), + HashSignature); + FsblPrintArray(HashSignature, 32, + "Partition Hash Calculated"); + + Status = RecreatePaddingAndCheck(DecryptSignature, HashSignature); + if (Status != XST_SUCCESS) { + fsbl_printf(DEBUG_INFO, "Partition Signature " + "Authentication failed\r\n"); + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* +* This function recreates the and check signature +* +* @param Partition signature +* @param Partition hash value which includes boot header, partition data +* @return +* - XST_SUCCESS if check passed +* - XST_FAILURE if check failed +* +* @note None +* +******************************************************************************/ +u32 RecreatePaddingAndCheck(u8 *signature, u8 *hash) +{ + u8 T_padding[] = {0x30, 0x31, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20 }; + u8 * pad_ptr = signature + 256; + u32 pad = 256 - 3 - 19 - 32; + u32 ii; + + /* + * Re-Create PKCS#1v1.5 Padding + * MSB ----------------------------------------------------LSB + * 0x0 || 0x1 || 0xFF(for 202 bytes) || 0x0 || T_padding || SHA256 Hash + */ + if (*--pad_ptr != 0x00 || *--pad_ptr != 0x01) { + return XST_FAILURE; + } + + for (ii = 0; ii < pad; ii++) { + if (*--pad_ptr != 0xFF) { + return XST_FAILURE; + } + } + + if (*--pad_ptr != 0x00) { + return XST_FAILURE; + } + + for (ii = 0; ii < sizeof(T_padding); ii++) { + if (*--pad_ptr != T_padding[ii]) { + return XST_FAILURE; + } + } + + for (ii = 0; ii < 32; ii++) { + if (*--pad_ptr != hash[ii]) + return XST_FAILURE; + } + + return XST_SUCCESS; +} +#endif diff --git a/quad/zybo_fsbl/src/rsa.h b/quad/zybo_fsbl/src/rsa.h new file mode 100644 index 000000000..bb1c5f37a --- /dev/null +++ b/quad/zybo_fsbl/src/rsa.h @@ -0,0 +1,187 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file rsa.h +* +* This file contains the RSA algorithm functions +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 4.00a sg 02/28/13 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef ___RSA_H___ +#define ___RSA_H___ + +#ifdef __cplusplus +extern "C" { +#endif +/***************************** Include Files *********************************/ + +/* + * Digit size selection (32 or 16-bit). If supported by the CPU/compiler, + * 32-bit digits are approximately 4 times faster + */ + +//#define RSA_DIGIT_16 +#define RSA_DIGIT_32 + +/* + * RSA loop unrolling selection + * RSA main loop can be unrolled 2, 4 or 8 ways + */ +#define RSA_UNROLL 1 + +/* + * Select if ARM-optimized code is to be used. Only GCC for ARM is supported + */ +//#define RSA_ARM_OPTIMIZED + +/* + * Check the compatibility of the selection + */ +#if defined(RSA_DIGIT_16) && defined(RSA_DIGIT_32) + #error Please select a digit size +#endif +#if !defined(RSA_DIGIT_16) && !defined(RSA_DIGIT_32) + #error Please select just one digit size +#endif +#if (!defined(__GNUC__) || !defined(__arm__)) && defined(RSA_ARM_OPTIMIZED) + #error Assembly level code is only supported for the GCC/ARM combination +#endif +#if (RSA_UNROLL != 1) && (RSA_UNROLL != 2) && (RSA_UNROLL != 4) && (RSA_UNROLL != 8) + #error Only 1, 2, 4, and 8 unrolling are supported +#endif + +#ifdef RSA_DIGIT_16 +#define RSA_DIGIT unsigned short +#define RSA_SDIGIT short +#define RSA_DDIGIT unsigned long +#endif +#ifdef RSA_DIGIT_32 +#define RSA_DIGIT unsigned long +#define RSA_SDIGIT long +#define RSA_DDIGIT unsigned long long +#endif + +#define RSA_NUMBER RSA_DIGIT * +#define RSA_NBITS 2048 +#define RSA_NDIGITS (RSA_NBITS/(sizeof(RSA_DIGIT)*8)) +#define RSA_NBYTES (RSA_NDIGITS*sizeof(RSA_DIGIT)) + +/* + * Double-digit to single digit conversion + */ +#define RSA_MSB(x) (x >> (sizeof(RSA_DIGIT)*8)) +#define RSA_LSB(x) (x & (RSA_DIGIT)~0) + +#define SHA_BLKSIZE 512 +#define SHA_BLKBYTES (SHA_BLKSIZE/8) +#define SHA_BLKWORDS (SHA_BLKBYTES/4) + +#define SHA_VALSIZE 256 +#define SHA_VALBYTES (SHA_VALSIZE/8) +#define SHA_VALWORDS (SHA_VALBYTES/4) + +#define RSA_PPK_MODULAR_SIZE 256 +#define RSA_PPK_MODULAR_EXT_SIZE 256 +#define RSA_PPK_EXPO_SIZE 64 +#define RSA_SPK_MODULAR_SIZE 256 +#define RSA_SPK_MODULAR_EXT_SIZE 256 +#define RSA_SPK_EXPO_SIZE 64 +#define RSA_SPK_SIGNATURE_SIZE 256 +#define RSA_PARTITION_SIGNATURE_SIZE 256 +#define RSA_SIGNATURE_SIZE 0x6C0 /* Signature size in bytes */ +#define RSA_HEADER_SIZE 4 /* Signature header size in bytes */ +#define RSA_MAGIC_WORD_SIZE 60 /* Magic word size in bytes */ + +/* + * SHA-256 context structure + * Includes SHA-256 state, coalescing buffer to collect the processed strings, and + * total byte length counter (used both to manage the buffer and for padding) + */ +typedef struct +{ + unsigned int state[8]; + unsigned char buffer[SHA_BLKBYTES]; + unsigned long long bytes; +} sha2_context; + +/* + * RSA-2048 user interfaces + */ +void rsa2048_exp(const unsigned char *base, const unsigned char * modular, + const unsigned char *modular_ext, const unsigned char *exponent, + unsigned char *result); +void rsa2048_pubexp(RSA_NUMBER a, RSA_NUMBER x, + unsigned long e, RSA_NUMBER m, RSA_NUMBER rrm); + +/* + * SHA-256 user interfaces + */ +void sha_256(const unsigned char *in, const unsigned int size, unsigned char *out); +void sha2_starts(sha2_context *ctx); +void sha2_update(sha2_context *ctx, unsigned char* input, unsigned int ilen); +void sha2_finish(sha2_context *ctx, unsigned char* output); + +/* + * Preprocessing interface (pre-computation of R*R mod M) + */ +void modular_ext(const unsigned char *modular, unsigned char *res); + +void SetPpk(void ); +u32 AuthenticatePartition(u8 *Buffer, u32 Size); +u32 RecreatePaddingAndCheck(u8 *signature, u8 *hash); + +#ifdef __cplusplus +} +#endif + +#endif /* ___RSA_H___ */ diff --git a/quad/zybo_fsbl/src/sd.c b/quad/zybo_fsbl/src/sd.c new file mode 100644 index 000000000..b0e4b9ca3 --- /dev/null +++ b/quad/zybo_fsbl/src/sd.c @@ -0,0 +1,191 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file sd.c +* +* Contains code for the SD card FLASH functionality. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a jz 04/28/11 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xparameters.h" +#include "fsbl.h" +#ifdef XPAR_PS7_SD_0_S_AXI_BASEADDR +#include "xstatus.h" + +#include "ff.h" +#include "sd.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +extern u32 FlashReadBaseAddress; + + +static FIL fil; /* File object */ +static FATFS fatfs; +static char buffer[32]; +static char *boot_file = buffer; + +/******************************************************************************/ +/******************************************************************************/ +/** +* +* This function initializes the controller for the SD FLASH interface. +* +* @param filename of the file that is to be used +* +* @return +* - XST_SUCCESS if the controller initializes correctly +* - XST_FAILURE if the controller fails to initializes correctly +* +* @note None. +* +****************************************************************************/ +u32 InitSD(const char *filename) +{ + + FRESULT rc; + + /* Register volume work area, initialize device */ + rc = f_mount(0, &fatfs); + fsbl_printf(DEBUG_INFO,"SD: rc= %.8x\n\r", rc); + + if (rc != FR_OK) { + return XST_FAILURE; + } + + strcpy_rom(buffer, filename); + boot_file = (char *)buffer; + FlashReadBaseAddress = XPAR_PS7_SD_0_S_AXI_BASEADDR; + + rc = f_open(&fil, boot_file, FA_READ); + if (rc) { + fsbl_printf(DEBUG_GENERAL,"SD: Unable to open file %s: %d\n", boot_file, rc); + return XST_FAILURE; + } + + return XST_SUCCESS; + +} + +/******************************************************************************/ +/** +* +* This function provides the SD FLASH interface for the Simplified header +* functionality. +* +* @param SourceAddress is address in FLASH data space +* @param DestinationAddress is address in OCM data space +* @param LengthBytes is the number of bytes to move +* +* @return +* - XST_SUCCESS if the write completes correctly +* - XST_FAILURE if the write fails to completes correctly +* +* @note None. +* +****************************************************************************/ +u32 SDAccess( u32 SourceAddress, u32 DestinationAddress, u32 LengthBytes) +{ + + FRESULT rc; /* Result code */ + UINT br; + + rc = f_lseek(&fil, SourceAddress); + if (rc) { + fsbl_printf(DEBUG_INFO,"SD: Unable to seek to %x\n", SourceAddress); + return XST_FAILURE; + } + + rc = f_read(&fil, (void*)DestinationAddress, LengthBytes, &br); + + if (rc) { + fsbl_printf(DEBUG_GENERAL,"*** ERROR: f_read returned %d\r\n", rc); + } + + return XST_SUCCESS; + +} /* End of SDAccess */ + + +/******************************************************************************/ +/** +* +* This function closes the file object +* +* @param None +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void ReleaseSD(void) { + + f_close(&fil); + return; + + +} +#endif + + diff --git a/quad/zybo_fsbl/src/sd.h b/quad/zybo_fsbl/src/sd.h new file mode 100644 index 000000000..9de76281f --- /dev/null +++ b/quad/zybo_fsbl/src/sd.h @@ -0,0 +1,87 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file sd.h +* +* This file contains the interface for the Secure Digital (SD) card +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a bh 03/10/11 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ +#ifndef ___SD_H___ +#define ___SD_H___ + + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************** Function Prototypes ******************************/ + +#ifdef XPAR_PS7_SD_0_S_AXI_BASEADDR +u32 InitSD(const char *); + +u32 SDAccess( u32 SourceAddress, + u32 DestinationAddress, + u32 LengthWords); + +void ReleaseSD(void); +#endif +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif + + +#endif /* ___SD_H___ */ + diff --git a/quad/zybo_fsbl/src/sd_hardware.h b/quad/zybo_fsbl/src/sd_hardware.h new file mode 100644 index 000000000..16872f4f9 --- /dev/null +++ b/quad/zybo_fsbl/src/sd_hardware.h @@ -0,0 +1,158 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file sd_hardware.h +* +* Controller register and bit definitions +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a bh 02/01/11 Initial version, +* </pre> +* +* @note None. +* +******************************************************************************/ +#ifndef __SD_HARDWARE_H__ +#define __SD_HARDWARE_H__ + +#define SD_BLOCK_SZ 0x200 +#define SD_CLK_400K 400000 +#define SD_CLK_50M 50000000 +#define SD_CLK_25M 25000000 +#define SD_HS_SUPPORT 0x2 +#define SD_4BIT_SUPPORT 0x5 + +#define SD_DMA_ADDR_R 0x00 +#define SD_BLOCK_SZ_R 0x04 +#define SD_BLOCK_CNT_R 0x06 + +#define SD_ARG_R 0x08 + +#define SD_TRNS_MODE_R 0x0C +#define SD_TRNS_DMA 0x01 +#define SD_TRNS_BLK_CNT_EN 0x02 +#define SD_TRNS_ACMD12 0x04 +#define SD_TRNS_READ 0x10 +#define SD_TRNS_MULTI 0x20 + +#define SD_CMD_R 0x0E +#define SD_CMD_RESP_NONE 0x00 +#define SD_CMD_RESP_136 0x01 +#define SD_CMD_RESP_48 0x02 +#define SD_CMD_RESP_48_BUSY 0x03 +#define SD_CMD_CRC 0x08 +#define SD_CMD_INDEX 0x10 +#define SD_CMD_DATA 0x20 + +#define SD_RSP_R 0x10 + +#define SD_BUFF_R 0x20 + +#define SD_PRES_STATE_R 0x24 +#define SD_CMD_INHIBIT 0x00000001 +#define SD_DATA_INHIBIT 0x00000002 +#define SD_WRITE_ACTIVE 0x00000100 +#define SD_READ_ACTIVE 0x00000200 +#define SD_CARD_INS 0x00010000 +#define SD_CARD_WP 0x00080000 + +#define SD_HOST_CTRL_R 0x28 +#define SD_HOST_4BIT 0x02 +#define SD_HOST_HS 0x04 +#define SD_HOST_ADMA1 0x08 +#define SD_HOST_ADMA2 0x10 + +#define SD_PWR_CTRL_R 0x29 +#define SD_POWER_ON 0x01 +#define SD_POWER_18 0x0A +#define SD_POWER_30 0x0C +#define SD_POWER_33 0x0E + +#define SD_BLCK_GAP_CTL_R 0x2A + +#define SD_WAKE_CTL_R 0x2B + +#define SD_CLK_CTL_R 0x2C +#define SD_DIV_SHIFT 8 +#define SD_CLK_SD_EN 0x0004 +#define SD_CLK_INT_STABLE 0x0002 +#define SD_CLK_INT_EN 0x0001 + +#define SD_TIMEOUT_CTL_R 0x2E + +#define SD_SOFT_RST_R 0x2F +#define SD_RST_ALL 0x01 +#define SD_RST_CMD 0x02 +#define SD_RST_DATA 0x04 + +#define SD_INT_STAT_R 0x30 +#define SD_INT_ENA_R 0x34 +#define SD_SIG_ENA_R 0x38 +#define SD_INT_CMD_CMPL 0x00000001 +#define SD_INT_TRNS_CMPL 0x00000002 +#define SD_INT_DMA 0x00000008 +#define SD_INT_ERROR 0x00008000 +#define SD_INT_ERR_CTIMEOUT 0x00010000 +#define SD_INT_ERR_CCRC 0x00020000 +#define SD_INT_ERR_CEB 0x00040000 +#define SD_INT_ERR_IDX 0x00080000 +#define SD_INT_ERR_DTIMEOUT 0x00100000 +#define SD_INT_ERR_DCRC 0x00200000 +#define SD_INT_ERR_DEB 0x00400000 +#define SD_INT_ERR_CLMT 0x00800000 +#define SD_INT_ERR_ACMD12 0x01000000 +#define SD_INT_ERR_ADMA 0x02000000 +#define SD_INT_ERR_TRESP 0x10000000 + +#define SD_CAPABILITIES_R 0x40 + +#define SD_ADMA_ADDR_R 0x58 +#define DESC_ATBR_VALID (0x1 << 0) +#define DESC_ATBR_END (0x1 << 1) +#define DESC_ATBR_INT (0x1 << 2) +#define DESC_ATBR_ACT_TRAN (0x2 << 4) +#define DESC_ATBR_LEN_SHIFT 16 + +#endif diff --git a/quad/zybo_fsbl_bsp/.cproject b/quad/zybo_fsbl_bsp/.cproject new file mode 100644 index 000000000..7ac91ccaa --- /dev/null +++ b/quad/zybo_fsbl_bsp/.cproject @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?> + +<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> + <storageModule moduleId="org.eclipse.cdt.core.settings"> + <cconfiguration id="org.eclipse.cdt.core.default.config.1547509400"> + <storageModule buildSystemId="org.eclipse.cdt.core.defaultConfigDataProvider" id="org.eclipse.cdt.core.default.config.1547509400" moduleId="org.eclipse.cdt.core.settings" name="Configuration"> + <externalSettings/> + <extensions/> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> +</cproject> diff --git a/quad/zybo_fsbl_bsp/.project b/quad/zybo_fsbl_bsp/.project new file mode 100644 index 000000000..db7920e2d --- /dev/null +++ b/quad/zybo_fsbl_bsp/.project @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>zybo_fsbl_bsp</name> + <comment></comment> + <projects> + <project>system_hw_platform</project> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.make.core.makeBuilder</name> + <arguments> + <dictionary> + <key>org.eclipse.cdt.core.errorOutputParser</key> + <value>org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.VCErrorParser;org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.MakeErrorParser;</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.append_environment</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.arguments</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.command</key> + <value>make</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.auto</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.clean</key> + <value>clean</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.build.target.inc</key> + <value>all</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableAutoBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableCleanBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enableFullBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key> + <value>true</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.environment</key> + <value></value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.stopOnError</key> + <value>false</value> + </dictionary> + <dictionary> + <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key> + <value>true</value> + </dictionary> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>com.xilinx.sdk.sw.SwProjectNature</nature> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.make.core.makeNature</nature> + </natures> +</projectDescription> diff --git a/quad/zybo_fsbl_bsp/.sdkproject b/quad/zybo_fsbl_bsp/.sdkproject new file mode 100644 index 000000000..3135ec9f7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/.sdkproject @@ -0,0 +1,3 @@ +THIRPARTY=false +PROCESSOR=ps7_cortexa9_0 +MSS_FILE=system.mss diff --git a/quad/zybo_fsbl_bsp/Makefile b/quad/zybo_fsbl_bsp/Makefile new file mode 100644 index 000000000..fe2a0efc7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/Makefile @@ -0,0 +1,21 @@ +# Makefile generated by Xilinx SDK. + +-include libgen.options + +LIBRARIES = ${PROCESSOR}/lib/libxil.a +MSS = system.mss + +all: libs + @echo 'Finished building libraries' + +libs: $(LIBRARIES) + +$(LIBRARIES): $(MSS) + libgen -hw ${HWSPEC}\ + ${REPOSITORIES}\ + -pe ${PROCESSOR} \ + -log libgen.log \ + $(MSS) + +clean: + rm -rf ${PROCESSOR} diff --git a/quad/zybo_fsbl_bsp/libgen.log b/quad/zybo_fsbl_bsp/libgen.log new file mode 100644 index 000000000..ea7125631 --- /dev/null +++ b/quad/zybo_fsbl_bsp/libgen.log @@ -0,0 +1,21 @@ +Release 14.7 - libgen Xilinx EDK 14.7 Build EDK_P.20131013 + (lin64) +Copyright (c) 1995-2013 Xilinx, Inc. All rights reserved. + +Command Line: libgen -hw +/local/ucart/MicroCART_17-18/quad/sw/system_hw_platform/system.xml -pe +ps7_cortexa9_0 -log libgen.log system.mss + + +Staging source files. +Running DRCs. +Running generate. +Running post_generate. +Running include - 'gmake -s include "COMPILER=arm-xilinx-eabi-gcc" +"ARCHIVER=arm-xilinx-eabi-ar" "COMPILER_FLAGS= -O2 -c" +"EXTRA_COMPILER_FLAGS=-g"'. + +Running libs - 'gmake -s libs "COMPILER=arm-xilinx-eabi-gcc" +"ARCHIVER=arm-xilinx-eabi-ar" "COMPILER_FLAGS= -O2 -c" +"EXTRA_COMPILER_FLAGS=-g"'. +Running execs_generate. diff --git a/quad/zybo_fsbl_bsp/libgen.options b/quad/zybo_fsbl_bsp/libgen.options new file mode 100644 index 000000000..cfd92f788 --- /dev/null +++ b/quad/zybo_fsbl_bsp/libgen.options @@ -0,0 +1,3 @@ +PROCESSOR=ps7_cortexa9_0 +REPOSITORIES= +HWSPEC=/local/ucart/MicroCART_17-18/quad/sw/system_hw_platform/system.xml diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/_profile_timer_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/_profile_timer_hw.h new file mode 100755 index 000000000..19499f7c5 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/_profile_timer_hw.h @@ -0,0 +1,292 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-11 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: _profile_timer_hw.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $ +// +// _program_timer_hw.h: +// Timer related functions +// +////////////////////////////////////////////////////////////////////// + +#ifndef _PROFILE_TIMER_HW_H +#define _PROFILE_TIMER_HW_H + +#include "profile.h" + +#ifdef PROC_PPC +#if defined __GNUC__ +# define SYNCHRONIZE_IO __asm__ volatile ("eieio") +#elif defined __DCC__ +# define SYNCHRONIZE_IO __asm volatile(" eieio") +#else +# define SYNCHRONIZE_IO +#endif +#endif + +#ifdef PROC_PPC +#define ProfIo_In32(InputPtr) (*(volatile u32 *)(InputPtr)); SYNCHRONIZE_IO; +#define ProfIo_Out32(OutputPtr, Value) { (*(volatile u32 *)(OutputPtr) = Value); SYNCHRONIZE_IO; } +#else +#define ProfIo_In32(InputPtr) (*(volatile u32 *)(InputPtr)); +#define ProfIo_Out32(OutputPtr, Value) { (*(volatile u32 *)(OutputPtr) = Value); } +#endif + +#define ProfTmrCtr_mWriteReg(BaseAddress, TmrCtrNumber, RegOffset, ValueToWrite)\ + ProfIo_Out32(((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + \ + (RegOffset)), (ValueToWrite)) + +#define ProfTimerCtr_mReadReg(BaseAddress, TmrCtrNumber, RegOffset) \ + ProfIo_In32((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + (RegOffset)) + +#define ProfTmrCtr_mSetControlStatusReg(BaseAddress, TmrCtrNumber, RegisterValue)\ + ProfTmrCtr_mWriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (RegisterValue)) + +#define ProfTmrCtr_mGetControlStatusReg(BaseAddress, TmrCtrNumber) \ + ProfTimerCtr_mReadReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET) + + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PROC_PPC +#include "xexception_l.h" +#include "xtime_l.h" +#include "xpseudo_asm.h" +#endif + +#ifdef TIMER_CONNECT_INTC +#include "xintc_l.h" +#include "xintc.h" +#endif // TIMER_CONNECT_INTC + +#if (!defined PPC_PIT_INTERRUPT && !defined PROC_CORTEXA9) +#include "xtmrctr_l.h" +#endif + +#ifdef PROC_CORTEXA9 +#include "xscutimer_hw.h" +#include "xscugic.h" +#endif + +extern unsigned int timer_clk_ticks ; + +//-------------------------------------------------------------------- +// PowerPC Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_PPC + +#ifdef PPC_PIT_INTERRUPT +unsigned long timer_lo_clk_ticks ; // Clk ticks when Timer is disabled in CG +#endif + +#ifdef PROC_PPC440 +#define XREG_TCR_PIT_INTERRUPT_ENABLE XREG_TCR_DEC_INTERRUPT_ENABLE +#define XREG_TSR_PIT_INTERRUPT_STATUS XREG_TSR_DEC_INTERRUPT_STATUS +#define XREG_SPR_PIT XREG_SPR_DEC +#define XEXC_ID_PIT_INT XEXC_ID_DEC_INT +#endif + +//-------------------------------------------------------------------- +// Disable the Timer - During Profiling +// +// For PIT Timer - +// 1. XTime_PITDisableInterrupt() ; +// 2. Store the remaining timer clk tick +// 3. Stop the PIT Timer +//-------------------------------------------------------------------- + +#ifdef PPC_PIT_INTERRUPT +#define disable_timer() \ + { \ + unsigned long val; \ + val=mfspr(XREG_SPR_TCR); \ + mtspr(XREG_SPR_TCR, val & ~XREG_TCR_PIT_INTERRUPT_ENABLE); \ + timer_lo_clk_ticks = mfspr(XREG_SPR_PIT); \ + mtspr(XREG_SPR_PIT, 0); \ + } +#else +#define disable_timer() \ + { \ + u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(addr); \ + tmp_v = tmp_v & ~XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \ + } +#endif + + + +//-------------------------------------------------------------------- +// Enable the Timer +// +// For PIT Timer - +// 1. Load the remaining timer clk ticks +// 2. XTime_PITEnableInterrupt() ; +//-------------------------------------------------------------------- +#ifdef PPC_PIT_INTERRUPT +#define enable_timer() \ + { \ + unsigned long val; \ + val=mfspr(XREG_SPR_TCR); \ + mtspr(XREG_SPR_PIT, timer_lo_clk_ticks); \ + mtspr(XREG_SPR_TCR, val | XREG_TCR_PIT_INTERRUPT_ENABLE); \ + } +#else +#define enable_timer() \ + { \ + u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(addr); \ + tmp_v = tmp_v | XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \ + } +#endif + + + +//-------------------------------------------------------------------- +// Send Ack to Timer Interrupt +// +// For PIT Timer - +// 1. Load the timer clk ticks +// 2. Enable AutoReload and Interrupt +// 3. Clear PIT Timer Status bits +//-------------------------------------------------------------------- +#ifdef PPC_PIT_INTERRUPT +#define timer_ack() \ + { \ + unsigned long val; \ + mtspr(XREG_SPR_PIT, timer_clk_ticks); \ + mtspr(XREG_SPR_TSR, XREG_TSR_PIT_INTERRUPT_STATUS); \ + val=mfspr(XREG_SPR_TCR); \ + mtspr(XREG_SPR_TCR, val| XREG_TCR_PIT_INTERRUPT_ENABLE| XREG_TCR_AUTORELOAD_ENABLE); \ + } +#else +#define timer_ack() \ + { \ + unsigned int csr; \ + csr = ProfTmrCtr_mGetControlStatusReg(PROFILE_TIMER_BASEADDR, 0); \ + ProfTmrCtr_mSetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, csr); \ + } +#endif + +//-------------------------------------------------------------------- +#endif // PROC_PPC +//-------------------------------------------------------------------- + + + + +//-------------------------------------------------------------------- +// MicroBlaze Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_MICROBLAZE + +//-------------------------------------------------------------------- +// Disable the Timer during Call-Graph Data collection +// +//-------------------------------------------------------------------- +#define disable_timer() \ + { \ + u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(addr); \ + tmp_v = tmp_v & ~XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \ + } + + +//-------------------------------------------------------------------- +// Enable the Timer after Call-Graph Data collection +// +//-------------------------------------------------------------------- +#define enable_timer() \ + { \ + u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(addr); \ + tmp_v = tmp_v | XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \ + } + + +//-------------------------------------------------------------------- +// Send Ack to Timer Interrupt +// +//-------------------------------------------------------------------- +#define timer_ack() \ + { \ + unsigned int csr; \ + csr = ProfTmrCtr_mGetControlStatusReg(PROFILE_TIMER_BASEADDR, 0); \ + ProfTmrCtr_mSetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, csr); \ + } + +//-------------------------------------------------------------------- +#endif // PROC_MICROBLAZE +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +// Cortex A9 Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_CORTEXA9 + +//-------------------------------------------------------------------- +// Disable the Timer during Call-Graph Data collection +// +//-------------------------------------------------------------------- +#define disable_timer() \ +{ \ + u32 Reg; \ + Reg = Xil_In32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET); \ + Reg &= ~XSCUTIMER_CONTROL_ENABLE_MASK;\ + Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET, Reg);\ +} \ + + +//-------------------------------------------------------------------- +// Enable the Timer after Call-Graph Data collection +// +//-------------------------------------------------------------------- +#define enable_timer() \ +{ \ + u32 Reg; \ + Reg = Xil_In32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET); \ + Reg |= XSCUTIMER_CONTROL_ENABLE_MASK; \ + Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET, Reg);\ +} \ + + +//-------------------------------------------------------------------- +// Send Ack to Timer Interrupt +// +//-------------------------------------------------------------------- +#define timer_ack() \ +{ \ + Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_ISR_OFFSET, \ + XSCUTIMER_ISR_EVENT_FLAG_MASK);\ +} + +//-------------------------------------------------------------------- +#endif // PROC_CORTEXA9 +//-------------------------------------------------------------------- + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/bspconfig.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/bspconfig.h new file mode 100644 index 000000000..a7fdebbc6 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/bspconfig.h @@ -0,0 +1,15 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Configurations for Standalone BSP +* +*******************************************************************/ + +#define MICROBLAZE_PVR_NONE diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/mblaze_nt_types.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/mblaze_nt_types.h new file mode 100755 index 000000000..2cf77fe83 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/mblaze_nt_types.h @@ -0,0 +1,51 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-11 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: mblaze_nt_types.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $ +// +////////////////////////////////////////////////////////////////////// + +#ifndef _MBLAZE_NT_TYPES_H +#define _MBLAZE_NT_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef char byte; +typedef short half; +typedef int word; +typedef unsigned char ubyte; +typedef unsigned short uhalf; +typedef unsigned int uword; +typedef ubyte boolean; + +//typedef unsigned char u_char; +//typedef unsigned short u_short; +//typedef unsigned int u_int; +//typedef unsigned long u_long; + +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/profile.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/profile.h new file mode 100755 index 000000000..0657e6f99 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/profile.h @@ -0,0 +1,127 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-11 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: profile.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $ +// +////////////////////////////////////////////////////////////////////// + +#ifndef _PROFILE_H +#define _PROFILE_H 1 + +#include <stdio.h> +#include "mblaze_nt_types.h" +#include "profile_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void _system_init( void ) ; +void _system_clean( void ) ; +void mcount(unsigned long frompc, unsigned long selfpc); +void profile_intr_handler( void ) ; + + + +/**************************************************************************** + * Profiling on hardware - Hash table maintained on hardware and data sent + * to xmd for gmon.out generation. + ****************************************************************************/ +/* + * histogram counters are unsigned shorts (according to the kernel). + */ +#define HISTCOUNTER unsigned short + +struct tostruct { + unsigned long selfpc; + long count; + short link; + unsigned short pad; +}; + +struct fromstruct { + unsigned long frompc ; + short link ; + unsigned short pad ; +} ; + +/* + * general rounding functions. + */ +#define ROUNDDOWN(x,y) (((x)/(y))*(y)) +#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) + +/* + * The profiling data structures are housed in this structure. + */ +struct gmonparam { + long int state; + + // Histogram Information + unsigned short *kcount; /* No. of bins in histogram */ + unsigned long kcountsize; /* Histogram samples */ + + // Call-graph Information + struct fromstruct *froms; + unsigned long fromssize; + struct tostruct *tos; + unsigned long tossize; + + // Initialization I/Ps + unsigned long lowpc; + unsigned long highpc; + unsigned long textsize; + //unsigned long cg_froms; + //unsigned long cg_tos; +}; +extern struct gmonparam *_gmonparam; +extern int n_gmon_sections; + +/* + * Possible states of profiling. + */ +#define GMON_PROF_ON 0 +#define GMON_PROF_BUSY 1 +#define GMON_PROF_ERROR 2 +#define GMON_PROF_OFF 3 + +/* + * Sysctl definitions for extracting profiling information from the kernel. + */ +#define GPROF_STATE 0 /* int: profiling enabling variable */ +#define GPROF_COUNT 1 /* struct: profile tick count buffer */ +#define GPROF_FROMS 2 /* struct: from location hash bucket */ +#define GPROF_TOS 3 /* struct: destination/count structure */ +#define GPROF_GMONPARAM 4 /* struct: profiling parameters (see above) */ + +#ifdef __cplusplus +} +#endif + +#endif /* _PROFILE_H */ + + + + + + + + + + + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/sleep.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/sleep.h new file mode 100755 index 000000000..4d9dd5abd --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/sleep.h @@ -0,0 +1,58 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#ifndef SLEEP_H +#define SLEEP_H + +#ifdef __cplusplus +extern "C" { +#endif + +void nanosleep(unsigned int nanoseconds); +int usleep(unsigned int useconds); +int sleep(unsigned int seconds); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/smc.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/smc.h new file mode 100755 index 000000000..fcfccebaa --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/smc.h @@ -0,0 +1,124 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file smc.h +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 11/03/09 Initial release. +* </pre> +* +* @note None. +* +******************************************************************************/ + +#ifndef SMC_H /* prevent circular inclusions */ +#define SMC_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xparameters.h" +#include "xil_io.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/* Memory controller configuration register offset */ +#define XSMCPSS_MC_STATUS 0x000 /* Controller status reg, RO */ +#define XSMCPSS_MC_INTERFACE_CONFIG 0x004 /* Interface config reg, RO */ +#define XSMCPSS_MC_SET_CONFIG 0x008 /* Set configuration reg, WO */ +#define XSMCPSS_MC_CLR_CONFIG 0x00C /* Clear config reg, WO */ +#define XSMCPSS_MC_DIRECT_CMD 0x010 /* Direct command reg, WO */ +#define XSMCPSS_MC_SET_CYCLES 0x014 /* Set cycles register, WO */ +#define XSMCPSS_MC_SET_OPMODE 0x018 /* Set opmode register, WO */ +#define XSMCPSS_MC_REFRESH_PERIOD_0 0x020 /* Refresh period_0 reg, RW */ +#define XSMCPSS_MC_REFRESH_PERIOD_1 0x024 /* Refresh period_1 reg, RW */ + +/* Chip select configuration register offset */ +#define XSMCPSS_CS_IF0_CHIP_0_OFFSET 0x100 /* Interface 0 chip 0 config */ +#define XSMCPSS_CS_IF0_CHIP_1_OFFSET 0x120 /* Interface 0 chip 1 config */ +#define XSMCPSS_CS_IF0_CHIP_2_OFFSET 0x140 /* Interface 0 chip 2 config */ +#define XSMCPSS_CS_IF0_CHIP_3_OFFSET 0x160 /* Interface 0 chip 3 config */ +#define XSMCPSS_CS_IF1_CHIP_0_OFFSET 0x180 /* Interface 1 chip 0 config */ +#define XSMCPSS_CS_IF1_CHIP_1_OFFSET 0x1A0 /* Interface 1 chip 1 config */ +#define XSMCPSS_CS_IF1_CHIP_2_OFFSET 0x1C0 /* Interface 1 chip 2 config */ +#define XSMCPSS_CS_IF1_CHIP_3_OFFSET 0x1E0 /* Interface 1 chip 3 config */ + +/* User configuration register offset */ +#define XSMCPSS_UC_STATUS_OFFSET 0x200 /* User status reg, RO */ +#define XSMCPSS_UC_CONFIG_OFFSET 0x204 /* User config reg, WO */ + +/* Integration test register offset */ +#define XSMCPSS_IT_OFFSET 0xE00 + +/* ID configuration register offset */ +#define XSMCPSS_ID_PERIP_0_OFFSET 0xFE0 +#define XSMCPSS_ID_PERIP_1_OFFSET 0xFE4 +#define XSMCPSS_ID_PERIP_2_OFFSET 0xFE8 +#define XSMCPSS_ID_PERIP_3_OFFSET 0xFEC +#define XSMCPSS_ID_PCELL_0_OFFSET 0xFF0 +#define XSMCPSS_ID_PCELL_1_OFFSET 0xFF4 +#define XSMCPSS_ID_PCELL_2_OFFSET 0xFF8 +#define XSMCPSS_ID_PCELL_3_OFFSET 0xFFC + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void XSmc_SramInit (void); +void XSmc_NorInit(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SMC_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/vectors.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/vectors.h new file mode 100755 index 000000000..1b094cd17 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/vectors.h @@ -0,0 +1,90 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file vectors.h +* +* This file contains the C level vector prototypes for the ARM Cortex A9 core. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a ecm 10/20/10 Initial version, moved over from bsp area +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _VECTORS_H_ +#define _VECTORS_H_ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" + +#ifdef __cplusplus +extern "C" { +#endif +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/************************** Function Prototypes ******************************/ +void FIQInterrupt(void); +void IRQInterrupt(void); +void SWInterrupt(void); +void DataAbortInterrupt(void); +void PrefetchAbortInterrupt(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xadcps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xadcps.h new file mode 100755 index 000000000..7c53621ef --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xadcps.h @@ -0,0 +1,566 @@ +/****************************************************************************** +* +* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps.h +* +* The XAdcPs driver supports the Xilinx XADC/ADC device. +* +* The XADC/ADC device has the following features: +* - 10-bit, 200-KSPS (kilo samples per second) +* Analog-to-Digital Converter (ADC) +* - Monitoring of on-chip supply voltages and temperature +* - 1 dedicated differential analog-input pair and +* 16 auxiliary differential analog-input pairs +* - Automatic alarms based on user defined limits for the on-chip +* supply voltages and temperature +* - Automatic Channel Sequencer, programmable averaging, programmable +* acquisition time for the external inputs, unipolar or differential +* input selection for the external inputs +* - Inbuilt Calibration +* - Optional interrupt request generation +* +* +* The user should refer to the hardware device specification for detailed +* information about the device. +* +* This header file contains the prototypes of driver functions that can +* be used to access the XADC/ADC device. +* +* +* <b> XADC Channel Sequencer Modes </b> +* +* The XADC Channel Sequencer supports the following operating modes: +* +* - <b> Default </b>: This is the default mode after power up. +* In this mode of operation the XADC operates in +* a sequence mode, monitoring the on chip sensors: +* Temperature, VCCINT, and VCCAUX. +* - <b> One pass through sequence </b>: In this mode the XADC +* converts the channels enabled in the Sequencer Channel Enable +* registers for a single pass and then stops. +* - <b> Continuous cycling of sequence </b>: In this mode the XADC +* converts the channels enabled in the Sequencer Channel Enable +* registers continuously. +* - <b> Single channel mode</b>: In this mode the XADC Channel +* Sequencer is disabled and the XADC operates in a +* Single Channel Mode. +* The XADC can operate either in a Continuous or Event +* driven sampling mode in the single channel mode. +* - <b> Simultaneous Sampling Mode</b>: In this mode the XADC Channel +* Sequencer will automatically sequence through eight fixed pairs +* of auxiliary analog input channels for simulataneous conversion. +* - <b> Independent ADC mode</b>: In this mode the first ADC (A) is used to +* is used to implement a fixed monitoring mode similar to the +* default mode but the alarm fucntions ar eenabled. +* The second ADC (B) is available to be used with external analog +* input channels only. +* +* Read the XADC spec for more information about the sequencer modes. +* +* <b> Initialization and Configuration </b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate to the XADC/ADC device. +* +* XAdcPs_CfgInitialize() API is used to initialize the XADC/ADC +* device. The user needs to first call the XAdcPs_LookupConfig() API which +* returns the Configuration structure pointer which is passed as a parameter to +* the XAdcPs_CfgInitialize() API. +* +* +* <b>Interrupts</b> +* +* The XADC/ADC device supports interrupt driven mode and the default +* operation mode is polling mode. +* +* The interrupt mode is available only if hardware is configured to support +* interrupts. +* +* This driver does not provide a Interrupt Service Routine (ISR) for the device. +* It is the responsibility of the application to provide one if needed. Refer to +* the interrupt example provided with this driver for details on using the +* device in interrupt mode. +* +* +* <b> Virtual Memory </b> +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* +* <b> Threads </b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* +* <b> Asserts </b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* +* <b> Building the driver </b> +* +* The XAdcPs driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* +* <b> Limitations of the driver </b> +* +* XADC/ADC device can be accessed through the JTAG port and the PLB +* interface. The driver implementation does not support the simultaneous access +* of the device by both these interfaces. The user has to care of this situation +* in the user application code. +* +* <br><br> +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a ssb 12/22/11 First release based on the XPS/AXI xadc driver +* 1.01a bss 02/18/13 Modified XAdcPs_SetSeqChEnables,XAdcPs_SetSeqAvgEnables +* XAdcPs_SetSeqInputMode and XAdcPs_SetSeqAcqTime APIs +* in xadcps.c to fix CR #693371 +* </pre> +* +*****************************************************************************/ +#ifndef XADCPS_H /* Prevent circular inclusions */ +#define XADCPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xadcps_hw.h" + +/************************** Constant Definitions ****************************/ + + +/** + * @name Indexes for the different channels. + * @{ + */ +#define XADCPS_CH_TEMP 0x0 /**< On Chip Temperature */ +#define XADCPS_CH_VCCINT 0x1 /**< VCCINT */ +#define XADCPS_CH_VCCAUX 0x2 /**< VCCAUX */ +#define XADCPS_CH_VPVN 0x3 /**< VP/VN Dedicated analog inputs */ +#define XADCPS_CH_VREFP 0x4 /**< VREFP */ +#define XADCPS_CH_VREFN 0x5 /**< VREFN */ +#define XADCPS_CH_VBRAM 0x6 /**< On-chip VBRAM Data Reg, 7 series */ +#define XADCPS_CH_SUPPLY_CALIB 0x07 /**< Supply Calib Data Reg */ +#define XADCPS_CH_ADC_CALIB 0x08 /**< ADC Offset Channel Reg */ +#define XADCPS_CH_GAINERR_CALIB 0x09 /**< Gain Error Channel Reg */ +#define XADCPS_CH_VCCPINT 0x0D /**< On-chip PS VCCPINT Channel , Zynq */ +#define XADCPS_CH_VCCPAUX 0x0E /**< On-chip PS VCCPAUX Channel , Zynq */ +#define XADCPS_CH_VCCPDRO 0x0F /**< On-chip PS VCCPDRO Channel , Zynq */ +#define XADCPS_CH_AUX_MIN 16 /**< Channel number for 1st Aux Channel */ +#define XADCPS_CH_AUX_MAX 31 /**< Channel number for Last Aux channel */ + +/*@}*/ + + +/** + * @name Indexes for reading the Calibration Coefficient Data. + * @{ + */ +#define XADCPS_CALIB_SUPPLY_COEFF 0 /**< Supply Offset Calib Coefficient */ +#define XADCPS_CALIB_ADC_COEFF 1 /**< ADC Offset Calib Coefficient */ +#define XADCPS_CALIB_GAIN_ERROR_COEFF 2 /**< Gain Error Calib Coefficient*/ +/*@}*/ + + +/** + * @name Indexes for reading the Minimum/Maximum Measurement Data. + * @{ + */ +#define XADCPS_MAX_TEMP 0 /**< Maximum Temperature Data */ +#define XADCPS_MAX_VCCINT 1 /**< Maximum VCCINT Data */ +#define XADCPS_MAX_VCCAUX 2 /**< Maximum VCCAUX Data */ +#define XADCPS_MAX_VBRAM 3 /**< Maximum VBRAM Data */ +#define XADCPS_MIN_TEMP 4 /**< Minimum Temperature Data */ +#define XADCPS_MIN_VCCINT 5 /**< Minimum VCCINT Data */ +#define XADCPS_MIN_VCCAUX 6 /**< Minimum VCCAUX Data */ +#define XADCPS_MIN_VBRAM 7 /**< Minimum VBRAM Data */ +#define XADCPS_MAX_VCCPINT 8 /**< Maximum VCCPINT Register , Zynq */ +#define XADCPS_MAX_VCCPAUX 9 /**< Maximum VCCPAUX Register , Zynq */ +#define XADCPS_MAX_VCCPDRO 0xA /**< Maximum VCCPDRO Register , Zynq */ +#define XADCPS_MIN_VCCPINT 0xC /**< Minimum VCCPINT Register , Zynq */ +#define XADCPS_MIN_VCCPAUX 0xD /**< Minimum VCCPAUX Register , Zynq */ +#define XADCPS_MIN_VCCPDRO 0xE /**< Minimum VCCPDRO Register , Zynq */ + +/*@}*/ + + +/** + * @name Alarm Threshold(Limit) Register (ATR) indexes. + * @{ + */ +#define XADCPS_ATR_TEMP_UPPER 0 /**< High user Temperature */ +#define XADCPS_ATR_VCCINT_UPPER 1 /**< VCCINT high voltage limit register */ +#define XADCPS_ATR_VCCAUX_UPPER 2 /**< VCCAUX high voltage limit register */ +#define XADCPS_ATR_OT_UPPER 3 /**< VCCAUX high voltage limit register */ +#define XADCPS_ATR_TEMP_LOWER 4 /**< Upper Over Temperature limit Reg */ +#define XADCPS_ATR_VCCINT_LOWER 5 /**< VCCINT high voltage limit register */ +#define XADCPS_ATR_VCCAUX_LOWER 6 /**< VCCAUX low voltage limit register */ +#define XADCPS_ATR_OT_LOWER 7 /**< Lower Over Temperature limit */ +#define XADCPS_ATR_VBRAM_UPPER_ 8 /**< VRBAM Upper Alarm Reg, 7 Series */ +#define XADCPS_ATR_VCCPINT_UPPER 9 /**< VCCPINT Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VCCPAUX_UPPER 0xA /**< VCCPAUX Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VCCPDRO_UPPER 0xB /**< VCCPDRO Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VBRAM_LOWER 0xC /**< VRBAM Lower Alarm Reg, 7 Series */ +#define XADCPS_ATR_VCCPINT_LOWER 0xD /**< VCCPINT Lower Alarm Reg , Zynq */ +#define XADCPS_ATR_VCCPAUX_LOWER 0xE /**< VCCPAUX Lower Alarm Reg , Zynq */ +#define XADCPS_ATR_VCCPDRO_LOWER 0xF /**< VCCPDRO Lower Alarm Reg , Zynq */ + +/*@}*/ + + +/** + * @name Averaging to be done for the channels. + * @{ + */ +#define XADCPS_AVG_0_SAMPLES 0 /**< No Averaging */ +#define XADCPS_AVG_16_SAMPLES 1 /**< Average 16 samples */ +#define XADCPS_AVG_64_SAMPLES 2 /**< Average 64 samples */ +#define XADCPS_AVG_256_SAMPLES 3 /**< Average 256 samples */ + +/*@}*/ + + +/** + * @name Channel Sequencer Modes of operation + * @{ + */ +#define XADCPS_SEQ_MODE_SAFE 0 /**< Default Safe Mode */ +#define XADCPS_SEQ_MODE_ONEPASS 1 /**< Onepass through Sequencer */ +#define XADCPS_SEQ_MODE_CONTINPASS 2 /**< Continuous Cycling Sequencer */ +#define XADCPS_SEQ_MODE_SINGCHAN 3 /**< Single channel -No Sequencing */ +#define XADCPS_SEQ_MODE_SIMUL_SAMPLING 4 /**< Simultaneous sampling */ +#define XADCPS_SEQ_MODE_INDEPENDENT 8 /**< Independent mode */ + +/*@}*/ + + + +/** + * @name Power Down Modes + * @{ + */ +#define XADCPS_PD_MODE_NONE 0 /**< No Power Down */ +#define XADCPS_PD_MODE_ADCB 1 /**< Power Down ADC B */ +#define XADCPS_PD_MODE_XADC 2 /**< Power Down ADC A and ADC B */ +/*@}*/ + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the XADC/ADC + * device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Device base address */ +} XAdcPs_Config; + + +/** + * The driver's instance data. The user is required to allocate a variable + * of this type for every XADC/ADC device in the system. A pointer to + * a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XAdcPs_Config Config; /**< XAdcPs_Config of current device */ + u32 IsReady; /**< Device is initialized and ready */ + +} XAdcPs; + +/***************** Macros (Inline Functions) Definitions ********************/ + +/****************************************************************************/ +/** +* +* This macro checks if the XADC device is in Event Sampling mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return +* - TRUE if the device is in Event Sampling Mode. +* - FALSE if the device is in Continuous Sampling Mode. +* +* @note C-Style signature: +* int XAdcPs_IsEventSamplingMode(XAdcPs *InstancePtr); +* +*****************************************************************************/ +#define XAdcPs_IsEventSamplingModeSet(InstancePtr) \ + (((XAdcPs_ReadInternalReg(InstancePtr, \ + XADCPS_CFR0_OFFSET) & XADCPS_CFR0_EC_MASK) ? \ + TRUE : FALSE)) + + +/****************************************************************************/ +/** +* +* This macro checks if the XADC device is in External Mux mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return +* - TRUE if the device is in External Mux Mode. +* - FALSE if the device is NOT in External Mux Mode. +* +* @note C-Style signature: +* int XAdcPs_IsExternalMuxMode(XAdcPs *InstancePtr); +* +*****************************************************************************/ +#define XAdcPs_IsExternalMuxModeSet(InstancePtr) \ + (((XAdcPs_ReadInternalReg(InstancePtr, \ + XADCPS_CFR0_OFFSET) & XADCPS_CFR0_MUX_MASK) ? \ + TRUE : FALSE)) + +/****************************************************************************/ +/** +* +* This macro converts XADC Raw Data to Temperature(centigrades). +* +* @param AdcData is the Raw ADC Data from XADC. +* +* @return The Temperature in centigrades. +* +* @note C-Style signature: +* float XAdcPs_RawToTemperature(u32 AdcData); +* +*****************************************************************************/ +#define XAdcPs_RawToTemperature(AdcData) \ + ((((float)(AdcData)/65536.0f)/0.00198421639f ) - 273.15f) + +/****************************************************************************/ +/** +* +* This macro converts XADC/ADC Raw Data to Voltage(volts). +* +* @param AdcData is the XADC/ADC Raw Data. +* +* @return The Voltage in volts. +* +* @note C-Style signature: +* float XAdcPs_RawToVoltage(u32 AdcData); +* +*****************************************************************************/ +#define XAdcPs_RawToVoltage(AdcData) \ + ((((float)(AdcData))* (3.0f))/65536.0f) + +/****************************************************************************/ +/** +* +* This macro converts Temperature in centigrades to XADC/ADC Raw Data. +* +* @param Temperature is the Temperature in centigrades to be +* converted to XADC/ADC Raw Data. +* +* @return The XADC/ADC Raw Data. +* +* @note C-Style signature: +* int XAdcPs_TemperatureToRaw(float Temperature); +* +*****************************************************************************/ +#define XAdcPs_TemperatureToRaw(Temperature) \ + ((int)(((Temperature) + 273.15f)*65536.0f*0.00198421639f)) + +/****************************************************************************/ +/** +* +* This macro converts Voltage in Volts to XADC/ADC Raw Data. +* +* @param Voltage is the Voltage in volts to be converted to +* XADC/ADC Raw Data. +* +* @return The XADC/ADC Raw Data. +* +* @note C-Style signature: +* int XAdcPs_VoltageToRaw(float Voltage); +* +*****************************************************************************/ +#define XAdcPs_VoltageToRaw(Voltage) \ + ((int)((Voltage)*65536.0f/3.0f)) + + +/****************************************************************************/ +/** +* +* This macro is used for writing to the XADC Registers using the +* command FIFO. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XAdcPs_WriteFifo(XAdcPs *InstancePtr, u32 Data); +* +*****************************************************************************/ +#define XAdcPs_WriteFifo(InstancePtr, Data) \ + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XADCPS_CMDFIFO_OFFSET, Data); + + +/****************************************************************************/ +/** +* +* This macro is used for reading from the XADC Registers using the +* data FIFO. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return Data read from the FIFO +* +* @note C-Style signature: +* u32 XAdcPs_ReadFifo(XAdcPs *InstancePtr); +* +*****************************************************************************/ +#define XAdcPs_ReadFifo(InstancePtr) \ + XAdcPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XADCPS_RDFIFO_OFFSET); + + +/************************** Function Prototypes *****************************/ + + + +/** + * Functions in xadcps_sinit.c + */ +XAdcPs_Config *XAdcPs_LookupConfig(u16 DeviceId); + +/** + * Functions in xadcps.c + */ +int XAdcPs_CfgInitialize(XAdcPs *InstancePtr, + XAdcPs_Config *ConfigPtr, + u32 EffectiveAddr); + + +u32 XAdcPs_GetStatus(XAdcPs *InstancePtr); + +u32 XAdcPs_GetAlarmOutputStatus(XAdcPs *InstancePtr); + +void XAdcPs_StartAdcConversion(XAdcPs *InstancePtr); + +void XAdcPs_Reset(XAdcPs *InstancePtr); + +u16 XAdcPs_GetAdcData(XAdcPs *InstancePtr, u8 Channel); + +u16 XAdcPs_GetCalibCoefficient(XAdcPs *InstancePtr, u8 CoeffType); + +u16 XAdcPs_GetMinMaxMeasurement(XAdcPs *InstancePtr, u8 MeasurementType); + +void XAdcPs_SetAvg(XAdcPs *InstancePtr, u8 Average); +u8 XAdcPs_GetAvg(XAdcPs *InstancePtr); + +int XAdcPs_SetSingleChParams(XAdcPs *InstancePtr, + u8 Channel, + int IncreaseAcqCycles, + int IsEventMode, + int IsDifferentialMode); + + +void XAdcPs_SetAlarmEnables(XAdcPs *InstancePtr, u16 AlmEnableMask); +u16 XAdcPs_GetAlarmEnables(XAdcPs *InstancePtr); + +void XAdcPs_SetCalibEnables(XAdcPs *InstancePtr, u16 Calibration); +u16 XAdcPs_GetCalibEnables(XAdcPs *InstancePtr); + +void XAdcPs_SetSequencerMode(XAdcPs *InstancePtr, u8 SequencerMode); +u8 XAdcPs_GetSequencerMode(XAdcPs *InstancePtr); + +void XAdcPs_SetAdcClkDivisor(XAdcPs *InstancePtr, u8 Divisor); +u8 XAdcPs_GetAdcClkDivisor(XAdcPs *InstancePtr); + +int XAdcPs_SetSeqChEnables(XAdcPs *InstancePtr, u32 ChEnableMask); +u32 XAdcPs_GetSeqChEnables(XAdcPs *InstancePtr); + +int XAdcPs_SetSeqAvgEnables(XAdcPs *InstancePtr, u32 AvgEnableChMask); +u32 XAdcPs_GetSeqAvgEnables(XAdcPs *InstancePtr); + +int XAdcPs_SetSeqInputMode(XAdcPs *InstancePtr, u32 InputModeChMask); +u32 XAdcPs_GetSeqInputMode(XAdcPs *InstancePtr); + +int XAdcPs_SetSeqAcqTime(XAdcPs *InstancePtr, u32 AcqCyclesChMask); +u32 XAdcPs_GetSeqAcqTime(XAdcPs *InstancePtr); + +void XAdcPs_SetAlarmThreshold(XAdcPs *InstancePtr, u8 AlarmThrReg, u16 Value); +u16 XAdcPs_GetAlarmThreshold(XAdcPs *InstancePtr, u8 AlarmThrReg); + +void XAdcPs_EnableUserOverTemp(XAdcPs *InstancePtr); +void XAdcPs_DisableUserOverTemp(XAdcPs *InstancePtr); + +/** + * Functions in xadcps_selftest.c + */ +int XAdcPs_SelfTest(XAdcPs *InstancePtr); + +/** + * Functions in xadcps_intr.c + */ +void XAdcPs_IntrEnable(XAdcPs *InstancePtr, u32 Mask); +void XAdcPs_IntrDisable(XAdcPs *InstancePtr, u32 Mask); +u32 XAdcPs_IntrGetEnabled(XAdcPs *InstancePtr); + +u32 XAdcPs_IntrGetStatus(XAdcPs *InstancePtr); +void XAdcPs_IntrClear(XAdcPs *InstancePtr, u32 Mask); + + +#ifdef __cplusplus +} +#endif + +#endif /* End of protection macro. */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xadcps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xadcps_hw.h new file mode 100755 index 000000000..750542774 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xadcps_hw.h @@ -0,0 +1,506 @@ +/****************************************************************************** +* +* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps_hw.h +* +* This header file contains identifiers and basic driver functions (or +* macros) that can be used to access the XADC device through the Device +* Config Interface of the Zynq. +* +* +* Refer to the device specification for more information about this driver. +* +* @note None. +* +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a bss 12/22/11 First release based on the XPS/AXI xadc driver +* +* </pre> +* +*****************************************************************************/ +#ifndef XADCPS_HW_H /* Prevent circular inclusions */ +#define XADCPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions ****************************/ + + +/**@name Register offsets of XADC in the Device Config + * + * The following constants provide access to each of the registers of the + * XADC device. + * @{ + */ + +#define XADCPS_CFG_OFFSET 0x100 /**< Configuration Register */ +#define XADCPS_INT_STS_OFFSET 0x104 /**< Interrupt Status Register */ +#define XADCPS_INT_MASK_OFFSET 0x108 /**< Interrupt Mask Register */ +#define XADCPS_MSTS_OFFSET 0x10C /**< Misc status register */ +#define XADCPS_CMDFIFO_OFFSET 0x110 /**< Command FIFO Register */ +#define XADCPS_RDFIFO_OFFSET 0x114 /**< Read FIFO Register */ +#define XADCPS_MCTL_OFFSET 0x118 /**< Misc control register */ + +/* @} */ + + + + + +/** @name XADC Config Register Bit definitions + * @{ + */ +#define XADCPS_CFG_ENABLE_MASK 0x80000000 /**< Enable access from PS mask */ +#define XADCPS_CFG_CFIFOTH_MASK 0x00F00000 /**< Command FIFO Threshold mask */ +#define XADCPS_CFG_DFIFOTH_MASK 0x000F0000 /**< Data FIFO Threshold mask */ +#define XADCPS_CFG_WEDGE_MASK 0x00002000 /**< Write Edge Mask */ +#define XADCPS_CFG_REDGE_MASK 0x00001000 /**< Read Edge Mask */ +#define XADCPS_CFG_TCKRATE_MASK 0x00000300 /**< Clock freq control */ +#define XADCPS_CFG_IGAP_MASK 0x0000001F /**< Idle Gap between + * successive commands */ +/* @} */ + + +/** @name XADC Interrupt Status/Mask Register Bit definitions + * + * The definitions are same for the Interrupt Status Register and + * Interrupt Mask Register. They are defined only once. + * @{ + */ +#define XADCPS_INTX_ALL_MASK 0x000003FF /**< Alarm Signals Mask */ +#define XADCPS_INTX_CFIFO_LTH_MASK 0x00000200 /**< CMD FIFO less than threshold */ +#define XADCPS_INTX_DFIFO_GTH_MASK 0x00000100 /**< Data FIFO greater than threshold */ +#define XADCPS_INTX_OT_MASK 0x00000080 /**< Over temperature Alarm Status */ +#define XADCPS_INTX_ALM_ALL_MASK 0x0000007F /**< Alarm Signals Mask */ +#define XADCPS_INTX_ALM6_MASK 0x00000040 /**< Alarm 6 Mask */ +#define XADCPS_INTX_ALM5_MASK 0x00000020 /**< Alarm 5 Mask */ +#define XADCPS_INTX_ALM4_MASK 0x00000010 /**< Alarm 4 Mask */ +#define XADCPS_INTX_ALM3_MASK 0x00000008 /**< Alarm 3 Mask */ +#define XADCPS_INTX_ALM2_MASK 0x00000004 /**< Alarm 2 Mask */ +#define XADCPS_INTX_ALM1_MASK 0x00000002 /**< Alarm 1 Mask */ +#define XADCPS_INTX_ALM0_MASK 0x00000001 /**< Alarm 0 Mask */ + +/* @} */ + + +/** @name XADC Miscellaneous Register Bit definitions + * @{ + */ +#define XADCPS_MSTS_CFIFO_LVL_MASK 0x000F0000 /**< Command FIFO Level mask */ +#define XADCPS_MSTS_DFIFO_LVL_MASK 0x0000F000 /**< Data FIFO Level Mask */ +#define XADCPS_MSTS_CFIFOF_MASK 0x00000800 /**< Command FIFO Full Mask */ +#define XADCPS_MSTS_CFIFOE_MASK 0x00000400 /**< Command FIFO Empty Mask */ +#define XADCPS_MSTS_DFIFOF_MASK 0x00000200 /**< Data FIFO Full Mask */ +#define XADCPS_MSTS_DFIFOE_MASK 0x00000100 /**< Data FIFO Empty Mask */ +#define XADCPS_MSTS_OT_MASK 0x00000080 /**< Over Temperature Mask */ +#define XADCPS_MSTS_ALM_MASK 0x0000007F /**< Alarms Mask */ +/* @} */ + + +/** @name XADC Miscellaneous Control Register Bit definitions + * @{ + */ +#define XADCPS_MCTL_RESET_MASK 0x00000010 /**< Reset XADC */ +#define XADCPS_MCTL_FLUSH_MASK 0x00000001 /**< Flush the FIFOs */ +/* @} */ + + +/**@name Internal Register offsets of the XADC + * + * The following constants provide access to each of the internal registers of + * the XADC device. + * @{ + */ + +/* + * XADC Internal Channel Registers + */ +#define XADCPS_TEMP_OFFSET 0x00 /**< On-chip Temperature Reg */ +#define XADCPS_VCCINT_OFFSET 0x01 /**< On-chip VCCINT Data Reg */ +#define XADCPS_VCCAUX_OFFSET 0x02 /**< On-chip VCCAUX Data Reg */ +#define XADCPS_VPVN_OFFSET 0x03 /**< ADC out of VP/VN */ +#define XADCPS_VREFP_OFFSET 0x04 /**< On-chip VREFP Data Reg */ +#define XADCPS_VREFN_OFFSET 0x05 /**< On-chip VREFN Data Reg */ +#define XADCPS_VBRAM_OFFSET 0x06 /**< On-chip VBRAM , 7 Series */ +#define XADCPS_ADC_A_SUPPLY_CALIB_OFFSET 0x08 /**< ADC A Supply Offset Reg */ +#define XADCPS_ADC_A_OFFSET_CALIB_OFFSET 0x09 /**< ADC A Offset Data Reg */ +#define XADCPS_ADC_A_GAINERR_CALIB_OFFSET 0x0A /**< ADC A Gain Error Reg */ +#define XADCPS_VCCPINT_OFFSET 0x0D /**< On-chip VCCPINT Reg, Zynq */ +#define XADCPS_VCCPAUX_OFFSET 0x0E /**< On-chip VCCPAUX Reg, Zynq */ +#define XADCPS_VCCPDRO_OFFSET 0x0F /**< On-chip VCCPDRO Reg, Zynq */ + +/* + * XADC External Channel Registers + */ +#define XADCPS_AUX00_OFFSET 0x10 /**< ADC out of VAUXP0/VAUXN0 */ +#define XADCPS_AUX01_OFFSET 0x11 /**< ADC out of VAUXP1/VAUXN1 */ +#define XADCPS_AUX02_OFFSET 0x12 /**< ADC out of VAUXP2/VAUXN2 */ +#define XADCPS_AUX03_OFFSET 0x13 /**< ADC out of VAUXP3/VAUXN3 */ +#define XADCPS_AUX04_OFFSET 0x14 /**< ADC out of VAUXP4/VAUXN4 */ +#define XADCPS_AUX05_OFFSET 0x15 /**< ADC out of VAUXP5/VAUXN5 */ +#define XADCPS_AUX06_OFFSET 0x16 /**< ADC out of VAUXP6/VAUXN6 */ +#define XADCPS_AUX07_OFFSET 0x17 /**< ADC out of VAUXP7/VAUXN7 */ +#define XADCPS_AUX08_OFFSET 0x18 /**< ADC out of VAUXP8/VAUXN8 */ +#define XADCPS_AUX09_OFFSET 0x19 /**< ADC out of VAUXP9/VAUXN9 */ +#define XADCPS_AUX10_OFFSET 0x1A /**< ADC out of VAUXP10/VAUXN10 */ +#define XADCPS_AUX11_OFFSET 0x1B /**< ADC out of VAUXP11/VAUXN11 */ +#define XADCPS_AUX12_OFFSET 0x1C /**< ADC out of VAUXP12/VAUXN12 */ +#define XADCPS_AUX13_OFFSET 0x1D /**< ADC out of VAUXP13/VAUXN13 */ +#define XADCPS_AUX14_OFFSET 0x1E /**< ADC out of VAUXP14/VAUXN14 */ +#define XADCPS_AUX15_OFFSET 0x1F /**< ADC out of VAUXP15/VAUXN15 */ + +/* + * XADC Registers for Maximum/Minimum data captured for the + * on chip Temperature/VCCINT/VCCAUX data. + */ +#define XADCPS_MAX_TEMP_OFFSET 0x20 /**< Max Temperature Reg */ +#define XADCPS_MAX_VCCINT_OFFSET 0x21 /**< Max VCCINT Register */ +#define XADCPS_MAX_VCCAUX_OFFSET 0x22 /**< Max VCCAUX Register */ +#define XADCPS_MAX_VCCBRAM_OFFSET 0x23 /**< Max BRAM Register, 7 series */ +#define XADCPS_MIN_TEMP_OFFSET 0x24 /**< Min Temperature Reg */ +#define XADCPS_MIN_VCCINT_OFFSET 0x25 /**< Min VCCINT Register */ +#define XADCPS_MIN_VCCAUX_OFFSET 0x26 /**< Min VCCAUX Register */ +#define XADCPS_MIN_VCCBRAM_OFFSET 0x27 /**< Min BRAM Register, 7 series */ +#define XADCPS_MAX_VCCPINT_OFFSET 0x28 /**< Max VCCPINT Register, Zynq */ +#define XADCPS_MAX_VCCPAUX_OFFSET 0x29 /**< Max VCCPAUX Register, Zynq */ +#define XADCPS_MAX_VCCPDRO_OFFSET 0x2A /**< Max VCCPDRO Register, Zynq */ +#define XADCPS_MIN_VCCPINT_OFFSET 0x2C /**< Min VCCPINT Register, Zynq */ +#define XADCPS_MIN_VCCPAUX_OFFSET 0x2D /**< Min VCCPAUX Register, Zynq */ +#define XADCPS_MIN_VCCPDRO_OFFSET 0x2E /**< Min VCCPDRO Register,Zynq */ + /* Undefined 0x2F to 0x3E */ +#define XADCPS_FLAG_OFFSET 0x3F /**< Flag Register */ + +/* + * XADC Configuration Registers + */ +#define XADCPS_CFR0_OFFSET 0x40 /**< Configuration Register 0 */ +#define XADCPS_CFR1_OFFSET 0x41 /**< Configuration Register 1 */ +#define XADCPS_CFR2_OFFSET 0x42 /**< Configuration Register 2 */ + +/* Test Registers 0x43 to 0x47 */ + +/* + * XADC Sequence Registers + */ +#define XADCPS_SEQ00_OFFSET 0x48 /**< Seq Reg 00 Adc Channel Selection */ +#define XADCPS_SEQ01_OFFSET 0x49 /**< Seq Reg 01 Adc Channel Selection */ +#define XADCPS_SEQ02_OFFSET 0x4A /**< Seq Reg 02 Adc Average Enable */ +#define XADCPS_SEQ03_OFFSET 0x4B /**< Seq Reg 03 Adc Average Enable */ +#define XADCPS_SEQ04_OFFSET 0x4C /**< Seq Reg 04 Adc Input Mode Select */ +#define XADCPS_SEQ05_OFFSET 0x4D /**< Seq Reg 05 Adc Input Mode Select */ +#define XADCPS_SEQ06_OFFSET 0x4E /**< Seq Reg 06 Adc Acquisition Select */ +#define XADCPS_SEQ07_OFFSET 0x4F /**< Seq Reg 07 Adc Acquisition Select */ + +/* + * XADC Alarm Threshold/Limit Registers (ATR) + */ +#define XADCPS_ATR_TEMP_UPPER_OFFSET 0x50 /**< Temp Upper Alarm Register */ +#define XADCPS_ATR_VCCINT_UPPER_OFFSET 0x51 /**< VCCINT Upper Alarm Reg */ +#define XADCPS_ATR_VCCAUX_UPPER_OFFSET 0x52 /**< VCCAUX Upper Alarm Reg */ +#define XADCPS_ATR_OT_UPPER_OFFSET 0x53 /**< Over Temp Upper Alarm Reg */ +#define XADCPS_ATR_TEMP_LOWER_OFFSET 0x54 /**< Temp Lower Alarm Register */ +#define XADCPS_ATR_VCCINT_LOWER_OFFSET 0x55 /**< VCCINT Lower Alarm Reg */ +#define XADCPS_ATR_VCCAUX_LOWER_OFFSET 0x56 /**< VCCAUX Lower Alarm Reg */ +#define XADCPS_ATR_OT_LOWER_OFFSET 0x57 /**< Over Temp Lower Alarm Reg */ +#define XADCPS_ATR_VBRAM_UPPER_OFFSET 0x58 /**< VBRAM Upper Alarm, 7 series */ +#define XADCPS_ATR_VCCPINT_UPPER_OFFSET 0x59 /**< VCCPINT Upper Alarm, Zynq */ +#define XADCPS_ATR_VCCPAUX_UPPER_OFFSET 0x5A /**< VCCPAUX Upper Alarm, Zynq */ +#define XADCPS_ATR_VCCPDRO_UPPER_OFFSET 0x5B /**< VCCPDRO Upper Alarm, Zynq */ +#define XADCPS_ATR_VBRAM_LOWER_OFFSET 0x5C /**< VRBAM Lower Alarm, 7 Series */ +#define XADCPS_ATR_VCCPINT_LOWER_OFFSET 0x5D /**< VCCPINT Lower Alarm, Zynq */ +#define XADCPS_ATR_VCCPAUX_LOWER_OFFSET 0x5E /**< VCCPAUX Lower Alarm, Zynq */ +#define XADCPS_ATR_VCCPDRO_LOWER_OFFSET 0x5F /**< VCCPDRO Lower Alarm, Zynq */ + +/* Undefined 0x60 to 0x7F */ + +/*@}*/ + + + +/** + * @name Configuration Register 0 (CFR0) mask(s) + * @{ + */ +#define XADCPS_CFR0_CAL_AVG_MASK 0x8000 /**< Averaging enable Mask */ +#define XADCPS_CFR0_AVG_VALID_MASK 0x3000 /**< Averaging bit Mask */ +#define XADCPS_CFR0_AVG1_MASK 0x0000 /**< No Averaging */ +#define XADCPS_CFR0_AVG16_MASK 0x1000 /**< Average 16 samples */ +#define XADCPS_CFR0_AVG64_MASK 0x2000 /**< Average 64 samples */ +#define XADCPS_CFR0_AVG256_MASK 0x3000 /**< Average 256 samples */ +#define XADCPS_CFR0_AVG_SHIFT 12 /**< Averaging bits shift */ +#define XADCPS_CFR0_MUX_MASK 0x0800 /**< External Mask Enable */ +#define XADCPS_CFR0_DU_MASK 0x0400 /**< Bipolar/Unipolar mode */ +#define XADCPS_CFR0_EC_MASK 0x0200 /**< Event driven/ + * Continuous mode selection + */ +#define XADCPS_CFR0_ACQ_MASK 0x0100 /**< Add acquisition by 6 ADCCLK */ +#define XADCPS_CFR0_CHANNEL_MASK 0x001F /**< Channel number bit Mask */ + +/*@}*/ + +/** + * @name Configuration Register 1 (CFR1) mask(s) + * @{ + */ +#define XADCPS_CFR1_SEQ_VALID_MASK 0xF000 /**< Sequence bit Mask */ +#define XADCPS_CFR1_SEQ_SAFEMODE_MASK 0x0000 /**< Default Safe Mode */ +#define XADCPS_CFR1_SEQ_ONEPASS_MASK 0x1000 /**< Onepass through Seq */ +#define XADCPS_CFR1_SEQ_CONTINPASS_MASK 0x2000 /**< Continuous Cycling Seq */ +#define XADCPS_CFR1_SEQ_SINGCHAN_MASK 0x3000 /**< Single channel - No Seq */ +#define XADCPS_CFR1_SEQ_SIMUL_SAMPLING_MASK 0x4000 /**< Simulataneous Sampling Mask */ +#define XADCPS_CFR1_SEQ_INDEPENDENT_MASK 0x8000 /**< Independent Mode */ +#define XADCPS_CFR1_SEQ_SHIFT 12 /**< Sequence bit shift */ +#define XADCPS_CFR1_ALM_VCCPDRO_MASK 0x0800 /**< Alm 6 - VCCPDRO, Zynq */ +#define XADCPS_CFR1_ALM_VCCPAUX_MASK 0x0400 /**< Alm 5 - VCCPAUX, Zynq */ +#define XADCPS_CFR1_ALM_VCCPINT_MASK 0x0200 /**< Alm 4 - VCCPINT, Zynq */ +#define XADCPS_CFR1_ALM_VBRAM_MASK 0x0100 /**< Alm 3 - VBRAM, 7 series */ +#define XADCPS_CFR1_CAL_VALID_MASK 0x00F0 /**< Valid Calibration Mask */ +#define XADCPS_CFR1_CAL_PS_GAIN_OFFSET_MASK 0x0080 /**< Calibration 3 -Power + Supply Gain/Offset + Enable */ +#define XADCPS_CFR1_CAL_PS_OFFSET_MASK 0x0040 /**< Calibration 2 -Power + Supply Offset Enable */ +#define XADCPS_CFR1_CAL_ADC_GAIN_OFFSET_MASK 0x0020 /**< Calibration 1 -ADC Gain + Offset Enable */ +#define XADCPS_CFR1_CAL_ADC_OFFSET_MASK 0x0010 /**< Calibration 0 -ADC Offset + Enable */ +#define XADCPS_CFR1_CAL_DISABLE_MASK 0x0000 /**< No Calibration */ +#define XADCPS_CFR1_ALM_ALL_MASK 0x0F0F /**< Mask for all alarms */ +#define XADCPS_CFR1_ALM_VCCAUX_MASK 0x0008 /**< Alarm 2 - VCCAUX Enable */ +#define XADCPS_CFR1_ALM_VCCINT_MASK 0x0004 /**< Alarm 1 - VCCINT Enable */ +#define XADCPS_CFR1_ALM_TEMP_MASK 0x0002 /**< Alarm 0 - Temperature */ +#define XADCPS_CFR1_OT_MASK 0x0001 /**< Over Temperature Enable */ + +/*@}*/ + +/** + * @name Configuration Register 2 (CFR2) mask(s) + * @{ + */ +#define XADCPS_CFR2_CD_VALID_MASK 0xFF00 /**<Clock Divisor bit Mask */ +#define XADCPS_CFR2_CD_SHIFT 8 /**<Num of shift on division */ +#define XADCPS_CFR2_CD_MIN 8 /**<Minimum value of divisor */ +#define XADCPS_CFR2_CD_MAX 255 /**<Maximum value of divisor */ + +#define XADCPS_CFR2_CD_MIN 8 /**<Minimum value of divisor */ +#define XADCPS_CFR2_PD_MASK 0x0030 /**<Power Down Mask */ +#define XADCPS_CFR2_PD_XADC_MASK 0x0030 /**<Power Down XADC Mask */ +#define XADCPS_CFR2_PD_ADC1_MASK 0x0020 /**<Power Down ADC1 Mask */ +#define XADCPS_CFR2_PD_SHIFT 4 /**<Power Down Shift */ +/*@}*/ + +/** + * @name Sequence Register (SEQ) Bit Definitions + * @{ + */ +#define XADCPS_SEQ_CH_CALIB 0x00000001 /**< ADC Calibration Channel */ +#define XADCPS_SEQ_CH_VCCPINT 0x00000020 /**< VCCPINT, Zynq Only */ +#define XADCPS_SEQ_CH_VCCPAUX 0x00000040 /**< VCCPAUX, Zynq Only */ +#define XADCPS_SEQ_CH_VCCPDRO 0x00000080 /**< VCCPDRO, Zynq Only */ +#define XADCPS_SEQ_CH_TEMP 0x00000100 /**< On Chip Temperature Channel */ +#define XADCPS_SEQ_CH_VCCINT 0x00000200 /**< VCCINT Channel */ +#define XADCPS_SEQ_CH_VCCAUX 0x00000400 /**< VCCAUX Channel */ +#define XADCPS_SEQ_CH_VPVN 0x00000800 /**< VP/VN analog inputs Channel */ +#define XADCPS_SEQ_CH_VREFP 0x00001000 /**< VREFP Channel */ +#define XADCPS_SEQ_CH_VREFN 0x00002000 /**< VREFN Channel */ +#define XADCPS_SEQ_CH_VBRAM 0x00004000 /**< VBRAM Channel, 7 series */ +#define XADCPS_SEQ_CH_AUX00 0x00010000 /**< 1st Aux Channel */ +#define XADCPS_SEQ_CH_AUX01 0x00020000 /**< 2nd Aux Channel */ +#define XADCPS_SEQ_CH_AUX02 0x00040000 /**< 3rd Aux Channel */ +#define XADCPS_SEQ_CH_AUX03 0x00080000 /**< 4th Aux Channel */ +#define XADCPS_SEQ_CH_AUX04 0x00100000 /**< 5th Aux Channel */ +#define XADCPS_SEQ_CH_AUX05 0x00200000 /**< 6th Aux Channel */ +#define XADCPS_SEQ_CH_AUX06 0x00400000 /**< 7th Aux Channel */ +#define XADCPS_SEQ_CH_AUX07 0x00800000 /**< 8th Aux Channel */ +#define XADCPS_SEQ_CH_AUX08 0x01000000 /**< 9th Aux Channel */ +#define XADCPS_SEQ_CH_AUX09 0x02000000 /**< 10th Aux Channel */ +#define XADCPS_SEQ_CH_AUX10 0x04000000 /**< 11th Aux Channel */ +#define XADCPS_SEQ_CH_AUX11 0x08000000 /**< 12th Aux Channel */ +#define XADCPS_SEQ_CH_AUX12 0x10000000 /**< 13th Aux Channel */ +#define XADCPS_SEQ_CH_AUX13 0x20000000 /**< 14th Aux Channel */ +#define XADCPS_SEQ_CH_AUX14 0x40000000 /**< 15th Aux Channel */ +#define XADCPS_SEQ_CH_AUX15 0x80000000 /**< 16th Aux Channel */ + +#define XADCPS_SEQ00_CH_VALID_MASK 0x7FE1 /**< Mask for the valid channels */ +#define XADCPS_SEQ01_CH_VALID_MASK 0xFFFF /**< Mask for the valid channels */ + +#define XADCPS_SEQ02_CH_VALID_MASK 0x7FE0 /**< Mask for the valid channels */ +#define XADCPS_SEQ03_CH_VALID_MASK 0xFFFF /**< Mask for the valid channels */ + +#define XADCPS_SEQ04_CH_VALID_MASK 0x0800 /**< Mask for the valid channels */ +#define XADCPS_SEQ05_CH_VALID_MASK 0xFFFF /**< Mask for the valid channels */ + +#define XADCPS_SEQ06_CH_VALID_MASK 0x0800 /**< Mask for the valid channels */ +#define XADCPS_SEQ07_CH_VALID_MASK 0xFFFF /**< Mask for the valid channels */ + + +#define XADCPS_SEQ_CH_AUX_SHIFT 16 /**< Shift for the Aux Channel */ + +/*@}*/ + +/** + * @name OT Upper Alarm Threshold Register Bit Definitions + * @{ + */ + +#define XADCPS_ATR_OT_UPPER_ENB_MASK 0x000F /**< Mask for OT enable */ +#define XADCPS_ATR_OT_UPPER_VAL_MASK 0xFFF0 /**< Mask for OT value */ +#define XADCPS_ATR_OT_UPPER_VAL_SHIFT 4 /**< Shift for OT value */ +#define XADCPS_ATR_OT_UPPER_ENB_VAL 0x0003 /**< Value for OT enable */ +#define XADCPS_ATR_OT_UPPER_VAL_MAX 0x0FFF /**< Max OT value */ + +/*@}*/ + + +/** + * @name JTAG DRP Bit Definitions + * @{ + */ +#define XADCPS_JTAG_DATA_MASK 0x0000FFFF /**< Mask for the Data */ +#define XADCPS_JTAG_ADDR_MASK 0x03FF0000 /**< Mask for the Addr */ +#define XADCPS_JTAG_ADDR_SHIFT 16 /**< Shift for the Addr */ +#define XADCPS_JTAG_CMD_MASK 0x3C000000 /**< Mask for the Cmd */ +#define XADCPS_JTAG_CMD_WRITE_MASK 0x08000000 /**< Mask for CMD Write */ +#define XADCPS_JTAG_CMD_READ_MASK 0x04000000 /**< Mask for CMD Read */ +#define XADCPS_JTAG_CMD_SHIFT 26 /**< Shift for the Cmd */ + +/*@}*/ + +/** @name Unlock Register Definitions + * @{ + */ + #define XADCPS_UNLK_OFFSET 0x034 /**< Unlock Register */ + #define XADCPS_UNLK_VALUE 0x757BDF0D /**< Unlock Value */ + + /* @} */ + + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** +* +* Read a register of the XADC device. This macro provides register +* access to all registers using the register offsets defined above. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset is the offset of the register to read. +* +* @return The contents of the register. +* +* @note C-style Signature: +* u32 XAdcPs_ReadReg(u32 BaseAddress, u32 RegOffset); +* +******************************************************************************/ +#define XAdcPs_ReadReg(BaseAddress, RegOffset) \ + (Xil_In32((BaseAddress) + (RegOffset))) + +/*****************************************************************************/ +/** +* +* Write a register of the XADC device. This macro provides +* register access to all registers using the register offsets defined above. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset is the offset of the register to write. +* @param Data is the value to write to the register. +* +* @return None. +* +* @note C-style Signature: +* void XAdcPs_WriteReg(u32 BaseAddress, +* u32 RegOffset,u32 Data) +* +******************************************************************************/ +#define XAdcPs_WriteReg(BaseAddress, RegOffset, Data) \ + (Xil_Out32((BaseAddress) + (RegOffset), (Data))) + +/************************** Function Prototypes ******************************/ + + +/*****************************************************************************/ +/** +* +* Formats the data to be written to the the XADC registers. +* +* @param RegOffset is the offset of the Register +* @param Data is the data to be written to the Register if it is +* a write. +* @param ReadWrite specifies whether it is a Read or a Write. +* Use 0 for Read, 1 for Write. +* +* @return None. +* +* @note C-style Signature: +* void XAdcPs_FormatWriteData(u32 RegOffset, +* u16 Data, int ReadWrite) +* +******************************************************************************/ +#define XAdcPs_FormatWriteData(RegOffset, Data, ReadWrite) \ + ((ReadWrite ? XADCPS_JTAG_CMD_WRITE_MASK : XADCPS_JTAG_CMD_READ_MASK ) | \ + ((RegOffset << XADCPS_JTAG_ADDR_SHIFT) & XADCPS_JTAG_ADDR_MASK) | \ + (Data & XADCPS_JTAG_DATA_MASK)) + + + +#ifdef __cplusplus +} +#endif + +#endif /* End of protection macro. */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xbasic_types.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xbasic_types.h new file mode 100755 index 000000000..d5db3f7b0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xbasic_types.h @@ -0,0 +1,300 @@ +/* $Id: xbasic_types.h,v 1.19.10.4 2011/06/28 11:00:54 sadanan Exp $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2007 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xbasic_types.h +* +* This file contains basic types for Xilinx software IP. These types do not +* follow the standard naming convention with respect to using the component +* name in front of each name because they are considered to be primitives. +* +* @note +* +* This file contains items which are architecture dependent. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a rmm 12/14/01 First release +* rmm 05/09/03 Added "xassert always" macros to rid ourselves of diab +* compiler warnings +* 1.00a rpm 11/07/03 Added XNullHandler function as a stub interrupt handler +* 1.00a rpm 07/21/04 Added XExceptionHandler typedef for processor exceptions +* 1.00a xd 11/03/04 Improved support for doxygen. +* 1.00a wre 01/25/07 Added Linux style data types u32, u16, u8, TRUE, FALSE +* 1.00a rpm 04/02/07 Added ifndef KERNEL around u32, u16, u8 data types +* </pre> +* +******************************************************************************/ + +#ifndef XBASIC_TYPES_H /* prevent circular inclusions */ +#define XBASIC_TYPES_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +# define TRUE 1 +#endif + +#ifndef FALSE +# define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +/** Xilinx NULL, TRUE and FALSE legacy support. Deprecated. */ +#define XNULL NULL +#define XTRUE TRUE +#define XFALSE FALSE + + +#define XCOMPONENT_IS_READY 0x11111111 /**< component has been initialized */ +#define XCOMPONENT_IS_STARTED 0x22222222 /**< component has been started */ + +/* the following constants and declarations are for unit test purposes and are + * designed to be used in test applications. + */ +#define XTEST_PASSED 0 +#define XTEST_FAILED 1 + +#define XASSERT_NONE 0 +#define XASSERT_OCCURRED 1 + +extern unsigned int XAssertStatus; +extern void XAssert(char *, int); + +/**************************** Type Definitions *******************************/ + +/** @name Legacy types + * Deprecated legacy types. + * @{ + */ +typedef unsigned char Xuint8; /**< unsigned 8-bit */ +typedef char Xint8; /**< signed 8-bit */ +typedef unsigned short Xuint16; /**< unsigned 16-bit */ +typedef short Xint16; /**< signed 16-bit */ +typedef unsigned long Xuint32; /**< unsigned 32-bit */ +typedef long Xint32; /**< signed 32-bit */ +typedef float Xfloat32; /**< 32-bit floating point */ +typedef double Xfloat64; /**< 64-bit double precision FP */ +typedef unsigned long Xboolean; /**< boolean (XTRUE or XFALSE) */ + +#if !defined __XUINT64__ +typedef struct +{ + Xuint32 Upper; + Xuint32 Lower; +} Xuint64; +#endif + +/** @name New types + * New simple types. + * @{ + */ +#ifndef __KERNEL__ +#ifndef XIL_TYPES_H +typedef Xuint32 u32; +typedef Xuint16 u16; +typedef Xuint8 u8; +#endif +#else +#include <linux/types.h> +#endif + +/*@}*/ + +/** + * This data type defines an interrupt handler for a device. + * The argument points to the instance of the component + */ +typedef void (*XInterruptHandler) (void *InstancePtr); + +/** + * This data type defines an exception handler for a processor. + * The argument points to the instance of the component + */ +typedef void (*XExceptionHandler) (void *InstancePtr); + +/** + * This data type defines a callback to be invoked when an + * assert occurs. The callback is invoked only when asserts are enabled + */ +typedef void (*XAssertCallback) (char *FilenamePtr, int LineNumber); + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** +* Return the most significant half of the 64 bit data type. +* +* @param x is the 64 bit word. +* +* @return The upper 32 bits of the 64 bit word. +* +* @note None. +* +******************************************************************************/ +#define XUINT64_MSW(x) ((x).Upper) + +/*****************************************************************************/ +/** +* Return the least significant half of the 64 bit data type. +* +* @param x is the 64 bit word. +* +* @return The lower 32 bits of the 64 bit word. +* +* @note None. +* +******************************************************************************/ +#define XUINT64_LSW(x) ((x).Lower) + + +#ifndef NDEBUG + +/*****************************************************************************/ +/** +* This assert macro is to be used for functions that do not return anything +* (void). This in conjunction with the XWaitInAssert boolean can be used to +* accomodate tests so that asserts which fail allow execution to continue. +* +* @param expression is the expression to evaluate. If it evaluates to +* false, the assert occurs. +* +* @return Returns void unless the XWaitInAssert variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define XASSERT_VOID(expression) \ +{ \ + if (expression) \ + { \ + XAssertStatus = XASSERT_NONE; \ + } \ + else \ + { \ + XAssert(__FILE__, __LINE__); \ + XAssertStatus = XASSERT_OCCURRED; \ + return; \ + } \ +} + +/*****************************************************************************/ +/** +* This assert macro is to be used for functions that do return a value. This in +* conjunction with the XWaitInAssert boolean can be used to accomodate tests so +* that asserts which fail allow execution to continue. +* +* @param expression is the expression to evaluate. If it evaluates to false, +* the assert occurs. +* +* @return Returns 0 unless the XWaitInAssert variable is true, in which case +* no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define XASSERT_NONVOID(expression) \ +{ \ + if (expression) \ + { \ + XAssertStatus = XASSERT_NONE; \ + } \ + else \ + { \ + XAssert(__FILE__, __LINE__); \ + XAssertStatus = XASSERT_OCCURRED; \ + return 0; \ + } \ +} + +/*****************************************************************************/ +/** +* Always assert. This assert macro is to be used for functions that do not +* return anything (void). Use for instances where an assert should always +* occur. +* +* @return Returns void unless the XWaitInAssert variable is true, in which case +* no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define XASSERT_VOID_ALWAYS() \ +{ \ + XAssert(__FILE__, __LINE__); \ + XAssertStatus = XASSERT_OCCURRED; \ + return; \ +} + +/*****************************************************************************/ +/** +* Always assert. This assert macro is to be used for functions that do return +* a value. Use for instances where an assert should always occur. +* +* @return Returns void unless the XWaitInAssert variable is true, in which case +* no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define XASSERT_NONVOID_ALWAYS() \ +{ \ + XAssert(__FILE__, __LINE__); \ + XAssertStatus = XASSERT_OCCURRED; \ + return 0; \ +} + + +#else + +#define XASSERT_VOID(expression) +#define XASSERT_VOID_ALWAYS() +#define XASSERT_NONVOID(expression) +#define XASSERT_NONVOID_ALWAYS() +#endif + +/************************** Function Prototypes ******************************/ + +void XAssertSetCallback(XAssertCallback Routine); +void XNullHandler(void *NullParameter); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xcpu_cortexa9.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xcpu_cortexa9.h new file mode 100755 index 000000000..0933143a4 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xcpu_cortexa9.h @@ -0,0 +1,49 @@ +/* $Id: xcpu_cortexa9.h,v 1.1.2.1 2011/02/11 09:30:37 kkatna Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2011 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcpu_cortexa9.h +* +* dummy file +* +******************************************************************************/ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdebug.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdebug.h new file mode 100644 index 000000000..8ab5e212c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdebug.h @@ -0,0 +1,61 @@ +#ifndef XDEBUG +#define XDEBUG + +#undef DEBUG + +#if defined(DEBUG) && !defined(NDEBUG) + +#ifndef XDEBUG_WARNING +#define XDEBUG_WARNING +#warning DEBUG is enabled +#endif + +int printf(const char *format, ...); + +#define XDBG_DEBUG_ERROR 0x00000001 /* error condition messages */ +#define XDBG_DEBUG_GENERAL 0x00000002 /* general debug messages */ +#define XDBG_DEBUG_ALL 0xFFFFFFFF /* all debugging data */ + +#define XDBG_DEBUG_FIFO_REG 0x00000100 /* display register reads/writes */ +#define XDBG_DEBUG_FIFO_RX 0x00000101 /* receive debug messages */ +#define XDBG_DEBUG_FIFO_TX 0x00000102 /* transmit debug messages */ +#define XDBG_DEBUG_FIFO_ALL 0x0000010F /* all fifo debug messages */ + +#define XDBG_DEBUG_TEMAC_REG 0x00000400 /* display register reads/writes */ +#define XDBG_DEBUG_TEMAC_RX 0x00000401 /* receive debug messages */ +#define XDBG_DEBUG_TEMAC_TX 0x00000402 /* transmit debug messages */ +#define XDBG_DEBUG_TEMAC_ALL 0x0000040F /* all temac debug messages */ + +#define XDBG_DEBUG_TEMAC_ADPT_RX 0x00000800 /* receive debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_TX 0x00000801 /* transmit debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_IOCTL 0x00000802 /* ioctl debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_MISC 0x00000803 /* debug msg for other routines */ +#define XDBG_DEBUG_TEMAC_ADPT_ALL 0x0000080F /* all temac adapter debug messages */ + +#define xdbg_current_types (XDBG_DEBUG_ERROR) + +#define xdbg_stmnt(x) x + +/* In VxWorks, if _WRS_GNU_VAR_MACROS is defined, special syntax is needed for + * macros that accept variable number of arguments + */ +#if defined(XENV_VXWORKS) && defined(_WRS_GNU_VAR_MACROS) +#define xdbg_printf(type, args...) (((type) & xdbg_current_types) ? printf (## args) : 0) +#else /* ANSI Syntax */ +#define xdbg_printf(type, ...) (((type) & xdbg_current_types) ? printf (__VA_ARGS__) : 0) +#endif + +#else /* defined(DEBUG) && !defined(NDEBUG) */ + +#define xdbg_stmnt(x) + +/* See VxWorks comments above */ +#if defined(XENV_VXWORKS) && defined(_WRS_GNU_VAR_MACROS) +#define xdbg_printf(type, args...) +#else /* ANSI Syntax */ +#define xdbg_printf(...) +#endif + +#endif /* defined(DEBUG) && !defined(NDEBUG) */ + +#endif /* XDEBUG */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdevcfg.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdevcfg.h new file mode 100755 index 000000000..124838496 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdevcfg.h @@ -0,0 +1,385 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg.h +* +* The is the main header file for the Device Configuration Interface of the Zynq +* device. The device configuration interface has three main functionality. +* 1. AXI-PCAP +* 2. Security Policy +* 3. XADC +* This current version of the driver supports only the AXI-PCAP and Security +* Policy blocks. There is a separate driver for XADC. +* +* AXI-PCAP is used for download/upload an encrypted or decrypted bitstream. +* DMA embedded in the AXI PCAP provides the master interface to +* the Device configuration block for any DMA transfers. The data transfer can +* take place between the Tx/RxFIFOs of AXI-PCAP and memory (on chip +* RAM/DDR/peripheral memory). +* +* The current driver only supports the downloading the FPGA bitstream and +* readback of the decrypted image (sort of loopback). +* The driver does not know what information needs to be written to the FPGA to +* readback FPGA configuration register or memory data. The application above the +* driver should take care of creating the data that needs to be downloaded to +* the FPGA so that the bitstream can be readback. +* This driver also does not support the reading of the internal registers of the +* PCAP. The driver has no knowledge of the PCAP internals. +* +* <b> Initialization and Configuration </b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate with the Device Configuration device. +* +* XDcfg_CfgInitialize() API is used to initialize the Device Configuration +* Interface. The user needs to first call the XDcfg_LookupConfig() API which +* returns the Configuration structure pointer which is passed as a parameter to +* the XDcfg_CfgInitialize() API. +* +* <b>Interrupts</b> +* The Driver implements an interrupt handler to support the interrupts provided +* by this interface. +* +* <b> Threads </b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* <b> Asserts </b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* <b> Building the driver </b> +* +* The XDcfg driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* +* <br><br> +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a hvm 02/07/11 First release +* 2.00a nm 05/31/12 Updated the driver for CR 660835 so that input length for +* source/destination to the XDcfg_InitiateDma, XDcfg_Transfer +* APIs is words (32 bit) and not bytes. +* Updated the notes for XDcfg_InitiateDma/XDcfg_Transfer APIs +* to add information that 2 LSBs of the Source/Destination +* address when equal to 2’b01 indicate the last DMA command +* of an overall transfer. +* Destination Address passed to this API for secure transfers +* instead of using 0xFFFFFFFF for CR 662197. This issue was +* resulting in the failure of secure transfers of +* non-bitstream images. +* 2.01a nm 07/07/12 Updated the XDcfg_IntrClear function to directly +* set the mask instead of oring it with the +* value read from the interrupt status register +* Added defines for the PS Version bits, +* removed the FIFO Flush bits from the +* Miscellaneous Control Reg. +* Added XDcfg_GetPsVersion, XDcfg_SelectIcapInterface +* and XDcfg_SelectPcapInterface APIs for CR 643295 +* The user has to call the XDcfg_SelectIcapInterface API +* for the PL reconfiguration using AXI HwIcap. +* Updated the XDcfg_Transfer API to clear the +* QUARTER_PCAP_RATE_EN bit in the control register for +* non secure writes for CR 675543. +* 2.02a nm 01/31/13 Fixed CR# 679335. +* Added Setting and Clearing the internal PCAP loopback. +* Removed code for enabling/disabling AES engine as BootROM +* locks down this setting. +* Fixed CR# 681976. +* Skip Checking the PCFG_INIT in case of non-secure DMA +* loopback. +* Fixed CR# 699558. +* XDcfg_Transfer fails to transfer data in loopback mode. +* Fixed CR# 701348. +* Peripheral test fails with Running +* DcfgSelfTestExample() in SECURE bootmode. +* 2.03a nm 04/19/13 Fixed CR# 703728. +* Updated the register definitions as per the latest TRM +* version UG585 (v1.4) November 16, 2012. +* </pre> +* +******************************************************************************/ +#ifndef XDCFG_H /* prevent circular inclusions */ +#define XDCFG_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xdevcfg_hw.h" +#include "xstatus.h" +#include "xil_assert.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/* Types of PCAP transfers */ + +#define XDCFG_NON_SECURE_PCAP_WRITE 1 +#define XDCFG_SECURE_PCAP_WRITE 2 +#define XDCFG_PCAP_READBACK 3 +#define XDCFG_CONCURRENT_SECURE_READ_WRITE 4 +#define XDCFG_CONCURRENT_NONSEC_READ_WRITE 5 + + +/**************************** Type Definitions *******************************/ +/** +* The handler data type allows the user to define a callback function to +* respond to interrupt events in the system. This function is executed +* in interrupt context, so amount of processing should be minimized. +* +* @param CallBackRef is the callback reference passed in by the upper +* layer when setting the callback functions, and passed back to +* the upper layer when the callback is invoked. Its type is +* unimportant to the driver component, so it is a void pointer. +* @param Status is the Interrupt status of the XDcfg device. +*/ +typedef void (*XDcfg_IntrHandler) (void *CallBackRef, u32 Status); + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Base address of the device */ +} XDcfg_Config; + +/** + * The XDcfg driver instance data. + */ +typedef struct { + XDcfg_Config Config; /**< Hardware Configuration */ + u32 IsReady; /**< Device is initialized and ready */ + u32 IsStarted; /**< Device Configuration Interface + * is running + */ + XDcfg_IntrHandler StatusHandler; /* Event handler function */ + void *CallBackRef; /* Callback reference for event handler */ +} XDcfg; + +/****************************************************************************/ +/** +* +* Unlock the Device Config Interface block. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return None. +* +* @note C-style signature: +* void XDcfg_Unlock(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_Unlock(InstancePtr) \ + XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, \ + XDCFG_UNLOCK_OFFSET, XDCFG_UNLOCK_DATA) + + + +/****************************************************************************/ +/** +* +* Get the version number of the PS from the Miscellaneous Control Register. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return Version of the PS. +* +* @note C-style signature: +* void XDcfg_GetPsVersion(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_GetPsVersion(InstancePtr) \ + ((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, \ + XDCFG_MCTRL_OFFSET)) & \ + XDCFG_MCTRL_PCAP_PS_VERSION_MASK) >> \ + XDCFG_MCTRL_PCAP_PS_VERSION_SHIFT + + + +/****************************************************************************/ +/** +* +* Read the multiboot config register value. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return None. +* +* @note C-style signature: +* u32 XDcfg_ReadMultiBootConfig(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_ReadMultiBootConfig(InstancePtr) \ + XDcfg_ReadReg((InstancePtr)->Config.BaseAddr + \ + XDCFG_MULTIBOOT_ADDR_OFFSET) + + +/****************************************************************************/ +/** +* +* Selects ICAP interface for reconfiguration after the initial configuration +* of the PL. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return None. +* +* @note C-style signature: +* void XDcfg_SelectIcapInterface(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_SelectIcapInterface(InstancePtr) \ + XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET, \ + ((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET)) \ + & ( ~XDCFG_CTRL_PCAP_PR_MASK))) + +/****************************************************************************/ +/** +* +* Selects PCAP interface for reconfiguration after the initial configuration +* of the PL. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return None. +* +* @note C-style signature: +* void XDcfg_SelectPcapInterface(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_SelectPcapInterface(InstancePtr) \ + XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET, \ + ((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET)) \ + | XDCFG_CTRL_PCAP_PR_MASK)) + + + +/************************** Function Prototypes ******************************/ + +/* + * Lookup configuration in xdevcfg_sinit.c. + */ +XDcfg_Config *XDcfg_LookupConfig(u16 DeviceId); + +/* + * Selftest function in xdevcfg_selftest.c + */ +int XDcfg_SelfTest(XDcfg *InstancePtr); + +/* + * Interface functions in xdevcfg.c + */ +int XDcfg_CfgInitialize(XDcfg *InstancePtr, + XDcfg_Config *ConfigPtr, u32 EffectiveAddress); + +void XDcfg_EnablePCAP(XDcfg *InstancePtr); + +void XDcfg_DisablePCAP(XDcfg *InstancePtr); + +void XDcfg_SetControlRegister(XDcfg *InstancePtr, u32 Mask); + +u32 XDcfg_GetControlRegister(XDcfg *InstancePtr); + +void XDcfg_SetLockRegister(XDcfg *InstancePtr, u32 Data); + +u32 XDcfg_GetLockRegister(XDcfg *InstancePtr); + +void XDcfg_SetConfigRegister(XDcfg *InstancePtr, u32 Data); + +u32 XDcfg_GetConfigRegister(XDcfg *InstancePtr); + +void XDcfg_SetStatusRegister(XDcfg *InstancePtr, u32 Data); + +u32 XDcfg_GetStatusRegister(XDcfg *InstancePtr); + +void XDcfg_SetRomShadowRegister(XDcfg *InstancePtr, u32 Data); + +u32 XDcfg_GetSoftwareIdRegister(XDcfg *InstancePtr); + +void XDcfg_SetMiscControlRegister(XDcfg *InstancePtr, u32 Mask); + +u32 XDcfg_GetMiscControlRegister(XDcfg *InstancePtr); + +u32 XDcfg_IsDmaBusy(XDcfg *InstancePtr); + +void XDcfg_InitiateDma(XDcfg *InstancePtr, u32 SourcePtr, u32 DestPtr, + u32 SrcWordLength, u32 DestWordLength); + +u32 XDcfg_Transfer(XDcfg *InstancePtr, + void *SourcePtr, u32 SrcWordLength, + void *DestPtr, u32 DestWordLength, + u32 TransferType); + +/* + * Interrupt related function prototypes implemented in xdevcfg_intr.c + */ +void XDcfg_IntrEnable(XDcfg *InstancePtr, u32 Mask); + +void XDcfg_IntrDisable(XDcfg *InstancePtr, u32 Mask); + +u32 XDcfg_IntrGetEnabled(XDcfg *InstancePtr); + +u32 XDcfg_IntrGetStatus(XDcfg *InstancePtr); + +void XDcfg_IntrClear(XDcfg *InstancePtr, u32 Mask); + +void XDcfg_InterruptHandler(XDcfg *InstancePtr); + +void XDcfg_SetHandler(XDcfg *InstancePtr, void *CallBackFunc, + void *CallBackRef); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdevcfg_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdevcfg_hw.h new file mode 100755 index 000000000..ccac60abb --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdevcfg_hw.h @@ -0,0 +1,400 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_hw.h +* +* This file contains the hardware interface to the Device Config Interface. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a hvm 02/07/11 First release +* 2.01a nm 08/01/12 Added defines for the PS Version bits, +* removed the FIFO Flush bits from the +* Miscellaneous Control Reg +* 2.03a nm 04/19/13 Fixed CR# 703728. +* Updated the register definitions as per the latest TRM +* version UG585 (v1.4) November 16, 2012. +* 2.04a kpc 10/07/13 Added function prototype. +* </pre> +* +******************************************************************************/ +#ifndef XDCFG_HW_H /* prevent circular inclusions */ +#define XDCFG_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * Offsets of registers from the start of the device + * @{ + */ + +#define XDCFG_CTRL_OFFSET 0x00 /**< Control Register */ +#define XDCFG_LOCK_OFFSET 0x04 /**< Lock Register */ +#define XDCFG_CFG_OFFSET 0x08 /**< Configuration Register */ +#define XDCFG_INT_STS_OFFSET 0x0C /**< Interrupt Status Register */ +#define XDCFG_INT_MASK_OFFSET 0x10 /**< Interrupt Mask Register */ +#define XDCFG_STATUS_OFFSET 0x14 /**< Status Register */ +#define XDCFG_DMA_SRC_ADDR_OFFSET 0x18 /**< DMA Source Address Register */ +#define XDCFG_DMA_DEST_ADDR_OFFSET 0x1C /**< DMA Destination Address Reg */ +#define XDCFG_DMA_SRC_LEN_OFFSET 0x20 /**< DMA Source Transfer Length */ +#define XDCFG_DMA_DEST_LEN_OFFSET 0x24 /**< DMA Destination Transfer */ +#define XDCFG_ROM_SHADOW_OFFSET 0x28 /**< DMA ROM Shadow Register */ +#define XDCFG_MULTIBOOT_ADDR_OFFSET 0x2C /**< Multi BootAddress Pointer */ +#define XDCFG_SW_ID_OFFSET 0x30 /**< Software ID Register */ +#define XDCFG_UNLOCK_OFFSET 0x34 /**< Unlock Register */ +#define XDCFG_MCTRL_OFFSET 0x80 /**< Miscellaneous Control Reg */ + +/* @} */ + +/** @name Control Register Bit definitions + * @{ + */ + +#define XDCFG_CTRL_FORCE_RST_MASK 0x80000000 /**< Force into + * Secure Reset + */ +#define XDCFG_CTRL_PCFG_PROG_B_MASK 0x40000000 /**< Program signal to + * Reset FPGA + */ +#define XDCFG_CTRL_PCFG_POR_CNT_4K_MASK 0x20000000 /**< Control PL POR timer */ +#define XDCFG_CTRL_PCAP_PR_MASK 0x08000000 /**< Enable PCAP for PR */ +#define XDCFG_CTRL_PCAP_MODE_MASK 0x04000000 /**< Enable PCAP */ +#define XDCFG_CTRL_PCAP_RATE_EN_MASK 0x02000000 /**< Enable PCAP send data + * to FPGA every 4 PCAP + * cycles + */ +#define XDCFG_CTRL_MULTIBOOT_EN_MASK 0x01000000 /**< Multiboot Enable */ +#define XDCFG_CTRL_JTAG_CHAIN_DIS_MASK 0x00800000 /**< JTAG Chain Disable */ +#define XDCFG_CTRL_USER_MODE_MASK 0x00008000 /**< User Mode Mask */ +#define XDCFG_CTRL_PCFG_AES_FUSE_MASK 0x00001000 /**< AES key source */ +#define XDCFG_CTRL_PCFG_AES_EN_MASK 0x00000E00 /**< AES Enable Mask */ +#define XDCFG_CTRL_SEU_EN_MASK 0x00000100 /**< SEU Enable Mask */ +#define XDCFG_CTRL_SEC_EN_MASK 0x00000080 /**< Secure/Non Secure + * Status mask + */ +#define XDCFG_CTRL_SPNIDEN_MASK 0x00000040 /**< Secure Non Invasive + * Debug Enable + */ +#define XDCFG_CTRL_SPIDEN_MASK 0x00000020 /**< Secure Invasive + * Debug Enable + */ +#define XDCFG_CTRL_NIDEN_MASK 0x00000010 /**< Non-Invasive Debug + * Enable + */ +#define XDCFG_CTRL_DBGEN_MASK 0x00000008 /**< Invasive Debug + * Enable + */ +#define XDCFG_CTRL_DAP_EN_MASK 0x00000007 /**< DAP Enable Mask */ + +/* @} */ + +/** @name Lock register bit definitions + * @{ + */ + +#define XDCFG_LOCK_AES_EFUSE_MASK 0x00000010 /**< Lock AES Efuse bit */ +#define XDCFG_LOCK_AES_EN_MASK 0x00000008 /**< Lock AES_EN update */ +#define XDCFG_LOCK_SEU_MASK 0x00000004 /**< Lock SEU_En update */ +#define XDCFG_LOCK_SEC_MASK 0x00000002 /**< Lock SEC_EN and + * USER_MODE + */ +#define XDCFG_LOCK_DBG_MASK 0x00000001 /**< This bit locks + * security config + * including: DAP_En, + * DBGEN,, + * NIDEN, SPNIEN + */ +/*@}*/ + + + +/** @name Config Register Bit definitions + * @{ + */ +#define XDCFG_CFG_RFIFO_TH_MASK 0x00000C00 /**< Read FIFO + * Threshold Mask + */ +#define XDCFG_CFG_WFIFO_TH_MASK 0x00000300 /**< Write FIFO Threshold + * Mask + */ +#define XDCFG_CFG_RCLK_EDGE_MASK 0x00000080 /**< Read data active + * clock edge + */ +#define XDCFG_CFG_WCLK_EDGE_MASK 0x00000040 /**< Write data active + * clock edge + */ +#define XDCFG_CFG_DISABLE_SRC_INC_MASK 0x00000020 /**< Disable Source address + * increment mask + */ +#define XDCFG_CFG_DISABLE_DST_INC_MASK 0x00000010 /**< Disable Destination + * address increment + * mask + */ +/* @} */ + + +/** @name Interrupt Status/Mask Register Bit definitions + * @{ + */ +#define XDCFG_IXR_PSS_GTS_USR_B_MASK 0x80000000 /**< Tri-state IO during + * HIZ + */ +#define XDCFG_IXR_PSS_FST_CFG_B_MASK 0x40000000 /**< First configuration + * done + */ +#define XDCFG_IXR_PSS_GPWRDWN_B_MASK 0x20000000 /**< Global power down */ +#define XDCFG_IXR_PSS_GTS_CFG_B_MASK 0x10000000 /**< Tri-state IO during + * configuration + */ +#define XDCFG_IXR_PSS_CFG_RESET_B_MASK 0x08000000 /**< PL configuration + * reset + */ +#define XDCFG_IXR_AXI_WTO_MASK 0x00800000 /**< AXI Write Address + * or Data or response + * timeout + */ +#define XDCFG_IXR_AXI_WERR_MASK 0x00400000 /**< AXI Write response + * error + */ +#define XDCFG_IXR_AXI_RTO_MASK 0x00200000 /**< AXI Read Address or + * response timeout + */ +#define XDCFG_IXR_AXI_RERR_MASK 0x00100000 /**< AXI Read response + * error + */ +#define XDCFG_IXR_RX_FIFO_OV_MASK 0x00040000 /**< Rx FIFO Overflow */ +#define XDCFG_IXR_WR_FIFO_LVL_MASK 0x00020000 /**< Tx FIFO less than + * threshold */ +#define XDCFG_IXR_RD_FIFO_LVL_MASK 0x00010000 /**< Rx FIFO greater than + * threshold */ +#define XDCFG_IXR_DMA_CMD_ERR_MASK 0x00008000 /**< Illegal DMA command */ +#define XDCFG_IXR_DMA_Q_OV_MASK 0x00004000 /**< DMA command queue + * overflow + */ +#define XDCFG_IXR_DMA_DONE_MASK 0x00002000 /**< DMA Command Done */ +#define XDCFG_IXR_D_P_DONE_MASK 0x00001000 /**< DMA and PCAP + * transfers Done + */ +#define XDCFG_IXR_P2D_LEN_ERR_MASK 0x00000800 /**< PCAP to DMA transfer + * length error + */ +#define XDCFG_IXR_PCFG_HMAC_ERR_MASK 0x00000040 /**< HMAC error mask */ +#define XDCFG_IXR_PCFG_SEU_ERR_MASK 0x00000020 /**< SEU Error mask */ +#define XDCFG_IXR_PCFG_POR_B_MASK 0x00000010 /**< FPGA POR mask */ +#define XDCFG_IXR_PCFG_CFG_RST_MASK 0x00000008 /**< FPGA Reset mask */ +#define XDCFG_IXR_PCFG_DONE_MASK 0x00000004 /**< Done Signal Mask */ +#define XDCFG_IXR_PCFG_INIT_PE_MASK 0x00000002 /**< Detect Positive edge + * of Init Signal + */ +#define XDCFG_IXR_PCFG_INIT_NE_MASK 0x00000001 /**< Detect Negative edge + * of Init Signal + */ +#define XDCFG_IXR_ERROR_FLAGS_MASK (XDCFG_IXR_AXI_WTO_MASK | \ + XDCFG_IXR_AXI_WERR_MASK | \ + XDCFG_IXR_AXI_RTO_MASK | \ + XDCFG_IXR_AXI_RERR_MASK | \ + XDCFG_IXR_RX_FIFO_OV_MASK | \ + XDCFG_IXR_DMA_CMD_ERR_MASK |\ + XDCFG_IXR_DMA_Q_OV_MASK | \ + XDCFG_IXR_P2D_LEN_ERR_MASK |\ + XDCFG_IXR_PCFG_HMAC_ERR_MASK) + + +#define XDCFG_IXR_ALL_MASK 0x00F7F8EF + + + +/* @} */ + + +/** @name Status Register Bit definitions + * @{ + */ +#define XDCFG_STATUS_DMA_CMD_Q_F_MASK 0x80000000 /**< DMA command + * Queue full + */ +#define XDCFG_STATUS_DMA_CMD_Q_E_MASK 0x40000000 /**< DMA command + * Queue empty + */ +#define XDCFG_STATUS_DMA_DONE_CNT_MASK 0x30000000 /**< Number of + * completed DMA + * transfers + */ +#define XDCFG_STATUS_RX_FIFO_LVL_MASK 0x01F000000 /**< Rx FIFO level */ +#define XDCFG_STATUS_TX_FIFO_LVL_MASK 0x0007F000 /**< Tx FIFO level */ + +#define XDCFG_STATUS_PSS_GTS_USR_B 0x00000800 /**< Tri-state IO + * during HIZ + */ +#define XDCFG_STATUS_PSS_FST_CFG_B 0x00000400 /**< First PL config + * done + */ +#define XDCFG_STATUS_PSS_GPWRDWN_B 0x00000200 /**< Global power down */ +#define XDCFG_STATUS_PSS_GTS_CFG_B 0x00000100 /**< Tri-state IO during + * config + */ +#define XDCFG_STATUS_SECURE_RST_MASK 0x00000080 /**< Secure Reset + * POR Status + */ +#define XDCFG_STATUS_ILLEGAL_APB_ACCESS_MASK 0x00000040 /**< Illegal APB + * access + */ +#define XDCFG_STATUS_PSS_CFG_RESET_B 0x00000020 /**< PL config + * reset status + */ +#define XDCFG_STATUS_PCFG_INIT_MASK 0x00000010 /**< FPGA Init + * Status + */ +#define XDCFG_STATUS_EFUSE_BBRAM_KEY_DISABLE_MASK 0x00000008 + /**< BBRAM key + * disable + */ +#define XDCFG_STATUS_EFUSE_SEC_EN_MASK 0x00000004 /**< Efuse Security + * Enable Status + */ +#define XDCFG_STATUS_EFUSE_JTAG_DIS_MASK 0x00000002 /**< EFuse JTAG + * Disable + * status + */ +/* @} */ + + +/** @name DMA Source/Destination Transfer Length Register Bit definitions + * @{ + */ +#define XDCFG_DMA_LEN_MASK 0x7FFFFFF /**< Length Mask */ +/*@}*/ + + + + +/** @name Miscellaneous Control Register Bit definitions + * @{ + */ +#define XDCFG_MCTRL_PCAP_PS_VERSION_MASK 0xF0000000 /**< PS Version Mask */ +#define XDCFG_MCTRL_PCAP_PS_VERSION_SHIFT 28 /**< PS Version Shift */ +#define XDCFG_MCTRL_PCAP_LPBK_MASK 0x00000010 /**< PCAP loopback mask */ +/* @} */ + +/** @name FIFO Threshold Bit definitions + * @{ + */ + +#define XDCFG_CFG_FIFO_QUARTER 0x0 /**< Quarter empty */ +#define XDCFG_CFG_FIFO_HALF 0x1 /**< Half empty */ +#define XDCFG_CFG_FIFO_3QUARTER 0x2 /**< 3/4 empty */ +#define XDCFG_CFG_FIFO_EMPTY 0x4 /**< Empty */ +/* @}*/ + + +/* Miscellaneous constant values */ +#define XDCFG_DMA_INVALID_ADDRESS 0xFFFFFFFF /**< Invalid DMA address */ +#define XDCFG_UNLOCK_DATA 0x757BDF0D /**< First APB access data*/ +#define XDCFG_BASE_ADDRESS 0xFE007000 /**< Device Config base + * address + */ +#define XDCFG_CONFIG_RESET_VALUE 0x508 /**< Config reg reset value */ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Read the given register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note C-style signature: +* u32 XDcfg_ReadReg(u32 BaseAddr, u32 RegOffset) +* +*****************************************************************************/ +#define XDcfg_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (RegOffset)) + +/****************************************************************************/ +/** +* +* Write to the given register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note C-style signature: +* void XDcfg_WriteReg(u32 BaseAddr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XDcfg_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (RegOffset), (Data)) + +/************************** Function Prototypes ******************************/ +/* + * Perform reset operation to the devcfg interface + */ +void XDcfg_ResetHw(u32 BaseAddr); +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdmaps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdmaps.h new file mode 100755 index 000000000..f44608a07 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdmaps.h @@ -0,0 +1,317 @@ +/***************************************************************************** +* +* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps.h +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00 hbm 08/19/10 First Release +* 1.01a nm 12/20/12 Added definition XDMAPS_CHANNELS_PER_DEV which specifies +* the maximum number of channels. +* Replaced the usage of XPAR_XDMAPS_CHANNELS_PER_DEV +* with XDMAPS_CHANNELS_PER_DEV defined in xdmaps_hw.h. +* Added the tcl file to automatically generate the +* xparameters.h +* 1.02a sg 05/16/12 Made changes for doxygen and moved some function +* header from the xdmaps.h file to xdmaps.c file +* Other cleanup for coding guidelines and CR 657109 +* and CR 657898 +* The xdmaps_example_no_intr.c example is removed +* as it is using interrupts and is similar to +* the interrupt example - CR 652477 +* 1.03a sg 07/16/2012 changed inline to __inline for CR665681 +* 1.04a nm 10/22/2012 Fixed CR# 681671. +* 1.05a nm 04/15/2013 Fixed CR# 704396. Removed warnings when compiled +* with -Wall and -Wextra option in bsp. +* 05/01/2013 Fixed CR# 700189. Changed XDmaPs_BuildDmaProg() +* function description. +* Fixed CR# 704396. Removed unused variables +* UseM2MByte & MemBurstLen from XDmaPs_BuildDmaProg() +* function. +* </pre> +* +*****************************************************************************/ + +#ifndef XDMAPS_H /* prevent circular inclusions */ +#define XDMAPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xparameters.h" +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" + +#include "xdmaps_hw.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Base address of device (IPIF) */ +} XDmaPs_Config; + + +/** DMA channle control structure. It's for AXI bus transaction. + * This struct will be translated into a 32-bit channel control register value. + */ +typedef struct { + unsigned int EndianSwapSize; /**< Endian swap size. */ + unsigned int DstCacheCtrl; /**< Destination cache control */ + unsigned int DstProtCtrl; /**< Destination protection control */ + unsigned int DstBurstLen; /**< Destination burst length */ + unsigned int DstBurstSize; /**< Destination burst size */ + unsigned int DstInc; /**< Destination incrementing or fixed + * address */ + unsigned int SrcCacheCtrl; /**< Source cache control */ + unsigned int SrcProtCtrl; /**< Source protection control */ + unsigned int SrcBurstLen; /**< Source burst length */ + unsigned int SrcBurstSize; /**< Source burst size */ + unsigned int SrcInc; /**< Source incrementing or fixed + * address */ +} XDmaPs_ChanCtrl; + +/** DMA block descriptor stucture. + */ +typedef struct { + u32 SrcAddr; /**< Source starting address */ + u32 DstAddr; /**< Destination starting address */ + unsigned int Length; /**< Number of bytes for the block */ +} XDmaPs_BD; + +/** + * A DMA command consisits of a channel control struct, a block descriptor, + * a user defined program, a pointer pointing to generated DMA program, and + * execution result. + * + */ +typedef struct { + XDmaPs_ChanCtrl ChanCtrl; /**< Channel Control Struct */ + XDmaPs_BD BD; /**< Together with SgLength field, + * it's a scatter-gather list. + */ + void *UserDmaProg; /**< If user wants the driver to + * execute their own DMA program, + * this field points to the DMA + * program. + */ + int UserDmaProgLength; /**< The length of user defined + * DMA program. + */ + + void *GeneratedDmaProg; /**< The DMA program genreated + * by the driver. This field will be + * set if a user invokes the DMA + * program generation function. Or + * the DMA command is finished and + * a user informs the driver not to + * release the program buffer. + * This field has two purposes, one + * is to ask the driver to generate + * a DMA program while the DMAC is + * performaning DMA transactions. The + * other purpose is to debug the + * driver. + */ + int GeneratedDmaProgLength; /**< The length of the DMA program + * generated by the driver + */ + int DmaStatus; /**< 0 on success, otherwise error code + */ + u32 ChanFaultType; /**< Channel fault type in case of fault + */ + u32 ChanFaultPCAddr; /**< Channel fault PC address + */ +} XDmaPs_Cmd; + +/** + * It's the done handler a user can set for a channel + */ +typedef void (*XDmaPsDoneHandler) (unsigned int Channel, + XDmaPs_Cmd *DmaCmd, + void *CallbackRef); + +/** + * It's the fault handler a user can set for a channel + */ +typedef void (*XDmaPsFaultHandler) (unsigned int Channel, + XDmaPs_Cmd *DmaCmd, + void *CallbackRef); + +#define XDMAPS_MAX_CHAN_BUFS 2 +#define XDMAPS_CHAN_BUF_LEN 128 + +/** + * The XDmaPs_ProgBuf is the struct for a DMA program buffer. + */ +typedef struct { + char Buf[XDMAPS_CHAN_BUF_LEN]; /**< The actual buffer the holds the + * content */ + unsigned Len; /**< The actual length of the DMA + * program in bytes. */ + int Allocated; /**< A tag indicating whether the + * buffer is allocated or not */ +} XDmaPs_ProgBuf; + +/** + * The XDmaPs_ChannelData is a struct to book keep individual channel of + * the DMAC. + */ +typedef struct { + unsigned DevId; /**< Device id indicating which DMAC */ + unsigned ChanId; /**< Channel number of the DMAC */ + XDmaPs_ProgBuf ProgBufPool[XDMAPS_MAX_CHAN_BUFS]; /**< A pool of + program buffers*/ + XDmaPsDoneHandler DoneHandler; /**< Done interrupt handler */ + void *DoneRef; /**< Done interrupt callback data */ + XDmaPs_Cmd *DmaCmdToHw; /**< DMA command being executed */ + XDmaPs_Cmd *DmaCmdFromHw; /**< DMA command that is finished. + * This field is for debugging purpose + */ + int HoldDmaProg; /**< A tag indicating whether to hold the + * DMA program after the DMA is done. + */ + +} XDmaPs_ChannelData; + +/** + * The XDmaPs driver instance data structure. A pointer to an instance data + * structure is passed around by functions to refer to a specific driver + * instance. + */ +typedef struct { + XDmaPs_Config Config; /**< Configuration data structure */ + int IsReady; /**< Device is Ready */ + int CacheLength; /**< icache length */ + XDmaPsFaultHandler FaultHandler; /**< fault interrupt handler */ + void *FaultRef; /**< fault call back data */ + XDmaPs_ChannelData Chans[XDMAPS_CHANNELS_PER_DEV]; + /**< + * channel data + */ +} XDmaPs; + +/* + * Functions implemented in xdmaps.c + */ +int XDmaPs_CfgInitialize(XDmaPs *InstPtr, + XDmaPs_Config *Config, + u32 EffectiveAddr); + +int XDmaPs_Start(XDmaPs *InstPtr, unsigned int Channel, + XDmaPs_Cmd *Cmd, + int HoldDmaProg); + +int XDmaPs_IsActive(XDmaPs *InstPtr, unsigned int Channel); +int XDmaPs_GenDmaProg(XDmaPs *InstPtr, unsigned int Channel, + XDmaPs_Cmd *Cmd); +int XDmaPs_FreeDmaProg(XDmaPs *InstPtr, unsigned int Channel, + XDmaPs_Cmd *Cmd); +void XDmaPs_Print_DmaProg(XDmaPs_Cmd *Cmd); + + +int XDmaPs_ResetManager(XDmaPs *InstPtr); +int XDmaPs_ResetChannel(XDmaPs *InstPtr, unsigned int Channel); + + +int XDmaPs_SetDoneHandler(XDmaPs *InstPtr, + unsigned Channel, + XDmaPsDoneHandler DoneHandler, + void *CallbackRef); + +int XDmaPs_SetFaultHandler(XDmaPs *InstPtr, + XDmaPsFaultHandler FaultHandler, + void *CallbackRef); + +void XDmaPs_Print_DmaProg(XDmaPs_Cmd *Cmd); + +/** + * Driver done interrupt service routines for the channels. + * We need this done ISR mainly because the driver needs to release the + * DMA program buffer. This is the one that connects the GIC + */ +void XDmaPs_DoneISR_0(XDmaPs *InstPtr); +void XDmaPs_DoneISR_1(XDmaPs *InstPtr); +void XDmaPs_DoneISR_2(XDmaPs *InstPtr); +void XDmaPs_DoneISR_3(XDmaPs *InstPtr); +void XDmaPs_DoneISR_4(XDmaPs *InstPtr); +void XDmaPs_DoneISR_5(XDmaPs *InstPtr); +void XDmaPs_DoneISR_6(XDmaPs *InstPtr); +void XDmaPs_DoneISR_7(XDmaPs *InstPtr); + +/** + * Driver fault interrupt service routine + */ +void XDmaPs_FaultISR(XDmaPs *InstPtr); + + +/* + * Static loopup function implemented in xdmaps_sinit.c + */ +XDmaPs_Config *XDmaPs_LookupConfig(u16 DeviceId); + + +/* + * self-test functions in xdmaps_selftest.c + */ +int XDmaPs_SelfTest(XDmaPs *InstPtr); + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdmaps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdmaps_hw.h new file mode 100755 index 000000000..1fc33e547 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xdmaps_hw.h @@ -0,0 +1,299 @@ +/****************************************************************************** +* +* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xdmaps_hw.h +* +* This header file contains the hardware interface of an XDmaPs device. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ---------------------------------------------- +* 1.00a hbm 08/18/10 First Release +* 1.01a nm 12/20/12 Added definition XDMAPS_CHANNELS_PER_DEV which specifies +* the maximum number of channels. +* Replaced the usage of XPAR_XDMAPS_CHANNELS_PER_DEV +* with XDMAPS_CHANNELS_PER_DEV defined in xdmaps_hw.h +* 1.02a sg 05/16/12 Made changes for doxygen +* 1.06a kpc 07/10/13 Added function prototype +* </pre> +* +******************************************************************************/ + +#ifndef XDMAPS_HW_H /* prevent circular inclusions */ +#define XDMAPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * + * Register offsets for the DMAC. + * @{ + */ + +#define XDMAPS_DS_OFFSET 0x000 /* DMA Status Register */ +#define XDMAPS_DPC_OFFSET 0x004 /* DMA Program Counter Rregister */ +#define XDMAPS_INTEN_OFFSET 0X020 /* DMA Interrupt Enable Register */ +#define XDMAPS_ES_OFFSET 0x024 /* DMA Event Status Register */ +#define XDMAPS_INTSTATUS_OFFSET 0x028 /* DMA Interrupt Status Register + */ +#define XDMAPS_INTCLR_OFFSET 0x02c /* DMA Interrupt Clear Register */ +#define XDMAPS_FSM_OFFSET 0x030 /* DMA Fault Status DMA Manager + * Register + */ +#define XDMAPS_FSC_OFFSET 0x034 /* DMA Fault Status DMA Chanel Register + */ +#define XDMAPS_FTM_OFFSET 0x038 /* DMA Fault Type DMA Manager Register */ + +#define XDMAPS_FTC0_OFFSET 0x040 /* DMA Fault Type for DMA Channel 0 */ +/* + * The offset for the rest of the FTC registers is calculated as + * FTC0 + dev_chan_num * 4 + */ +#define XDmaPs_FTCn_OFFSET(ch) (XDMAPS_FTC0_OFFSET + (ch) * 4) + +#define XDMAPS_CS0_OFFSET 0x100 /* Channel Status for DMA Channel 0 */ +/* + * The offset for the rest of the CS registers is calculated as + * CS0 + * dev_chan_num * 0x08 + */ +#define XDmaPs_CSn_OFFSET(ch) (XDMAPS_CS0_OFFSET + (ch) * 8) + +#define XDMAPS_CPC0_OFFSET 0x104 /* Channel Program Counter for DMA + * Channel 0 + */ +/* + * The offset for the rest of the CPC registers is calculated as + * CPC0 + dev_chan_num * 0x08 + */ +#define XDmaPs_CPCn_OFFSET(ch) (XDMAPS_CPC0_OFFSET + (ch) * 8) + +#define XDMAPS_SA_0_OFFSET 0x400 /* Source Address Register for DMA + * Channel 0 + */ +/* The offset for the rest of the SA registers is calculated as + * SA_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_SA_n_OFFSET(ch) (XDMAPS_SA_0_OFFSET + (ch) * 0x20) + +#define XDMAPS_DA_0_OFFSET 0x404 /* Destination Address Register for + * DMA Channel 0 + */ +/* The offset for the rest of the DA registers is calculated as + * DA_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_DA_n_OFFSET(ch) (XDMAPS_DA_0_OFFSET + (ch) * 0x20) + +#define XDMAPS_CC_0_OFFSET 0x408 /* Channel Control Register for + * DMA Channel 0 + */ +/* + * The offset for the rest of the CC registers is calculated as + * CC_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_CC_n_OFFSET(ch) (XDMAPS_CC_0_OFFSET + (ch) * 0x20) + +#define XDMAPS_LC0_0_OFFSET 0x40C /* Loop Counter 0 for DMA Channel 0 */ +/* + * The offset for the rest of the LC0 registers is calculated as + * LC_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_LC0_n_OFFSET(ch) (XDMAPS_LC0_0_OFFSET + (ch) * 0x20) +#define XDMAPS_LC1_0_OFFSET 0x410 /* Loop Counter 1 for DMA Channel 0 */ +/* + * The offset for the rest of the LC1 registers is calculated as + * LC_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_LC1_n_OFFSET(ch) (XDMAPS_LC1_0_OFFSET + (ch) * 0x20) + +#define XDMAPS_DBGSTATUS_OFFSET 0xD00 /* Debug Status Register */ +#define XDMAPS_DBGCMD_OFFSET 0xD04 /* Debug Command Register */ +#define XDMAPS_DBGINST0_OFFSET 0xD08 /* Debug Instruction 0 Register */ +#define XDMAPS_DBGINST1_OFFSET 0xD0C /* Debug Instruction 1 Register */ + +#define XDMAPS_CR0_OFFSET 0xE00 /* Configuration Register 0 */ +#define XDMAPS_CR1_OFFSET 0xE04 /* Configuration Register 1 */ +#define XDMAPS_CR2_OFFSET 0xE08 /* Configuration Register 2 */ +#define XDMAPS_CR3_OFFSET 0xE0C /* Configuration Register 3 */ +#define XDMAPS_CR4_OFFSET 0xE10 /* Configuration Register 4 */ +#define XDMAPS_CRDN_OFFSET 0xE14 /* Configuration Register Dn */ + +#define XDMAPS_PERIPH_ID_0_OFFSET 0xFE0 /* Peripheral Identification + * Register 0 + */ +#define XDMAPS_PERIPH_ID_1_OFFSET 0xFE4 /* Peripheral Identification + * Register 1 + */ +#define XDMAPS_PERIPH_ID_2_OFFSET 0xFE8 /* Peripheral Identification + * Register 2 + */ +#define XDMAPS_PERIPH_ID_3_OFFSET 0xFEC /* Peripheral Identification + * Register 3 + */ +#define XDMAPS_PCELL_ID_0_OFFSET 0xFF0 /* PrimeCell Identification + * Register 0 + */ +#define XDMAPS_PCELL_ID_1_OFFSET 0xFF4 /* PrimeCell Identification + * Register 1 + */ +#define XDMAPS_PCELL_ID_2_OFFSET 0xFF8 /* PrimeCell Identification + * Register 2 + */ +#define XDMAPS_PCELL_ID_3_OFFSET 0xFFC /* PrimeCell Identification + * Register 3 + */ + +/* + * Some useful register masks + */ +#define XDMAPS_DS_DMA_STATUS 0x0F /* DMA status mask */ +#define XDMAPS_DS_DMA_STATUS_STOPPED 0x00 /* debug status busy mask */ + +#define XDMAPS_DBGSTATUS_BUSY 0x01 /* debug status busy mask */ + +#define XDMAPS_CS_ACTIVE_MASK 0x07 /* channel status active mask, + * llast 3 bits of CS register + */ + +#define XDMAPS_CR1_I_CACHE_LEN_MASK 0x07 /* i_cache_len mask */ + + +/* + * XDMAPS_DBGINST0 - constructs the word for the Debug Instruction-0 Register. + * @b1: Instruction byte 1 + * @b0: Instruction byte 0 + * @ch: Channel number + * @dbg_th: Debug thread encoding: 0 = DMA manager thread, 1 = DMA channel + */ +#define XDmaPs_DBGINST0(b1, b0, ch, dbg_th) \ + (((b1) << 24) | ((b0) << 16) | (((ch) & 0x7) << 8) | ((dbg_th & 0x1))) + +/* @} */ + +/** @name Control Register + * + * The Control register (CR) controls the major functions of the device. + * + * Control Register Bit Definition + */ + +/* @}*/ + + +#define XDMAPS_CHANNELS_PER_DEV 8 + + +/** @name Mode Register + * + * The mode register (MR) defines the mode of transfer as well as the data + * format. If this register is modified during transmission or reception, + * data validity cannot be guaranteed. + * + * Mode Register Bit Definition + * @{ + */ + +/* @} */ + + +/** @name Interrupt Registers + * + * Interrupt control logic uses the interrupt enable register (IER) and the + * interrupt disable register (IDR) to set the value of the bits in the + * interrupt mask register (IMR). The IMR determines whether to pass an + * interrupt to the interrupt status register (ISR). + * Writing a 1 to IER Enbables an interrupt, writing a 1 to IDR disables an + * interrupt. IMR and ISR are read only, and IER and IDR are write only. + * Reading either IER or IDR returns 0x00. + * + * All four registers have the same bit definitions. + * + * @{ + */ + +/* @} */ +#define XDMAPS_INTCLR_ALL_MASK 0xFF + +#define XDmaPs_ReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/***************************************************************************/ +/** +* Write a DMAC register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the base address of the device. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note +* C-Style signature: +* void XDmaPs_WriteReg(u32 BaseAddress, int RegOffset, +* u32 RegisterValue) +******************************************************************************/ +#define XDmaPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + Xil_Out32((BaseAddress) + (RegOffset), (RegisterValue)) +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes *****************************/ +/* + * Perform reset operation to the dmaps interface + */ +void XDmaPs_ResetHw(u32 BaseAddr); +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps.h new file mode 100755 index 000000000..81e750c06 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps.h @@ -0,0 +1,716 @@ +/***************************************************************************** +* +* (c) Copyright 2010-11 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** + * + * @file xemacps.h + * + * The Xilinx Embedded Processor Block Ethernet driver. + * + * For a full description of XEMACPS features, please see the hardware spec. + * This driver supports the following features: + * - Memory mapped access to host interface registers + * - Statistics counter registers for RMON/MIB + * - API for interrupt driven frame transfers for hardware configured DMA + * - Virtual memory support + * - Unicast, broadcast, and multicast receive address filtering + * - Full and half duplex operation + * - Automatic PAD & FCS insertion and stripping + * - Flow control + * - Support up to four 48bit addresses + * - Address checking for four specific 48bit addresses + * - VLAN frame support + * - Pause frame support + * - Large frame support up to 1536 bytes + * - Checksum offload + * + * <b>Driver Description</b> + * + * The device driver enables higher layer software (e.g., an application) to + * communicate to the XEmacPs. The driver handles transmission and reception + * of Ethernet frames, as well as configuration and control. No pre or post + * processing of frame data is performed. The driver does not validate the + * contents of an incoming frame in addition to what has already occurred in + * hardware. + * A single device driver can support multiple devices even when those devices + * have significantly different configurations. + * + * <b>Initialization & Configuration</b> + * + * The XEmacPs_Config structure is used by the driver to configure itself. + * This configuration structure is typically created by the tool-chain based + * on hardware build properties. + * + * The driver instance can be initialized in + * + * - XEmacPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddress): Uses a + * configuration structure provided by the caller. If running in a system + * with address translation, the provided virtual memory base address + * replaces the physical address present in the configuration structure. + * + * The device supports DMA only as current development plan. No FIFO mode is + * supported. The driver expects to start the DMA channels and expects that + * the user has set up the buffer descriptor lists. + * + * <b>Interrupts and Asynchronous Callbacks</b> + * + * The driver has no dependencies on the interrupt controller. When an + * interrupt occurs, the handler will perform a small amount of + * housekeeping work, determine the source of the interrupt, and call the + * appropriate callback function. All callbacks are registered by the user + * level application. + * + * <b>Virtual Memory</b> + * + * All virtual to physical memory mappings must occur prior to accessing the + * driver API. + * + * For DMA transactions, user buffers supplied to the driver must be in terms + * of their physical address. + * + * <b>DMA</b> + * + * The DMA engine uses buffer descriptors (BDs) to describe Ethernet frames. + * These BDs are typically chained together into a list the hardware follows + * when transferring data in and out of the packet buffers. Each BD describes + * a memory region containing either a full or partial Ethernet packet. + * + * Interrupt coalescing is not suppoted from this built-in DMA engine. + * + * This API requires the user to understand how the DMA operates. The + * following paragraphs provide some explanation, but the user is encouraged + * to read documentation in xemacps_bdring.h as well as study example code + * that accompanies this driver. + * + * The API is designed to get BDs to and from the DMA engine in the most + * efficient means possible. The first step is to establish a memory region + * to contain all BDs for a specific channel. This is done with + * XEmacPs_BdRingCreate(). This function sets up a BD ring that hardware will + * follow as BDs are processed. The ring will consist of a user defined number + * of BDs which will all be partially initialized. For example on the transmit + * channel, the driver will initialize all BDs' so that they are configured + * for transmit. The more fields that can be permanently setup at + * initialization, then the fewer accesses will be needed to each BD while + * the DMA engine is in operation resulting in better throughput and CPU + * utilization. The best case initialization would require the user to set + * only a frame buffer address and length prior to submitting the BD to the + * engine. + * + * BDs move through the engine with the help of functions + * XEmacPs_BdRingAlloc(), XEmacPs_BdRingToHw(), XEmacPs_BdRingFromHw(), + * and XEmacPs_BdRingFree(). + * All these functions handle BDs that are in place. That is, there are no + * copies of BDs kept anywhere and any BD the user interacts with is an actual + * BD from the same ring hardware accesses. + * + * BDs in the ring go through a series of states as follows: + * 1. Idle. The driver controls BDs in this state. + * 2. The user has data to transfer. XEmacPs_BdRingAlloc() is called to + * reserve BD(s). Once allocated, the user may setup the BD(s) with + * frame buffer address, length, and other attributes. The user controls + * BDs in this state. + * 3. The user submits BDs to the DMA engine with XEmacPs_BdRingToHw. BDs + * in this state are either waiting to be processed by hardware, are in + * process, or have been processed. The DMA engine controls BDs in this + * state. + * 4. Processed BDs are retrieved with XEmacEpv_BdRingFromHw() by the + * user. Once retrieved, the user can examine each BD for the outcome of + * the DMA transfer. The user controls BDs in this state. After examining + * the BDs the user calls XEmacPs_BdRingFree() which places the BDs back + * into state 1. + * + * Each of the four BD accessor functions operate on a set of BDs. A set is + * defined as a segment of the BD ring consisting of one or more BDs. The user + * views the set as a pointer to the first BD along with the number of BDs for + * that set. The set can be navigated by using macros XEmacPs_BdNext(). The + * user must exercise extreme caution when changing BDs in a set as there is + * nothing to prevent doing a mBdNext past the end of the set and modifying a + * BD out of bounds. + * + * XEmacPs_BdRingAlloc() + XEmacPs_BdRingToHw(), as well as + * XEmacPs_BdRingFromHw() + XEmacPs_BdRingFree() are designed to be used in + * tandem. The same BD set retrieved with BdRingAlloc should be the same one + * provided to hardware with BdRingToHw. Same goes with BdRingFromHw and + * BdRIngFree. + * + * <b>Alignment & Data Cache Restrictions</b> + * + * Due to the design of the hardware, all RX buffers, BDs need to be 4-byte + * aligned. Please reference xemacps_bd.h for cache related macros. + * + * DMA Tx: + * + * - If frame buffers exist in cached memory, then they must be flushed + * prior to committing them to hardware. + * + * DMA Rx: + * + * - If frame buffers exist in cached memory, then the cache must be + * invalidated for the memory region containing the frame prior to data + * access + * + * Both cache invalidate/flush are taken care of in driver code. + * + * <b>Buffer Copying</b> + * + * The driver is designed for a zero-copy buffer scheme. That is, the driver + * will not copy buffers. This avoids potential throughput bottlenecks within + * the driver. If byte copying is required, then the transfer will take longer + * to complete. + * + * <b>Checksum Offloading</b> + * + * The Embedded Processor Block Ethernet can be configured to perform IP, TCP + * and UDP checksum offloading in both receive and transmit directions. + * + * IP packets contain a 16-bit checksum field, which is the 16-bit 1s + * complement of the 1s complement sum of all 16-bit words in the header. + * TCP and UDP packets contain a 16-bit checksum field, which is the 16-bit + * 1s complement of the 1s complement sum of all 16-bit words in the header, + * the data and a conceptual pseudo header. + * + * To calculate these checksums in software requires each byte of the packet + * to be read. For TCP and UDP this can use a large amount of processing power. + * Offloading the checksum calculation to hardware can result in significant + * performance improvements. + * + * The transmit checksum offload is only available to use DMA in packet buffer + * mode. This is because the complete frame to be transmitted must be read + * into the packet buffer memory before the checksum can be calculated and + * written to the header at the beginning of the frame. + * + * For IP, TCP or UDP receive checksum offload to be useful, the operating + * system containing the protocol stack must be aware that this offload is + * available so that it can make use of the fact that the hardware has verified + * the checksum. + * + * When receive checksum offloading is enabled in the hardware, the IP header + * checksum is checked, where the packet meets the following criteria: + * + * 1. If present, the VLAN header must be four octets long and the CFI bit + * must not be set. + * 2. Encapsulation must be RFC 894 Ethernet Type Encoding or RFC 1042 SNAP + * encoding. + * 3. IP v4 packet. + * 4. IP header is of a valid length. + * 5. Good IP header checksum. + * 6. No IP fragmentation. + * 7. TCP or UDP packet. + * + * When an IP, TCP or UDP frame is received, the receive buffer descriptor + * gives an indication if the hardware was able to verify the checksums. + * There is also an indication if the frame had SNAP encapsulation. These + * indication bits will replace the type ID match indication bits when the + * receive checksum offload is enabled. + * + * If any of the checksums are verified incorrect by the hardware, the packet + * is discarded and the appropriate statistics counter incremented. + * + * <b>PHY Interfaces</b> + * + * RGMII 1.3 is the only interface supported. + * + * <b>Asserts</b> + * + * Asserts are used within all Xilinx drivers to enforce constraints on + * parameters. Asserts can be turned off on a system-wide basis by defining, + * at compile time, the NDEBUG identifier. By default, asserts are turned on + * and it is recommended that users leave asserts on during development. For + * deployment use -DNDEBUG compiler switch to remove assert code. + * + * @note + * + * Xilinx drivers are typically composed of two parts, one is the driver + * and the other is the adapter. The driver is independent of OS and processor + * and is intended to be highly portable. The adapter is OS-specific and + * facilitates communication between the driver and an OS. + * This driver is intended to be RTOS and processor independent. Any needs for + * dynamic memory management, threads or thread mutual exclusion, or cache + * control must be satisfied bythe layer above this driver. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ------------------------------------------------------- + * 1.00a wsy 01/10/10 First release + * 1.00a asa 11/21/11 The function XEmacPs_BdRingFromHwTx in file + * xemacps_bdring.c is modified. Earlier it was checking for + * "BdLimit"(passed argument) number of BDs for finding out + * which BDs are successfully processed. Now one more check + * is added. It looks for BDs till the current BD pointer + * reaches HwTail. By doing this processing time is saved. + * 1.00a asa 01/24/12 The function XEmacPs_BdRingFromHwTx in file + * xemacps_bdring.c is modified. Now start of packet is + * searched for returning the number of BDs processed. + * 1.02a asa 11/05/12 Added a new API for deleting an entry from the HASH + * registers. Added a new API to set the bust length. + * Added some new hash-defines. + * 1.03a asa 01/23/12 Fix for CR #692702 which updates error handling for + * Rx errors. Under heavy Rx traffic, there will be a large + * number of errors related to receive buffer not available. + * Because of a HW bug (SI #692601), under such heavy errors, + * the Rx data path can become unresponsive. To reduce the + * probabilities for hitting this HW bug, the SW writes to + * bit 18 to flush a packet from Rx DPRAM immediately. The + * changes for it are done in the function + * XEmacPs_IntrHandler. + * 1.05a asa 09/23/13 Cache operations on BDs are not required and hence + * removed. It is expected that all BDs are allocated in + * from uncached area. + * </pre> + * + ****************************************************************************/ + +#ifndef XEMACPS_H /* prevent circular inclusions */ +#define XEMACPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xemacps_hw.h" +#include "xemacps_bd.h" +#include "xemacps_bdring.h" + +/************************** Constant Definitions ****************************/ + +/* + * Device information + */ +#define XEMACPS_DEVICE_NAME "xemacps" +#define XEMACPS_DEVICE_DESC "Xilinx PS 10/100/1000 MAC" + + +/** @name Configuration options + * + * Device configuration options. See the XEmacPs_SetOptions(), + * XEmacPs_ClearOptions() and XEmacPs_GetOptions() for information on how to + * use options. + * + * The default state of the options are noted and are what the device and + * driver will be set to after calling XEmacPs_Reset() or + * XEmacPs_Initialize(). + * + * @{ + */ + +#define XEMACPS_PROMISC_OPTION 0x00000001 +/**< Accept all incoming packets. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_FRAME1536_OPTION 0x00000002 +/**< Frame larger than 1516 support for Tx & Rx. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_VLAN_OPTION 0x00000004 +/**< VLAN Rx & Tx frame support. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_FLOW_CONTROL_OPTION 0x00000010 +/**< Enable recognition of flow control frames on Rx + * This option defaults to enabled (set) */ + +#define XEMACPS_FCS_STRIP_OPTION 0x00000020 +/**< Strip FCS and PAD from incoming frames. Note: PAD from VLAN frames is not + * stripped. + * This option defaults to enabled (set) */ + +#define XEMACPS_FCS_INSERT_OPTION 0x00000040 +/**< Generate FCS field and add PAD automatically for outgoing frames. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_LENTYPE_ERR_OPTION 0x00000080 +/**< Enable Length/Type error checking for incoming frames. When this option is + * set, the MAC will filter frames that have a mismatched type/length field + * and if XEMACPS_REPORT_RXERR_OPTION is set, the user is notified when these + * types of frames are encountered. When this option is cleared, the MAC will + * allow these types of frames to be received. + * + * This option defaults to disabled (cleared) */ + +#define XEMACPS_TRANSMITTER_ENABLE_OPTION 0x00000100 +/**< Enable the transmitter. + * This option defaults to enabled (set) */ + +#define XEMACPS_RECEIVER_ENABLE_OPTION 0x00000200 +/**< Enable the receiver + * This option defaults to enabled (set) */ + +#define XEMACPS_BROADCAST_OPTION 0x00000400 +/**< Allow reception of the broadcast address + * This option defaults to enabled (set) */ + +#define XEMACPS_MULTICAST_OPTION 0x00000800 +/**< Allows reception of multicast addresses programmed into hash + * This option defaults to disabled (clear) */ + +#define XEMACPS_RX_CHKSUM_ENABLE_OPTION 0x00001000 +/**< Enable the RX checksum offload + * This option defaults to enabled (set) */ + +#define XEMACPS_TX_CHKSUM_ENABLE_OPTION 0x00002000 +/**< Enable the TX checksum offload + * This option defaults to enabled (set) */ + + +#define XEMACPS_DEFAULT_OPTIONS \ + (XEMACPS_FLOW_CONTROL_OPTION | \ + XEMACPS_FCS_INSERT_OPTION | \ + XEMACPS_FCS_STRIP_OPTION | \ + XEMACPS_BROADCAST_OPTION | \ + XEMACPS_LENTYPE_ERR_OPTION | \ + XEMACPS_TRANSMITTER_ENABLE_OPTION | \ + XEMACPS_RECEIVER_ENABLE_OPTION | \ + XEMACPS_RX_CHKSUM_ENABLE_OPTION | \ + XEMACPS_TX_CHKSUM_ENABLE_OPTION) + +/**< Default options set when device is initialized or reset */ +/*@}*/ + +/** @name Callback identifiers + * + * These constants are used as parameters to XEmacPs_SetHandler() + * @{ + */ +#define XEMACPS_HANDLER_DMASEND 1 +#define XEMACPS_HANDLER_DMARECV 2 +#define XEMACPS_HANDLER_ERROR 3 +/*@}*/ + +/* Constants to determine the configuration of the hardware device. They are + * used to allow the driver to verify it can operate with the hardware. + */ +#define XEMACPS_MDIO_DIV_DFT MDC_DIV_32 /**< Default MDIO clock divisor */ + +/* The next few constants help upper layers determine the size of memory + * pools used for Ethernet buffers and descriptor lists. + */ +#define XEMACPS_MAC_ADDR_SIZE 6 /* size of Ethernet header */ + +#define XEMACPS_MTU 1500 /* max MTU size of Ethernet frame */ +#define XEMACPS_HDR_SIZE 14 /* size of Ethernet header */ +#define XEMACPS_HDR_VLAN_SIZE 18 /* size of Ethernet header with VLAN */ +#define XEMACPS_TRL_SIZE 4 /* size of Ethernet trailer (FCS) */ +#define XEMACPS_MAX_FRAME_SIZE (XEMACPS_MTU + XEMACPS_HDR_SIZE + \ + XEMACPS_TRL_SIZE) +#define XEMACPS_MAX_VLAN_FRAME_SIZE (XEMACPS_MTU + XEMACPS_HDR_SIZE + \ + XEMACPS_HDR_VLAN_SIZE + XEMACPS_TRL_SIZE) + +/* DMACR Bust length hash defines */ + +#define XEMACPS_SINGLE_BURST 1 +#define XEMACPS_4BYTE_BURST 4 +#define XEMACPS_8BYTE_BURST 8 +#define XEMACPS_16BYTE_BURST 16 + + +/**************************** Type Definitions ******************************/ +/** @name Typedefs for callback functions + * + * These callbacks are invoked in interrupt context. + * @{ + */ +/** + * Callback invoked when frame(s) have been sent or received in interrupt + * driven DMA mode. To set the send callback, invoke XEmacPs_SetHandler(). + * + * @param CallBackRef is user data assigned when the callback was set. + * + * @note + * See xemacps_hw.h for bitmasks definitions and the device hardware spec for + * further information on their meaning. + * + */ +typedef void (*XEmacPs_Handler) (void *CallBackRef); + +/** + * Callback when an asynchronous error occurs. To set this callback, invoke + * XEmacPs_SetHandler() with XEMACPS_HANDLER_ERROR in the HandlerType + * paramter. + * + * @param CallBackRef is user data assigned when the callback was set. + * @param Direction defines either receive or transmit error(s) has occurred. + * @param ErrorWord definition varies with Direction + * + */ +typedef void (*XEmacPs_ErrHandler) (void *CallBackRef, u8 Direction, + u32 ErrorWord); + +/*@}*/ + +/** + * This typedef contains configuration information for a device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress;/**< Physical base address of IPIF registers */ +} XEmacPs_Config; + + +/** + * The XEmacPs driver instance data. The user is required to allocate a + * structure of this type for every XEmacPs device in the system. A pointer + * to a structure of this type is then passed to the driver API functions. + */ +typedef struct XEmacPs { + XEmacPs_Config Config; /* Hardware configuration */ + u32 IsStarted; /* Device is currently started */ + u32 IsReady; /* Device is initialized and ready */ + u32 Options; /* Current options word */ + + XEmacPs_BdRing TxBdRing; /* Transmit BD ring */ + XEmacPs_BdRing RxBdRing; /* Receive BD ring */ + + XEmacPs_Handler SendHandler; + XEmacPs_Handler RecvHandler; + void *SendRef; + void *RecvRef; + + XEmacPs_ErrHandler ErrorHandler; + void *ErrorRef; + +} XEmacPs; + + +/***************** Macros (Inline Functions) Definitions ********************/ + +/****************************************************************************/ +/** +* Retrieve the Tx ring object. This object can be used in the various Ring +* API functions. +* +* @param InstancePtr is the DMA channel to operate on. +* +* @return TxBdRing attribute +* +* @note +* C-style signature: +* XEmacPs_BdRing XEmacPs_GetTxRing(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_GetTxRing(InstancePtr) ((InstancePtr)->TxBdRing) + +/****************************************************************************/ +/** +* Retrieve the Rx ring object. This object can be used in the various Ring +* API functions. +* +* @param InstancePtr is the DMA channel to operate on. +* +* @return RxBdRing attribute +* +* @note +* C-style signature: +* XEmacPs_BdRing XEmacPs_GetRxRing(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_GetRxRing(InstancePtr) ((InstancePtr)->RxBdRing) + +/****************************************************************************/ +/** +* +* Enable interrupts specified in <i>Mask</i>. The corresponding interrupt for +* each bit set to 1 in <i>Mask</i>, will be enabled. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Mask contains a bit mask of interrupts to enable. The mask can +* be formed using a set of bitwise or'd values. +* +* @note +* The state of the transmitter and receiver are not modified by this function. +* C-style signature +* void XEmacPs_IntEnable(XEmacPs *InstancePtr, u32 Mask) +* +*****************************************************************************/ +#define XEmacPs_IntEnable(InstancePtr, Mask) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_IER_OFFSET, \ + (Mask & XEMACPS_IXR_ALL_MASK)); + +/****************************************************************************/ +/** +* +* Disable interrupts specified in <i>Mask</i>. The corresponding interrupt for +* each bit set to 1 in <i>Mask</i>, will be enabled. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Mask contains a bit mask of interrupts to disable. The mask can +* be formed using a set of bitwise or'd values. +* +* @note +* The state of the transmitter and receiver are not modified by this function. +* C-style signature +* void XEmacPs_IntDisable(XEmacPs *InstancePtr, u32 Mask) +* +*****************************************************************************/ +#define XEmacPs_IntDisable(InstancePtr, Mask) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_IDR_OFFSET, \ + (Mask & XEMACPS_IXR_ALL_MASK)); + +/****************************************************************************/ +/** +* +* This macro triggers trasmit circuit to send data currently in TX buffer(s). +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* +* @return +* +* @note +* +* Signature: void XEmacPs_Transmit(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_Transmit(InstancePtr) \ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, \ + XEMACPS_NWCTRL_OFFSET, \ + (XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, \ + XEMACPS_NWCTRL_OFFSET) | XEMACPS_NWCTRL_STARTTX_MASK)) + +/****************************************************************************/ +/** +* +* This macro determines if the device is configured with checksum offloading +* on the receive channel +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* +* @return +* +* Boolean TRUE if the device is configured with checksum offloading, or +* FALSE otherwise. +* +* @note +* +* Signature: u32 XEmacPs_IsRxCsum(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_IsRxCsum(InstancePtr) \ + ((XEmacPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_NWCFG_OFFSET) & XEMACPS_NWCFG_RXCHKSUMEN_MASK) \ + ? TRUE : FALSE) + +/****************************************************************************/ +/** +* +* This macro determines if the device is configured with checksum offloading +* on the transmit channel +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* +* @return +* +* Boolean TRUE if the device is configured with checksum offloading, or +* FALSE otherwise. +* +* @note +* +* Signature: u32 XEmacPs_IsTxCsum(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_IsTxCsum(InstancePtr) \ + ((XEmacPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_DMACR_OFFSET) & XEMACPS_DMACR_TCPCKSUM_MASK) \ + ? TRUE : FALSE) + +/************************** Function Prototypes *****************************/ + +/* + * Initialization functions in xemacps.c + */ +int XEmacPs_CfgInitialize(XEmacPs *InstancePtr, XEmacPs_Config *CfgPtr, + u32 EffectiveAddress); +void XEmacPs_Start(XEmacPs *InstancePtr); +void XEmacPs_Stop(XEmacPs *InstancePtr); +void XEmacPs_Reset(XEmacPs *InstancePtr); + +/* + * Lookup configuration in xemacps_sinit.c + */ +XEmacPs_Config *XEmacPs_LookupConfig(u16 DeviceId); + +/* + * Interrupt-related functions in xemacps_intr.c + * DMA only and FIFO is not supported. This DMA does not support coalescing. + */ +int XEmacPs_SetHandler(XEmacPs *InstancePtr, u32 HandlerType, + void *FuncPtr, void *CallBackRef); +void XEmacPs_IntrHandler(void *InstancePtr); + +/* + * MAC configuration/control functions in XEmacPs_control.c + */ +int XEmacPs_SetOptions(XEmacPs *InstancePtr, u32 Options); +int XEmacPs_ClearOptions(XEmacPs *InstancePtr, u32 Options); +u32 XEmacPs_GetOptions(XEmacPs *InstancePtr); + +int XEmacPs_SetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index); +void XEmacPs_GetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index); + +int XEmacPs_SetHash(XEmacPs *InstancePtr, void *AddressPtr); +void XEmacPs_ClearHash(XEmacPs *InstancePtr); +void XEmacPs_GetHash(XEmacPs *InstancePtr, void *AddressPtr); + +void XEmacPs_SetMdioDivisor(XEmacPs *InstancePtr, + XEmacPs_MdcDiv Divisor); +void XEmacPs_SetOperatingSpeed(XEmacPs *InstancePtr, u16 Speed); +u16 XEmacPs_GetOperatingSpeed(XEmacPs *InstancePtr); +int XEmacPs_PhyRead(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 *PhyDataPtr); +int XEmacPs_PhyWrite(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 PhyData); +int XEmacPs_SetTypeIdCheck(XEmacPs *InstancePtr, u32 Id_Check, u8 Index); + +int XEmacPs_SendPausePacket(XEmacPs *InstancePtr); +void XEmacPs_DMABLengthUpdate(XEmacPs *InstancePtr, int BLength); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_bd.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_bd.h new file mode 100755 index 000000000..8bf33cfa5 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_bd.h @@ -0,0 +1,737 @@ +/* $Id: xemacps_bd.h,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xemacps_bd.h + * + * This header provides operations to manage buffer descriptors in support + * of scatter-gather DMA. + * + * The API exported by this header defines abstracted macros that allow the + * user to read/write specific BD fields. + * + * <b>Buffer Descriptors</b> + * + * A buffer descriptor (BD) defines a DMA transaction. The macros defined by + * this header file allow access to most fields within a BD to tailor a DMA + * transaction according to user and hardware requirements. See the hardware + * IP DMA spec for more information on BD fields and how they affect transfers. + * + * The XEmacPs_Bd structure defines a BD. The organization of this structure + * is driven mainly by the hardware for use in scatter-gather DMA transfers. + * + * <b>Performance</b> + * + * Limiting I/O to BDs can improve overall performance of the DMA channel. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ------------------------------------------------------- + * 1.00a wsy 01/10/10 First release + * </pre> + * + * *************************************************************************** + */ + +#ifndef XEMACPS_BD_H /* prevent circular inclusions */ +#define XEMACPS_BD_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include <string.h> +#include "xil_types.h" +#include "xil_assert.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/* Minimum BD alignment */ +#define XEMACPS_DMABD_MINIMUM_ALIGNMENT 4 + +/** + * The XEmacPs_Bd is the type for buffer descriptors (BDs). + */ +#define XEMACPS_BD_NUM_WORDS 2 +typedef u32 XEmacPs_Bd[XEMACPS_BD_NUM_WORDS]; + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** + * Zero out BD fields + * + * @param BdPtr is the BD pointer to operate on + * + * @return Nothing + * + * @note + * C-style signature: + * void XEmacPs_BdClear(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClear(BdPtr) \ + memset((BdPtr), 0, sizeof(XEmacPs_Bd)) + +/****************************************************************************/ +/** +* +* Read the given Buffer Descriptor word. +* +* @param BaseAddress is the base address of the BD to read +* @param Offset is the word offset to be read +* +* @return The 32-bit value of the field +* +* @note +* C-style signature: +* u32 XEmacPs_BdRead(u32 BaseAddress, u32 Offset) +* +*****************************************************************************/ +#define XEmacPs_BdRead(BaseAddress, Offset) \ + (*(u32*)((u32)(BaseAddress) + (u32)(Offset))) + +/****************************************************************************/ +/** +* +* Write the given Buffer Descriptor word. +* +* @param BaseAddress is the base address of the BD to write +* @param Offset is the word offset to be written +* @param Data is the 32-bit value to write to the field +* +* @return None. +* +* @note +* C-style signature: +* void XEmacPs_BdWrite(u32 BaseAddress, u32 Offset, u32 Data) +* +*****************************************************************************/ +#define XEmacPs_BdWrite(BaseAddress, Offset, Data) \ + (*(u32*)((u32)(BaseAddress) + (u32)(Offset)) = (Data)) + +/*****************************************************************************/ +/** + * Set the BD's Address field (word 0). + * + * @param BdPtr is the BD pointer to operate on + * @param Addr is the value to write to BD's status field. + * + * @note : + * + * C-style signature: + * void XEmacPs_BdSetAddressTx(XEmacPs_Bd* BdPtr, u32 Addr) + * + *****************************************************************************/ +#define XEmacPs_BdSetAddressTx(BdPtr, Addr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, (u32)(Addr))) + + +/*****************************************************************************/ +/** + * Set the BD's Address field (word 0). + * + * @param BdPtr is the BD pointer to operate on + * @param Addr is the value to write to BD's status field. + * + * @note : Due to some bits are mixed within recevie BD's address field, + * read-modify-write is performed. + * + * C-style signature: + * void XEmacPs_BdSetAddressRx(XEmacPs_Bd* BdPtr, u32 Addr) + * + *****************************************************************************/ +#define XEmacPs_BdSetAddressRx(BdPtr, Addr) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + ~XEMACPS_RXBUF_ADD_MASK) | (u32)(Addr))) + + +/*****************************************************************************/ +/** + * Set the BD's Status field (word 1). + * + * @param BdPtr is the BD pointer to operate on + * @param Data is the value to write to BD's status field. + * + * @note + * C-style signature: + * void XEmacPs_BdSetStatus(XEmacPs_Bd* BdPtr, u32 Data) + * + *****************************************************************************/ +#define XEmacPs_BdSetStatus(BdPtr, Data) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | Data) + + +/*****************************************************************************/ +/** + * Retrieve the BD's Packet DMA transfer status word (word 1). + * + * @param BdPtr is the BD pointer to operate on + * + * @return Status word + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetStatus(XEmacPs_Bd* BdPtr) + * + * Due to the BD bit layout differences in transmit and receive. User's + * caution is required. + *****************************************************************************/ +#define XEmacPs_BdGetStatus(BdPtr) \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) + + +/*****************************************************************************/ +/** + * Get the address (bits 0..31) of the BD's buffer address (word 0) + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetBufAddr(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdGetBufAddr(BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET)) + + +/*****************************************************************************/ +/** + * Set transfer length in bytes for the given BD. The length must be set each + * time a BD is submitted to hardware. + * + * @param BdPtr is the BD pointer to operate on + * @param LenBytes is the number of bytes to transfer. + * + * @note + * C-style signature: + * void XEmacPs_BdSetLength(XEmacPs_Bd* BdPtr, u32 LenBytes) + * + *****************************************************************************/ +#define XEmacPs_BdSetLength(BdPtr, LenBytes) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + ~XEMACPS_TXBUF_LEN_MASK) | (LenBytes))) + + +/*****************************************************************************/ +/** + * Retrieve the BD length field. + * + * For Tx channels, the returned value is the same as that written with + * XEmacPs_BdSetLength(). + * + * For Rx channels, the returned value is the size of the received packet. + * + * @param BdPtr is the BD pointer to operate on + * + * @return Length field processed by hardware or set by + * XEmacPs_BdSetLength(). + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetLength(XEmacPs_Bd* BdPtr) + * XEAMCPS_RXBUF_LEN_MASK is same as XEMACPS_TXBUF_LEN_MASK. + * + *****************************************************************************/ +#define XEmacPs_BdGetLength(BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_LEN_MASK) + + +/*****************************************************************************/ +/** + * Test whether the given BD has been marked as the last BD of a packet. + * + * @param BdPtr is the BD pointer to operate on + * + * @return TRUE if BD represents the "Last" BD of a packet, FALSE otherwise + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsLast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsLast(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_EOF_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Tell the DMA engine that the given transmit BD marks the end of the current + * packet to be processed. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdSetLast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetLast(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | \ + XEMACPS_TXBUF_LAST_MASK)) + + +/*****************************************************************************/ +/** + * Tell the DMA engine that the current packet does not end with the given + * BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdClearLast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClearLast(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + ~XEMACPS_TXBUF_LAST_MASK)) + + +/*****************************************************************************/ +/** + * Set this bit to mark the last descriptor in the receive buffer descriptor + * list. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdSetRxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetRxWrap(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) | \ + XEMACPS_RXBUF_WRAP_MASK)) + + +/*****************************************************************************/ +/** + * Determine the wrap bit of the receive BD which indicates end of the + * BD list. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxWrap(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + XEMACPS_RXBUF_WRAP_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Sets this bit to mark the last descriptor in the transmit buffer + * descriptor list. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdSetTxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetTxWrap(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | \ + XEMACPS_TXBUF_WRAP_MASK)) + + +/*****************************************************************************/ +/** + * Determine the wrap bit of the transmit BD which indicates end of the + * BD list. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetTxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxWrap(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_WRAP_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/* + * Must clear this bit to enable the MAC to write data to the receive + * buffer. Hardware sets this bit once it has successfully written a frame to + * memory. Once set, software has to clear the bit before the buffer can be + * used again. This macro clear the new bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdClearRxNew(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClearRxNew(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + ~XEMACPS_RXBUF_NEW_MASK)) + + +/*****************************************************************************/ +/** + * Determine the new bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxNew(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxNew(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + XEMACPS_RXBUF_NEW_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Software sets this bit to disable the buffer to be read by the hardware. + * Hardware sets this bit for the first buffer of a frame once it has been + * successfully transmitted. This macro sets this bit of transmit BD to avoid + * confusion. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdSetTxUsed(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetTxUsed(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | \ + XEMACPS_TXBUF_USED_MASK)) + + +/*****************************************************************************/ +/** + * Software clears this bit to enable the buffer to be read by the hardware. + * Hardware sets this bit for the first buffer of a frame once it has been + * successfully transmitted. This macro clears this bit of transmit BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdClearTxUsed(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClearTxUsed(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + ~XEMACPS_TXBUF_USED_MASK)) + + +/*****************************************************************************/ +/** + * Determine the used bit of the transmit BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsTxUsed(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxUsed(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_USED_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if a frame fails to be transmitted due to too many retries. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsTxRetry(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxRetry(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_RETRY_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if a frame fails to be transmitted due to data can not be + * feteched in time or buffers are exhausted. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsTxUrun(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxUrun(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_URUN_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if a frame fails to be transmitted due to buffer is exhausted + * mid-frame. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsTxExh(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxExh(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_EXH_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Sets this bit, no CRC will be appended to the current frame. This control + * bit must be set for the first buffer in a frame and will be ignored for + * the subsequent buffers of a frame. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * This bit must be clear when using the transmit checksum generation offload, + * otherwise checksum generation and substitution will not occur. + * + * C-style signature: + * u32 XEmacPs_BdSetTxNoCRC(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetTxNoCRC(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | \ + XEMACPS_TXBUF_NOCRC_MASK)) + + +/*****************************************************************************/ +/** + * Clear this bit, CRC will be appended to the current frame. This control + * bit must be set for the first buffer in a frame and will be ignored for + * the subsequent buffers of a frame. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * This bit must be clear when using the transmit checksum generation offload, + * otherwise checksum generation and substitution will not occur. + * + * C-style signature: + * u32 XEmacPs_BdClearTxNoCRC(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClearTxNoCRC(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + ~XEMACPS_TXBUF_NOCRC_MASK)) + + +/*****************************************************************************/ +/** + * Determine the broadcast bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxBcast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxBcast(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_BCAST_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the multicast hash bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxMultiHash(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxMultiHash(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_MULTIHASH_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the unicast hash bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxUniHash(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxUniHash(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_UNIHASH_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if the received frame is a VLAN Tagged frame. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxVlan(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxVlan(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_VLAN_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if the received frame has Type ID of 8100h and null VLAN + * identifier(Priority tag). + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxPri(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxPri(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_PRI_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if the received frame's Concatenation Format Indicator (CFI) of + * the frames VLANTCI field was set. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxCFI(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxCFI(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_CFI_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the End Of Frame (EOF) bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetRxEOF(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxEOF(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_EOF_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the Start Of Frame (SOF) bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetRxSOF(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxSOF(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_SOF_MASK) ? TRUE : FALSE) + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_bdring.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_bdring.h new file mode 100755 index 000000000..9c50d618e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_bdring.h @@ -0,0 +1,242 @@ +/* $Id: xemacps_bdring.h,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_bdring.h +* +* The Xiline EmacPs Buffer Descriptor ring driver. This is part of EmacPs +* DMA functionalities. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a wsy 01/10/10 First release +* </pre> +* +******************************************************************************/ + +#ifndef XEMACPS_BDRING_H /* prevent curcular inclusions */ +#define XEMACPS_BDRING_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/**************************** Type Definitions *******************************/ + +/** This is an internal structure used to maintain the DMA list */ +typedef struct { + u32 PhysBaseAddr;/**< Physical address of 1st BD in list */ + u32 BaseBdAddr; /**< Virtual address of 1st BD in list */ + u32 HighBdAddr; /**< Virtual address of last BD in the list */ + u32 Length; /**< Total size of ring in bytes */ + u32 RunState; /**< Flag to indicate DMA is started */ + u32 Separation; /**< Number of bytes between the starting address + of adjacent BDs */ + XEmacPs_Bd *FreeHead; + /**< First BD in the free group */ + XEmacPs_Bd *PreHead;/**< First BD in the pre-work group */ + XEmacPs_Bd *HwHead; /**< First BD in the work group */ + XEmacPs_Bd *HwTail; /**< Last BD in the work group */ + XEmacPs_Bd *PostHead; + /**< First BD in the post-work group */ + XEmacPs_Bd *BdaRestart; + /**< BDA to load when channel is started */ + unsigned HwCnt; /**< Number of BDs in work group */ + unsigned PreCnt; /**< Number of BDs in pre-work group */ + unsigned FreeCnt; /**< Number of allocatable BDs in the free group */ + unsigned PostCnt; /**< Number of BDs in post-work group */ + unsigned AllCnt; /**< Total Number of BDs for channel */ +} XEmacPs_BdRing; + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** +* Use this macro at initialization time to determine how many BDs will fit +* in a BD list within the given memory constraints. +* +* The results of this macro can be provided to XEmacPs_BdRingCreate(). +* +* @param Alignment specifies what byte alignment the BDs must fall on and +* must be a power of 2 to get an accurate calculation (32, 64, 128,...) +* @param Bytes is the number of bytes to be used to store BDs. +* +* @return Number of BDs that can fit in the given memory area +* +* @note +* C-style signature: +* u32 XEmacPs_BdRingCntCalc(u32 Alignment, u32 Bytes) +* +******************************************************************************/ +#define XEmacPs_BdRingCntCalc(Alignment, Bytes) \ + (u32)((Bytes) / ((sizeof(XEmacPs_Bd) + ((Alignment)-1)) & \ + ~((Alignment)-1))) + +/*****************************************************************************/ +/** +* Use this macro at initialization time to determine how many bytes of memory +* is required to contain a given number of BDs at a given alignment. +* +* @param Alignment specifies what byte alignment the BDs must fall on. This +* parameter must be a power of 2 to get an accurate calculation (32, 64, +* 128,...) +* @param NumBd is the number of BDs to calculate memory size requirements for +* +* @return The number of bytes of memory required to create a BD list with the +* given memory constraints. +* +* @note +* C-style signature: +* u32 XEmacPs_BdRingMemCalc(u32 Alignment, u32 NumBd) +* +******************************************************************************/ +#define XEmacPs_BdRingMemCalc(Alignment, NumBd) \ + (u32)((sizeof(XEmacPs_Bd) + ((Alignment)-1)) & \ + ~((Alignment)-1)) * (NumBd) + +/****************************************************************************/ +/** +* Return the total number of BDs allocated by this channel with +* XEmacPs_BdRingCreate(). +* +* @param RingPtr is the DMA channel to operate on. +* +* @return The total number of BDs allocated for this channel. +* +* @note +* C-style signature: +* u32 XEmacPs_BdRingGetCnt(XEmacPs_BdRing* RingPtr) +* +*****************************************************************************/ +#define XEmacPs_BdRingGetCnt(RingPtr) ((RingPtr)->AllCnt) + +/****************************************************************************/ +/** +* Return the number of BDs allocatable with XEmacPs_BdRingAlloc() for pre- +* processing. +* +* @param RingPtr is the DMA channel to operate on. +* +* @return The number of BDs currently allocatable. +* +* @note +* C-style signature: +* u32 XEmacPs_BdRingGetFreeCnt(XEmacPs_BdRing* RingPtr) +* +*****************************************************************************/ +#define XEmacPs_BdRingGetFreeCnt(RingPtr) ((RingPtr)->FreeCnt) + +/****************************************************************************/ +/** +* Return the next BD from BdPtr in a list. +* +* @param RingPtr is the DMA channel to operate on. +* @param BdPtr is the BD to operate on. +* +* @return The next BD in the list relative to the BdPtr parameter. +* +* @note +* C-style signature: +* XEmacPs_Bd *XEmacPs_BdRingNext(XEmacPs_BdRing* RingPtr, +* XEmacPs_Bd *BdPtr) +* +*****************************************************************************/ +#define XEmacPs_BdRingNext(RingPtr, BdPtr) \ + (((u32)(BdPtr) >= (RingPtr)->HighBdAddr) ? \ + (XEmacPs_Bd*)(RingPtr)->BaseBdAddr : \ + (XEmacPs_Bd*)((u32)(BdPtr) + (RingPtr)->Separation)) + +/****************************************************************************/ +/** +* Return the previous BD from BdPtr in the list. +* +* @param RingPtr is the DMA channel to operate on. +* @param BdPtr is the BD to operate on +* +* @return The previous BD in the list relative to the BdPtr parameter. +* +* @note +* C-style signature: +* XEmacPs_Bd *XEmacPs_BdRingPrev(XEmacPs_BdRing* RingPtr, +* XEmacPs_Bd *BdPtr) +* +*****************************************************************************/ +#define XEmacPs_BdRingPrev(RingPtr, BdPtr) \ + (((u32)(BdPtr) <= (RingPtr)->BaseBdAddr) ? \ + (XEmacPs_Bd*)(RingPtr)->HighBdAddr : \ + (XEmacPs_Bd*)((u32)(BdPtr) - (RingPtr)->Separation)) + +/************************** Function Prototypes ******************************/ + +/* + * Scatter gather DMA related functions in xemacps_bdring.c + */ +int XEmacPs_BdRingCreate(XEmacPs_BdRing * RingPtr, u32 PhysAddr, + u32 VirtAddr, u32 Alignment, unsigned BdCount); +int XEmacPs_BdRingClone(XEmacPs_BdRing * RingPtr, XEmacPs_Bd * SrcBdPtr, + u8 Direction); +int XEmacPs_BdRingAlloc(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd ** BdSetPtr); +int XEmacPs_BdRingUnAlloc(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr); +int XEmacPs_BdRingToHw(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr); +int XEmacPs_BdRingFree(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr); +unsigned XEmacPs_BdRingFromHwTx(XEmacPs_BdRing * RingPtr, unsigned BdLimit, + XEmacPs_Bd ** BdSetPtr); +unsigned XEmacPs_BdRingFromHwRx(XEmacPs_BdRing * RingPtr, unsigned BdLimit, + XEmacPs_Bd ** BdSetPtr); +int XEmacPs_BdRingCheck(XEmacPs_BdRing * RingPtr, u8 Direction); + +#ifdef __cplusplus +} +#endif + + +#endif /* end of protection macros */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_hw.h new file mode 100755 index 000000000..4f81fc1a7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xemacps_hw.h @@ -0,0 +1,603 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_hw.h +* +* This header file contains identifiers and low-level driver functions (or +* macros) that can be used to access the PS Ethernet MAC (XEmacPs) device. +* High-level driver functions are defined in xemacps.h. +* +* @note +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a wsy 01/10/10 First release. +* 1.02a asa 11/05/12 Added hash defines for DMACR burst length configuration. +* 1.05a kpc 28/06/13 Added XEmacPs_ResetHw function prototype +* </pre> +* +******************************************************************************/ + +#ifndef XEMACPS_HW_H /* prevent circular inclusions */ +#define XEMACPS_HW_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +#define XEMACPS_MAX_MAC_ADDR 4 /**< Maxmum number of mac address + supported */ +#define XEMACPS_MAX_TYPE_ID 4 /**< Maxmum number of type id supported */ +#define XEMACPS_BD_ALIGNMENT 4 /**< Minimum buffer descriptor alignment + on the local bus */ +#define XEMACPS_RX_BUF_ALIGNMENT 4 /**< Minimum buffer alignment when using + options that impose alignment + restrictions on the buffer data on + the local bus */ + +/** @name Direction identifiers + * + * These are used by several functions and callbacks that need + * to specify whether an operation specifies a send or receive channel. + * @{ + */ +#define XEMACPS_SEND 1 /**< send direction */ +#define XEMACPS_RECV 2 /**< receive direction */ +/*@}*/ + +/** @name MDC clock division + * currently supporting 8, 16, 32, 48, 64, 96, 128, 224. + * @{ + */ +typedef enum { MDC_DIV_8 = 0, MDC_DIV_16, MDC_DIV_32, MDC_DIV_48, + MDC_DIV_64, MDC_DIV_96, MDC_DIV_128, MDC_DIV_224 +} XEmacPs_MdcDiv; + +/*@}*/ + +#define XEMACPS_RX_BUF_SIZE 1536 /**< Specify the receive buffer size in + bytes, 64, 128, ... 10240 */ +#define XEMACPS_RX_BUF_UNIT 64 /**< Number of receive buffer bytes as a + unit, this is HW setup */ + +#define XEMACPS_MAX_RXBD 128 /**< Size of RX buffer descriptor queues */ +#define XEMACPS_MAX_TXBD 128 /**< Size of TX buffer descriptor queues */ + +#define XEMACPS_MAX_HASH_BITS 64 /**< Maximum value for hash bits. 2**6 */ + +/* Register offset definitions. Unless otherwise noted, register access is + * 32 bit. Names are self explained here. + */ + +#define XEMACPS_NWCTRL_OFFSET 0x00000000 /**< Network Control reg */ +#define XEMACPS_NWCFG_OFFSET 0x00000004 /**< Network Config reg */ +#define XEMACPS_NWSR_OFFSET 0x00000008 /**< Network Status reg */ + +#define XEMACPS_DMACR_OFFSET 0x00000010 /**< DMA Control reg */ +#define XEMACPS_TXSR_OFFSET 0x00000014 /**< TX Status reg */ +#define XEMACPS_RXQBASE_OFFSET 0x00000018 /**< RX Q Base address reg */ +#define XEMACPS_TXQBASE_OFFSET 0x0000001C /**< TX Q Base address reg */ +#define XEMACPS_RXSR_OFFSET 0x00000020 /**< RX Status reg */ + +#define XEMACPS_ISR_OFFSET 0x00000024 /**< Interrupt Status reg */ +#define XEMACPS_IER_OFFSET 0x00000028 /**< Interrupt Enable reg */ +#define XEMACPS_IDR_OFFSET 0x0000002C /**< Interrupt Disable reg */ +#define XEMACPS_IMR_OFFSET 0x00000030 /**< Interrupt Mask reg */ + +#define XEMACPS_PHYMNTNC_OFFSET 0x00000034 /**< Phy Maintaince reg */ +#define XEMACPS_RXPAUSE_OFFSET 0x00000038 /**< RX Pause Time reg */ +#define XEMACPS_TXPAUSE_OFFSET 0x0000003C /**< TX Pause Time reg */ + +#define XEMACPS_HASHL_OFFSET 0x00000080 /**< Hash Low address reg */ +#define XEMACPS_HASHH_OFFSET 0x00000084 /**< Hash High address reg */ + +#define XEMACPS_LADDR1L_OFFSET 0x00000088 /**< Specific1 addr low reg */ +#define XEMACPS_LADDR1H_OFFSET 0x0000008C /**< Specific1 addr high reg */ +#define XEMACPS_LADDR2L_OFFSET 0x00000090 /**< Specific2 addr low reg */ +#define XEMACPS_LADDR2H_OFFSET 0x00000094 /**< Specific2 addr high reg */ +#define XEMACPS_LADDR3L_OFFSET 0x00000098 /**< Specific3 addr low reg */ +#define XEMACPS_LADDR3H_OFFSET 0x0000009C /**< Specific3 addr high reg */ +#define XEMACPS_LADDR4L_OFFSET 0x000000A0 /**< Specific4 addr low reg */ +#define XEMACPS_LADDR4H_OFFSET 0x000000A4 /**< Specific4 addr high reg */ + +#define XEMACPS_MATCH1_OFFSET 0x000000A8 /**< Type ID1 Match reg */ +#define XEMACPS_MATCH2_OFFSET 0x000000AC /**< Type ID2 Match reg */ +#define XEMACPS_MATCH3_OFFSET 0x000000B0 /**< Type ID3 Match reg */ +#define XEMACPS_MATCH4_OFFSET 0x000000B4 /**< Type ID4 Match reg */ + +#define XEMACPS_STRETCH_OFFSET 0x000000BC /**< IPG Stretch reg */ + +#define XEMACPS_OCTTXL_OFFSET 0x00000100 /**< Octects transmitted Low + reg */ +#define XEMACPS_OCTTXH_OFFSET 0x00000104 /**< Octects transmitted High + reg */ + +#define XEMACPS_TXCNT_OFFSET 0x00000108 /**< Error-free Frmaes + transmitted counter */ +#define XEMACPS_TXBCCNT_OFFSET 0x0000010C /**< Error-free Broadcast + Frames counter*/ +#define XEMACPS_TXMCCNT_OFFSET 0x00000110 /**< Error-free Multicast + Frame counter */ +#define XEMACPS_TXPAUSECNT_OFFSET 0x00000114 /**< Pause Frames Transmitted + Counter */ +#define XEMACPS_TX64CNT_OFFSET 0x00000118 /**< Error-free 64 byte Frames + Transmitted counter */ +#define XEMACPS_TX65CNT_OFFSET 0x0000011C /**< Error-free 65-127 byte + Frames Transmitted + counter */ +#define XEMACPS_TX128CNT_OFFSET 0x00000120 /**< Error-free 128-255 byte + Frames Transmitted + counter*/ +#define XEMACPS_TX256CNT_OFFSET 0x00000124 /**< Error-free 256-511 byte + Frames transmitted + counter */ +#define XEMACPS_TX512CNT_OFFSET 0x00000128 /**< Error-free 512-1023 byte + Frames transmitted + counter */ +#define XEMACPS_TX1024CNT_OFFSET 0x0000012C /**< Error-free 1024-1518 byte + Frames transmitted + counter */ +#define XEMACPS_TX1519CNT_OFFSET 0x00000130 /**< Error-free larger than + 1519 byte Frames + transmitted counter */ +#define XEMACPS_TXURUNCNT_OFFSET 0x00000134 /**< TX under run error + counter */ + +#define XEMACPS_SNGLCOLLCNT_OFFSET 0x00000138 /**< Single Collision Frame + Counter */ +#define XEMACPS_MULTICOLLCNT_OFFSET 0x0000013C /**< Multiple Collision Frame + Counter */ +#define XEMACPS_EXCESSCOLLCNT_OFFSET 0x00000140 /**< Excessive Collision Frame + Counter */ +#define XEMACPS_LATECOLLCNT_OFFSET 0x00000144 /**< Late Collision Frame + Counter */ +#define XEMACPS_TXDEFERCNT_OFFSET 0x00000148 /**< Deferred Transmission + Frame Counter */ +#define XEMACPS_TXCSENSECNT_OFFSET 0x0000014C /**< Transmit Carrier Sense + Error Counter */ + +#define XEMACPS_OCTRXL_OFFSET 0x00000150 /**< Octects Received register + Low */ +#define XEMACPS_OCTRXH_OFFSET 0x00000154 /**< Octects Received register + High */ + +#define XEMACPS_RXCNT_OFFSET 0x00000158 /**< Error-free Frames + Received Counter */ +#define XEMACPS_RXBROADCNT_OFFSET 0x0000015C /**< Error-free Broadcast + Frames Received Counter */ +#define XEMACPS_RXMULTICNT_OFFSET 0x00000160 /**< Error-free Multicast + Frames Received Counter */ +#define XEMACPS_RXPAUSECNT_OFFSET 0x00000164 /**< Pause Frames + Received Counter */ +#define XEMACPS_RX64CNT_OFFSET 0x00000168 /**< Error-free 64 byte Frames + Received Counter */ +#define XEMACPS_RX65CNT_OFFSET 0x0000016C /**< Error-free 65-127 byte + Frames Received Counter */ +#define XEMACPS_RX128CNT_OFFSET 0x00000170 /**< Error-free 128-255 byte + Frames Received Counter */ +#define XEMACPS_RX256CNT_OFFSET 0x00000174 /**< Error-free 256-512 byte + Frames Received Counter */ +#define XEMACPS_RX512CNT_OFFSET 0x00000178 /**< Error-free 512-1023 byte + Frames Received Counter */ +#define XEMACPS_RX1024CNT_OFFSET 0x0000017C /**< Error-free 1024-1518 byte + Frames Received Counter */ +#define XEMACPS_RX1519CNT_OFFSET 0x00000180 /**< Error-free 1519-max byte + Frames Received Counter */ +#define XEMACPS_RXUNDRCNT_OFFSET 0x00000184 /**< Undersize Frames Received + Counter */ +#define XEMACPS_RXOVRCNT_OFFSET 0x00000188 /**< Oversize Frames Received + Counter */ +#define XEMACPS_RXJABCNT_OFFSET 0x0000018C /**< Jabbers Received + Counter */ +#define XEMACPS_RXFCSCNT_OFFSET 0x00000190 /**< Frame Check Sequence + Error Counter */ +#define XEMACPS_RXLENGTHCNT_OFFSET 0x00000194 /**< Length Field Error + Counter */ +#define XEMACPS_RXSYMBCNT_OFFSET 0x00000198 /**< Symbol Error Counter */ +#define XEMACPS_RXALIGNCNT_OFFSET 0x0000019C /**< Alignment Error Counter */ +#define XEMACPS_RXRESERRCNT_OFFSET 0x000001A0 /**< Receive Resource Error + Counter */ +#define XEMACPS_RXORCNT_OFFSET 0x000001A4 /**< Receive Overrun Counter */ +#define XEMACPS_RXIPCCNT_OFFSET 0x000001A8 /**< IP header Checksum Error + Counter */ +#define XEMACPS_RXTCPCCNT_OFFSET 0x000001AC /**< TCP Checksum Error + Counter */ +#define XEMACPS_RXUDPCCNT_OFFSET 0x000001B0 /**< UDP Checksum Error + Counter */ +#define XEMACPS_LAST_OFFSET 0x000001B4 /**< Last statistic counter + offset, for clearing */ + +#define XEMACPS_1588_SEC_OFFSET 0x000001D0 /**< 1588 second counter */ +#define XEMACPS_1588_NANOSEC_OFFSET 0x000001D4 /**< 1588 nanosecond counter */ +#define XEMACPS_1588_ADJ_OFFSET 0x000001D8 /**< 1588 nanosecond + adjustment counter */ +#define XEMACPS_1588_INC_OFFSET 0x000001DC /**< 1588 nanosecond + increment counter */ +#define XEMACPS_PTP_TXSEC_OFFSET 0x000001E0 /**< 1588 PTP transmit second + counter */ +#define XEMACPS_PTP_TXNANOSEC_OFFSET 0x000001E4 /**< 1588 PTP transmit + nanosecond counter */ +#define XEMACPS_PTP_RXSEC_OFFSET 0x000001E8 /**< 1588 PTP receive second + counter */ +#define XEMACPS_PTP_RXNANOSEC_OFFSET 0x000001EC /**< 1588 PTP receive + nanosecond counter */ +#define XEMACPS_PTPP_TXSEC_OFFSET 0x000001F0 /**< 1588 PTP peer transmit + second counter */ +#define XEMACPS_PTPP_TXNANOSEC_OFFSET 0x000001F4 /**< 1588 PTP peer transmit + nanosecond counter */ +#define XEMACPS_PTPP_RXSEC_OFFSET 0x000001F8 /**< 1588 PTP peer receive + second counter */ +#define XEMACPS_PTPP_RXNANOSEC_OFFSET 0x000001FC /**< 1588 PTP peer receive + nanosecond counter */ + +/* Define some bit positions for registers. */ + +/** @name network control register bit definitions + * @{ + */ +#define XEMACPS_NWCTRL_FLUSH_DPRAM_MASK 0x00040000 /**< Flush a packet from + Rx SRAM */ +#define XEMACPS_NWCTRL_ZEROPAUSETX_MASK 0x00000800 /**< Transmit zero quantum + pause frame */ +#define XEMACPS_NWCTRL_PAUSETX_MASK 0x00000800 /**< Transmit pause frame */ +#define XEMACPS_NWCTRL_HALTTX_MASK 0x00000400 /**< Halt transmission + after current frame */ +#define XEMACPS_NWCTRL_STARTTX_MASK 0x00000200 /**< Start tx (tx_go) */ + +#define XEMACPS_NWCTRL_STATWEN_MASK 0x00000080 /**< Enable writing to + stat counters */ +#define XEMACPS_NWCTRL_STATINC_MASK 0x00000040 /**< Increment statistic + registers */ +#define XEMACPS_NWCTRL_STATCLR_MASK 0x00000020 /**< Clear statistic + registers */ +#define XEMACPS_NWCTRL_MDEN_MASK 0x00000010 /**< Enable MDIO port */ +#define XEMACPS_NWCTRL_TXEN_MASK 0x00000008 /**< Enable transmit */ +#define XEMACPS_NWCTRL_RXEN_MASK 0x00000004 /**< Enable receive */ +#define XEMACPS_NWCTRL_LOOPEN_MASK 0x00000002 /**< local loopback */ +/*@}*/ + +/** @name network configuration register bit definitions + * @{ + */ +#define XEMACPS_NWCFG_BADPREAMBEN_MASK 0x20000000 /**< disable rejection of + non-standard preamble */ +#define XEMACPS_NWCFG_IPDSTRETCH_MASK 0x10000000 /**< enable transmit IPG */ +#define XEMACPS_NWCFG_FCSIGNORE_MASK 0x04000000 /**< disable rejection of + FCS error */ +#define XEMACPS_NWCFG_HDRXEN_MASK 0x02000000 /**< RX half duplex */ +#define XEMACPS_NWCFG_RXCHKSUMEN_MASK 0x01000000 /**< enable RX checksum + offload */ +#define XEMACPS_NWCFG_PAUSECOPYDI_MASK 0x00800000 /**< Do not copy pause + Frames to memory */ +#define XEMACPS_NWCFG_MDC_SHIFT_MASK 18 /**< shift bits for MDC */ +#define XEMACPS_NWCFG_MDCCLKDIV_MASK 0x001C0000 /**< MDC Mask PCLK divisor */ +#define XEMACPS_NWCFG_FCSREM_MASK 0x00020000 /**< Discard FCS from + received frames */ +#define XEMACPS_NWCFG_LENGTHERRDSCRD_MASK 0x00010000 +/**< RX length error discard */ +#define XEMACPS_NWCFG_RXOFFS_MASK 0x0000C000 /**< RX buffer offset */ +#define XEMACPS_NWCFG_PAUSEEN_MASK 0x00002000 /**< Enable pause RX */ +#define XEMACPS_NWCFG_RETRYTESTEN_MASK 0x00001000 /**< Retry test */ +#define XEMACPS_NWCFG_EXTADDRMATCHEN_MASK 0x00000200 +/**< External address match enable */ +#define XEMACPS_NWCFG_1000_MASK 0x00000400 /**< 1000 Mbps */ +#define XEMACPS_NWCFG_1536RXEN_MASK 0x00000100 /**< Enable 1536 byte + frames reception */ +#define XEMACPS_NWCFG_UCASTHASHEN_MASK 0x00000080 /**< Receive unicast hash + frames */ +#define XEMACPS_NWCFG_MCASTHASHEN_MASK 0x00000040 /**< Receive multicast hash + frames */ +#define XEMACPS_NWCFG_BCASTDI_MASK 0x00000020 /**< Do not receive + broadcast frames */ +#define XEMACPS_NWCFG_COPYALLEN_MASK 0x00000010 /**< Copy all frames */ +#define XEMACPS_NWCFG_JUMBO_MASK 0x00000008 /**< Jumbo frames */ +#define XEMACPS_NWCFG_NVLANDISC_MASK 0x00000004 /**< Receive only VLAN + frames */ +#define XEMACPS_NWCFG_FDEN_MASK 0x00000002 /**< full duplex */ +#define XEMACPS_NWCFG_100_MASK 0x00000001 /**< 100 Mbps */ +#define XEMACPS_NWCFG_RESET_MASK 0x00080000 /**< reset value */ +/*@}*/ + +/** @name network status register bit definitaions + * @{ + */ +#define XEMACPS_NWSR_MDIOIDLE_MASK 0x00000004 /**< PHY management idle */ +#define XEMACPS_NWSR_MDIO_MASK 0x00000002 /**< Status of mdio_in */ +/*@}*/ + + +/** @name MAC address register word 1 mask + * @{ + */ +#define XEMACPS_LADDR_MACH_MASK 0x0000FFFF /**< Address bits[47:32] + bit[31:0] are in BOTTOM */ +/*@}*/ + + +/** @name DMA control register bit definitions + * @{ + */ +#define XEMACPS_DMACR_RXBUF_MASK 0x00FF0000 /**< Mask bit for RX buffer + size */ +#define XEMACPS_DMACR_RXBUF_SHIFT 16 /**< Shift bit for RX buffer + size */ +#define XEMACPS_DMACR_TCPCKSUM_MASK 0x00000800 /**< enable/disable TX + checksum offload */ +#define XEMACPS_DMACR_TXSIZE_MASK 0x00000400 /**< TX buffer memory size */ +#define XEMACPS_DMACR_RXSIZE_MASK 0x00000300 /**< RX buffer memory size */ +#define XEMACPS_DMACR_ENDIAN_MASK 0x00000080 /**< endian configuration */ +#define XEMACPS_DMACR_BLENGTH_MASK 0x0000001F /**< buffer burst length */ +#define XEMACPS_DMACR_SINGLE_AHB_BURST 0x00000001 /**< single AHB bursts */ +#define XEMACPS_DMACR_INCR4_AHB_BURST 0x00000004 /**< 4 bytes AHB bursts */ +#define XEMACPS_DMACR_INCR8_AHB_BURST 0x00000008 /**< 8 bytes AHB bursts */ +#define XEMACPS_DMACR_INCR16_AHB_BURST 0x00000010 /**< 16 bytes AHB bursts */ +/*@}*/ + +/** @name transmit status register bit definitions + * @{ + */ +#define XEMACPS_TXSR_HRESPNOK_MASK 0x00000100 /**< Transmit hresp not OK */ +#define XEMACPS_TXSR_URUN_MASK 0x00000040 /**< Transmit underrun */ +#define XEMACPS_TXSR_TXCOMPL_MASK 0x00000020 /**< Transmit completed OK */ +#define XEMACPS_TXSR_BUFEXH_MASK 0x00000010 /**< Transmit buffs exhausted + mid frame */ +#define XEMACPS_TXSR_TXGO_MASK 0x00000008 /**< Status of go flag */ +#define XEMACPS_TXSR_RXOVR_MASK 0x00000004 /**< Retry limit exceeded */ +#define XEMACPS_TXSR_FRAMERX_MASK 0x00000002 /**< Collision tx frame */ +#define XEMACPS_TXSR_USEDREAD_MASK 0x00000001 /**< TX buffer used bit set */ + +#define XEMACPS_TXSR_ERROR_MASK (XEMACPS_TXSR_HRESPNOK_MASK | \ + XEMACPS_TXSR_URUN_MASK | \ + XEMACPS_TXSR_BUFEXH_MASK | \ + XEMACPS_TXSR_RXOVR_MASK | \ + XEMACPS_TXSR_FRAMERX_MASK | \ + XEMACPS_TXSR_USEDREAD_MASK) +/*@}*/ + +/** + * @name receive status register bit definitions + * @{ + */ +#define XEMACPS_RXSR_HRESPNOK_MASK 0x00000008 /**< Receive hresp not OK */ +#define XEMACPS_RXSR_RXOVR_MASK 0x00000004 /**< Receive overrun */ +#define XEMACPS_RXSR_FRAMERX_MASK 0x00000002 /**< Frame received OK */ +#define XEMACPS_RXSR_BUFFNA_MASK 0x00000001 /**< RX buffer used bit set */ + +#define XEMACPS_RXSR_ERROR_MASK (XEMACPS_RXSR_HRESPNOK_MASK | \ + XEMACPS_RXSR_RXOVR_MASK | \ + XEMACPS_RXSR_BUFFNA_MASK) +/*@}*/ + +/** + * @name interrupts bit definitions + * Bits definitions are same in XEMACPS_ISR_OFFSET, + * XEMACPS_IER_OFFSET, XEMACPS_IDR_OFFSET, and XEMACPS_IMR_OFFSET + * @{ + */ +#define XEMACPS_IXR_PTPPSTX_MASK 0x02000000 /**< PTP Psync transmitted */ +#define XEMACPS_IXR_PTPPDRTX_MASK 0x01000000 /**< PTP Pdelay_req + transmitted */ +#define XEMACPS_IXR_PTPSTX_MASK 0x00800000 /**< PTP Sync transmitted */ +#define XEMACPS_IXR_PTPDRTX_MASK 0x00400000 /**< PTP Delay_req transmitted + */ +#define XEMACPS_IXR_PTPPSRX_MASK 0x00200000 /**< PTP Psync received */ +#define XEMACPS_IXR_PTPPDRRX_MASK 0x00100000 /**< PTP Pdelay_req received */ +#define XEMACPS_IXR_PTPSRX_MASK 0x00080000 /**< PTP Sync received */ +#define XEMACPS_IXR_PTPDRRX_MASK 0x00040000 /**< PTP Delay_req received */ +#define XEMACPS_IXR_PAUSETX_MASK 0x00004000 /**< Pause frame transmitted */ +#define XEMACPS_IXR_PAUSEZERO_MASK 0x00002000 /**< Pause time has reached + zero */ +#define XEMACPS_IXR_PAUSENZERO_MASK 0x00001000 /**< Pause frame received */ +#define XEMACPS_IXR_HRESPNOK_MASK 0x00000800 /**< hresp not ok */ +#define XEMACPS_IXR_RXOVR_MASK 0x00000400 /**< Receive overrun occurred */ +#define XEMACPS_IXR_TXCOMPL_MASK 0x00000080 /**< Frame transmitted ok */ +#define XEMACPS_IXR_TXEXH_MASK 0x00000040 /**< Transmit err occurred or + no buffers*/ +#define XEMACPS_IXR_RETRY_MASK 0x00000020 /**< Retry limit exceeded */ +#define XEMACPS_IXR_URUN_MASK 0x00000010 /**< Transmit underrun */ +#define XEMACPS_IXR_TXUSED_MASK 0x00000008 /**< Tx buffer used bit read */ +#define XEMACPS_IXR_RXUSED_MASK 0x00000004 /**< Rx buffer used bit read */ +#define XEMACPS_IXR_FRAMERX_MASK 0x00000002 /**< Frame received ok */ +#define XEMACPS_IXR_MGMNT_MASK 0x00000001 /**< PHY management complete */ +#define XEMACPS_IXR_ALL_MASK 0x00007FFF /**< Everything! */ + +#define XEMACPS_IXR_TX_ERR_MASK (XEMACPS_IXR_TXEXH_MASK | \ + XEMACPS_IXR_RETRY_MASK | \ + XEMACPS_IXR_URUN_MASK | \ + XEMACPS_IXR_TXUSED_MASK) + + +#define XEMACPS_IXR_RX_ERR_MASK (XEMACPS_IXR_HRESPNOK_MASK | \ + XEMACPS_IXR_RXUSED_MASK | \ + XEMACPS_IXR_RXOVR_MASK) + +/*@}*/ + +/** @name PHY Maintenance bit definitions + * @{ + */ +#define XEMACPS_PHYMNTNC_OP_MASK 0x40020000 /**< operation mask bits */ +#define XEMACPS_PHYMNTNC_OP_R_MASK 0x20000000 /**< read operation */ +#define XEMACPS_PHYMNTNC_OP_W_MASK 0x10000000 /**< write operation */ +#define XEMACPS_PHYMNTNC_ADDR_MASK 0x0F800000 /**< Address bits */ +#define XEMACPS_PHYMNTNC_REG_MASK 0x007C0000 /**< register bits */ +#define XEMACPS_PHYMNTNC_DATA_MASK 0x00000FFF /**< data bits */ +#define XEMACPS_PHYMNTNC_PHYAD_SHIFT_MASK 23 /**< Shift bits for PHYAD */ +#define XEMACPS_PHYMNTNC_PHREG_SHIFT_MASK 18 /**< Shift bits for PHREG */ +/*@}*/ + +/* Transmit buffer descriptor status words offset + * @{ + */ +#define XEMACPS_BD_ADDR_OFFSET 0x00000000 /**< word 0/addr of BDs */ +#define XEMACPS_BD_STAT_OFFSET 0x00000004 /**< word 1/status of BDs */ +/* + * @} + */ + +/* Transmit buffer descriptor status words bit positions. + * Transmit buffer descriptor consists of two 32-bit registers, + * the first - word0 contains a 32-bit address pointing to the location of + * the transmit data. + * The following register - word1, consists of various information to control + * the XEmacPs transmit process. After transmit, this is updated with status + * information, whether the frame was transmitted OK or why it had failed. + * @{ + */ +#define XEMACPS_TXBUF_USED_MASK 0x80000000 /**< Used bit. */ +#define XEMACPS_TXBUF_WRAP_MASK 0x40000000 /**< Wrap bit, last descriptor */ +#define XEMACPS_TXBUF_RETRY_MASK 0x20000000 /**< Retry limit exceeded */ +#define XEMACPS_TXBUF_URUN_MASK 0x10000000 /**< Transmit underrun occurred */ +#define XEMACPS_TXBUF_EXH_MASK 0x08000000 /**< Buffers exhausted */ +#define XEMACPS_TXBUF_TCP_MASK 0x04000000 /**< Late collision. */ +#define XEMACPS_TXBUF_NOCRC_MASK 0x00010000 /**< No CRC */ +#define XEMACPS_TXBUF_LAST_MASK 0x00008000 /**< Last buffer */ +#define XEMACPS_TXBUF_LEN_MASK 0x00003FFF /**< Mask for length field */ +/* + * @} + */ + +/* Receive buffer descriptor status words bit positions. + * Receive buffer descriptor consists of two 32-bit registers, + * the first - word0 contains a 32-bit word aligned address pointing to the + * address of the buffer. The lower two bits make up the wrap bit indicating + * the last descriptor and the ownership bit to indicate it has been used by + * the XEmacPs. + * The following register - word1, contains status information regarding why + * the frame was received (the filter match condition) as well as other + * useful info. + * @{ + */ +#define XEMACPS_RXBUF_BCAST_MASK 0x80000000 /**< Broadcast frame */ +#define XEMACPS_RXBUF_MULTIHASH_MASK 0x40000000 /**< Multicast hashed frame */ +#define XEMACPS_RXBUF_UNIHASH_MASK 0x20000000 /**< Unicast hashed frame */ +#define XEMACPS_RXBUF_EXH_MASK 0x08000000 /**< buffer exhausted */ +#define XEMACPS_RXBUF_AMATCH_MASK 0x06000000 /**< Specific address + matched */ +#define XEMACPS_RXBUF_IDFOUND_MASK 0x01000000 /**< Type ID matched */ +#define XEMACPS_RXBUF_IDMATCH_MASK 0x00C00000 /**< ID matched mask */ +#define XEMACPS_RXBUF_VLAN_MASK 0x00200000 /**< VLAN tagged */ +#define XEMACPS_RXBUF_PRI_MASK 0x00100000 /**< Priority tagged */ +#define XEMACPS_RXBUF_VPRI_MASK 0x000E0000 /**< Vlan priority */ +#define XEMACPS_RXBUF_CFI_MASK 0x00010000 /**< CFI frame */ +#define XEMACPS_RXBUF_EOF_MASK 0x00008000 /**< End of frame. */ +#define XEMACPS_RXBUF_SOF_MASK 0x00004000 /**< Start of frame. */ +#define XEMACPS_RXBUF_LEN_MASK 0x00003FFF /**< Mask for length field */ + +#define XEMACPS_RXBUF_WRAP_MASK 0x00000002 /**< Wrap bit, last BD */ +#define XEMACPS_RXBUF_NEW_MASK 0x00000001 /**< Used bit.. */ +#define XEMACPS_RXBUF_ADD_MASK 0xFFFFFFFC /**< Mask for address */ +/* + * @} + */ + +/* + * Define appropriate I/O access method to mempry mapped I/O or other + * intarfce if necessary. + */ + +#define XEmacPs_In32 Xil_In32 +#define XEmacPs_Out32 Xil_Out32 + + +/****************************************************************************/ +/** +* +* Read the given register. +* +* @param BaseAddress is the base address of the device +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note +* C-style signature: +* u32 XEmacPs_ReadReg(u32 BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XEmacPs_ReadReg(BaseAddress, RegOffset) \ + XEmacPs_In32((BaseAddress) + (RegOffset)) + + +/****************************************************************************/ +/** +* +* Write the given register. +* +* @param BaseAddress is the base address of the device +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note +* C-style signature: +* void XEmacPs_WriteReg(u32 BaseAddress, u32 RegOffset, +* u32 Data) +* +*****************************************************************************/ +#define XEmacPs_WriteReg(BaseAddress, RegOffset, Data) \ + XEmacPs_Out32((BaseAddress) + (RegOffset), (Data)) + +/************************** Function Prototypes *****************************/ +/* + * Perform reset operation to the emacps interface + */ +void XEmacPs_ResetHw(u32 BaseAddr); + +#ifdef __cplusplus + } +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv.h new file mode 100755 index 000000000..27cb76810 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv.h @@ -0,0 +1,177 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv.h +* +* Defines common services that are typically found in a host operating. +* environment. This include file simply includes an OS specific file based +* on the compile-time constant BUILD_ENV_*, where * is the name of the target +* environment. +* +* All services are defined as macros. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b ch 10/24/02 Added XENV_LINUX +* 1.00a rmm 04/17/02 First release +* </pre> +* +******************************************************************************/ + +#ifndef XENV_H /* prevent circular inclusions */ +#define XENV_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Select which target environment we are operating under + */ + +/* VxWorks target environment */ +#if defined XENV_VXWORKS +#include "xenv_vxworks.h" + +/* Linux target environment */ +#elif defined XENV_LINUX +#include "xenv_linux.h" + +/* Unit test environment */ +#elif defined XENV_UNITTEST +#include "ut_xenv.h" + +/* Integration test environment */ +#elif defined XENV_INTTEST +#include "int_xenv.h" + +/* Standalone environment selected */ +#else +#include "xenv_standalone.h" +#endif + + +/* + * The following comments specify the types and macro wrappers that are + * expected to be defined by the target specific header files + */ + +/**************************** Type Definitions *******************************/ + +/*****************************************************************************/ +/** + * + * XENV_TIME_STAMP + * + * A structure that contains a time stamp used by other time stamp macros + * defined below. This structure is processor dependent. + */ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** + * + * XENV_MEM_COPY(void *DestPtr, void *SrcPtr, unsigned Bytes) + * + * Copies a non-overlapping block of memory. + * + * @param DestPtr is the destination address to copy data to. + * @param SrcPtr is the source address to copy data from. + * @param Bytes is the number of bytes to copy. + * + * @return None + */ + +/*****************************************************************************/ +/** + * + * XENV_MEM_FILL(void *DestPtr, char Data, unsigned Bytes) + * + * Fills an area of memory with constant data. + * + * @param DestPtr is the destination address to set. + * @param Data contains the value to set. + * @param Bytes is the number of bytes to set. + * + * @return None + */ +/*****************************************************************************/ +/** + * + * XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr) + * + * Samples the processor's or external timer's time base counter. + * + * @param StampPtr is the storage for the retrieved time stamp. + * + * @return None + */ + +/*****************************************************************************/ +/** + * + * XENV_TIME_STAMP_DELTA_US(XTIME_STAMP *Stamp1Ptr, XTIME_STAMP* Stamp2Ptr) + * + * Computes the delta between the two time stamps. + * + * @param Stamp1Ptr - First sampled time stamp. + * @param Stamp1Ptr - Sedond sampled time stamp. + * + * @return An unsigned int value with units of microseconds. + */ + +/*****************************************************************************/ +/** + * + * XENV_TIME_STAMP_DELTA_MS(XTIME_STAMP *Stamp1Ptr, XTIME_STAMP* Stamp2Ptr) + * + * Computes the delta between the two time stamps. + * + * @param Stamp1Ptr - First sampled time stamp. + * @param Stamp1Ptr - Sedond sampled time stamp. + * + * @return An unsigned int value with units of milliseconds. + */ + +/*****************************************************************************//** + * + * XENV_USLEEP(unsigned delay) + * + * Delay the specified number of microseconds. + * + * @param delay is the number of microseconds to delay. + * + * @return None + */ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_none.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_none.h new file mode 100755 index 000000000..bc837860f --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_none.h @@ -0,0 +1,41 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv_none.h +* +* This is a legacy file kept for backwards compatibility. +* +* Please modify your code to #include "xenv_standalone.h" instead. +* +* +******************************************************************************/ + +#warning ******************************************************************** +#warning * +#warning * Use of xenv_none.h deprecated. +#warning * Please include the new xenv_standalone.h file instead. +#warning * +#warning ******************************************************************** + +#include "xenv_standalone.h" + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_standalone.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_standalone.h new file mode 100644 index 000000000..f2b2b6887 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_standalone.h @@ -0,0 +1,356 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2008 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv_standalone.h +* +* Defines common services specified by xenv.h. +* +* @note +* This file is not intended to be included directly by driver code. +* Instead, the generic xenv.h file is intended to be included by driver +* code. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a wgr 02/28/07 Added cache handling macros. +* 1.00a wgr 02/27/07 Simplified code. Deprecated old-style macro names. +* 1.00a rmm 01/24/06 Implemented XENV_USLEEP. Assume implementation is being +* used under Xilinx standalone BSP. +* 1.00a xd 11/03/04 Improved support for doxygen. +* 1.00a rmm 03/21/02 First release +* 1.00a wgr 03/22/07 Converted to new coding style. +* 1.00a rpm 06/29/07 Added udelay macro for standalone +* 1.00a xd 07/19/07 Included xparameters.h as XPAR_ constants are referred +* to in MICROBLAZE section +* 1.00a ecm 09/19/08 updated for v7.20 of Microblaze, new functionality +* +* </pre> +* +* +******************************************************************************/ + +#ifndef XENV_STANDALONE_H +#define XENV_STANDALONE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +/****************************************************************************** + * + * Get the processor dependent includes + * + ******************************************************************************/ + +#include <string.h> + +#if defined __MICROBLAZE__ +# include "mb_interface.h" +# include "xparameters.h" /* XPAR constants used below in MB section */ + +#elif defined __PPC__ +# include "sleep.h" +# include "xcache_l.h" /* also include xcache_l.h for caching macros */ +#endif + +/****************************************************************************** + * + * MEMCPY / MEMSET related macros. + * + * The following are straight forward implementations of memset and memcpy. + * + * NOTE: memcpy may not work if source and target memory area are overlapping. + * + ******************************************************************************/ +/*****************************************************************************/ +/** + * + * Copies a non-overlapping block of memory. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param SrcPtr + * Source address to copy data from. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + * @note + * The use of XENV_MEM_COPY is deprecated. Use memcpy() instead. + * + * @note + * This implemention MAY BREAK work if source and target memory + * area are overlapping. + * + *****************************************************************************/ + +#define XENV_MEM_COPY(DestPtr, SrcPtr, Bytes) \ + memcpy((void *) DestPtr, (const void *) SrcPtr, (size_t) Bytes) + + + +/*****************************************************************************/ +/** + * + * Fills an area of memory with constant data. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param Data + * Value to set. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + * @note + * The use of XENV_MEM_FILL is deprecated. Use memset() instead. + * + *****************************************************************************/ + +#define XENV_MEM_FILL(DestPtr, Data, Bytes) \ + memset((void *) DestPtr, (int) Data, (size_t) Bytes) + + + +/****************************************************************************** + * + * TIME related macros + * + ******************************************************************************/ + +/** + * A structure that contains a time stamp used by other time stamp macros + * defined below. This structure is processor dependent. + */ +typedef int XENV_TIME_STAMP; + +/*****************************************************************************/ +/** + * + * Time is derived from the 64 bit PPC timebase register + * + * @param StampPtr is the storage for the retrieved time stamp. + * + * @return None. + * + * @note + * + * Signature: void XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr) + * <br><br> + * This macro must be implemented by the user. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_GET(StampPtr) + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note + * + * This macro must be implemented by the user. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_US(Stamp1Ptr, Stamp2Ptr) (0) + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note + * + * This macro must be implemented by the user. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_MS(Stamp1Ptr, Stamp2Ptr) (0) + +/*****************************************************************************/ +/** + * XENV_USLEEP(unsigned delay) + * + * Delay the specified number of microseconds. Not implemented without OS + * support. + * + * @param delay + * Number of microseconds to delay. + * + * @return None. + * + *****************************************************************************/ + +#ifdef __PPC__ +#define XENV_USLEEP(delay) usleep(delay) +#define udelay(delay) usleep(delay) +#else +#define XENV_USLEEP(delay) +#define udelay(delay) +#endif + + +/****************************************************************************** + * + * CACHE handling macros / mappings + * + ******************************************************************************/ +/****************************************************************************** + * + * Processor independent macros + * + ******************************************************************************/ + +#define XCACHE_ENABLE_CACHE() \ + { XCACHE_ENABLE_DCACHE(); XCACHE_ENABLE_ICACHE(); } + +#define XCACHE_DISABLE_CACHE() \ + { XCACHE_DISABLE_DCACHE(); XCACHE_DISABLE_ICACHE(); } + + +/****************************************************************************** + * + * MicroBlaze case + * + * NOTE: Currently the following macros will only work on systems that contain + * only ONE MicroBlaze processor. Also, the macros will only be enabled if the + * system is built using a xparameters.h file. + * + ******************************************************************************/ + +#if defined __MICROBLAZE__ + +/* Check if MicroBlaze data cache was built into the core. + */ +#if (XPAR_MICROBLAZE_USE_DCACHE == 1) +# define XCACHE_ENABLE_DCACHE() microblaze_enable_dcache() +# define XCACHE_DISABLE_DCACHE() microblaze_disable_dcache() +# define XCACHE_INVALIDATE_DCACHE() microblaze_invalidate_dcache() + +# define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) \ + microblaze_invalidate_dcache_range((int)(Addr), (int)(Len)) + +#if (XPAR_MICROBLAZE_DCACHE_USE_WRITEBACK == 1) +# define XCACHE_FLUSH_DCACHE() microblaze_flush_dcache() +# define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + microblaze_flush_dcache_range((int)(Addr), (int)(Len)) +#else +# define XCACHE_FLUSH_DCACHE() microblaze_invalidate_dcache() +# define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + microblaze_invalidate_dcache_range((int)(Addr), (int)(Len)) +#endif /*XPAR_MICROBLAZE_DCACHE_USE_WRITEBACK*/ + +#else +# define XCACHE_ENABLE_DCACHE() +# define XCACHE_DISABLE_DCACHE() +# define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) +# define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) +#endif /*XPAR_MICROBLAZE_USE_DCACHE*/ + + +/* Check if MicroBlaze instruction cache was built into the core. + */ +#if (XPAR_MICROBLAZE_USE_ICACHE == 1) +# define XCACHE_ENABLE_ICACHE() microblaze_enable_icache() +# define XCACHE_DISABLE_ICACHE() microblaze_disable_icache() + +# define XCACHE_INVALIDATE_ICACHE() microblaze_invalidate_icache() + +# define XCACHE_INVALIDATE_ICACHE_RANGE(Addr, Len) \ + microblaze_invalidate_icache_range((int)(Addr), (int)(Len)) + +#else +# define XCACHE_ENABLE_ICACHE() +# define XCACHE_DISABLE_ICACHE() +#endif /*XPAR_MICROBLAZE_USE_ICACHE*/ + + +/****************************************************************************** + * + * PowerPC case + * + * Note that the XCACHE_ENABLE_xxx functions are hardcoded to enable a + * specific memory region (0x80000001). Each bit (0-30) in the regions + * bitmask stands for 128MB of memory. Bit 31 stands for the upper 2GB + * range. + * + * regions --> cached address range + * ------------|-------------------------------------------------- + * 0x80000000 | [0, 0x7FFFFFF] + * 0x00000001 | [0xF8000000, 0xFFFFFFFF] + * 0x80000001 | [0, 0x7FFFFFF],[0xF8000000, 0xFFFFFFFF] + * + ******************************************************************************/ + +#elif defined __PPC__ + +#define XCACHE_ENABLE_DCACHE() XCache_EnableDCache(0x80000001) +#define XCACHE_DISABLE_DCACHE() XCache_DisableDCache() +#define XCACHE_ENABLE_ICACHE() XCache_EnableICache(0x80000001) +#define XCACHE_DISABLE_ICACHE() XCache_DisableICache() + +#define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) \ + XCache_InvalidateDCacheRange((unsigned int)(Addr), (unsigned)(Len)) + +#define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + XCache_FlushDCacheRange((unsigned int)(Addr), (unsigned)(Len)) + +#define XCACHE_INVALIDATE_ICACHE() XCache_InvalidateICache() + + +/****************************************************************************** + * + * Unknown processor / architecture + * + ******************************************************************************/ + +#else +/* #error "Unknown processor / architecture. Must be MicroBlaze or PowerPC." */ +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* #ifndef XENV_STANDALONE_H */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_vxworks.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_vxworks.h new file mode 100755 index 000000000..4269f10e0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xenv_vxworks.h @@ -0,0 +1,258 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2007 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv_vxworks.h +* +* Defines common services specified by xenv.h. +* +* @note +* This file is not intended to be included directly by driver code. +* Instead, the generic xenv.h file is intended to be included by driver +* code. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a wgr 02/28/07 Added cache handling macros. +* 1.00a wgr 02/27/07 Simplified code. Deprecated old-style macro names. +* 1.00a xd 11/03/04 Improved support for doxygen. +* rmm 09/13/03 CR 177068: Fix compiler warning in XENV_MEM_FILL +* rmm 10/24/02 Added XENV_USLEEP macro +* 1.00a rmm 07/16/01 First release +* 1.10a wgr 03/22/07 Converted to new coding style. +* </pre> +* +* +******************************************************************************/ + +#ifndef XENV_VXWORKS_H +#define XENV_VXWORKS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xbasic_types.h" +#include "vxWorks.h" +#include "vxLib.h" +#include "sysLibExtra.h" +#include "cacheLib.h" +#include <string.h> + +/*****************************************************************************/ +/** + * + * Copies a non-overlapping block of memory. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param SrcPtr + * Source address to copy data from. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + * @note XENV_MEM_COPY is deprecated. Use memcpy() instead. + * + *****************************************************************************/ + +#define XENV_MEM_COPY(DestPtr, SrcPtr, Bytes) \ + memcpy((void *) DestPtr, (const void *) SrcPtr, (size_t) Bytes) + + +/*****************************************************************************/ +/** + * + * Fills an area of memory with constant data. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param Data + * Value to set. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + * @note XENV_MEM_FILL is deprecated. Use memset() instead. + * + *****************************************************************************/ + +#define XENV_MEM_FILL(DestPtr, Data, Bytes) \ + memset((void *) DestPtr, (int) Data, (size_t) Bytes) + + +#if (CPU_FAMILY==PPC) +/** + * A structure that contains a time stamp used by other time stamp macros + * defined below. This structure is processor dependent. + */ +typedef struct +{ + u32 TimeBaseUpper; + u32 TimeBaseLower; +} XENV_TIME_STAMP; + +/*****************************************************************************/ +/** + * + * Time is derived from the 64 bit PPC timebase register + * + * @param StampPtr is the storage for the retrieved time stamp. + * + * @return None. + * + * @note + * + * Signature: void XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr) + * + *****************************************************************************/ +#define XENV_TIME_STAMP_GET(StampPtr) \ +{ \ + vxTimeBaseGet((UINT32*)&(StampPtr)->TimeBaseUpper, \ + (UINT32*)&(StampPtr)->TimeBaseLower); \ +} + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note None. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_US(Stamp1Ptr, Stamp2Ptr) (0) + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note + * + * None. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_MS(Stamp1Ptr, Stamp2Ptr) (0) + + +/* For non-PPC systems the above macros are not defined. Generate a error to + * make the developer aware of the problem. + */ +#else +#error "XENV_TIME_STAMP_GET used in a non-PPC system. Aborting." +#endif + + +/*****************************************************************************/ +/** + * + * Delay the specified number of microseconds. + * + * @param delay + * Number of microseconds to delay. + * + * @return None. + * + *****************************************************************************/ + +#define XENV_USLEEP(delay) sysUsDelay(delay) + +#define udelay(delay) sysUsDelay(delay) + + +/****************************************************************************** + * + * CACHE handling macros / mappings + * + ******************************************************************************/ +/****************************************************************************** + * + * PowerPC case + * + ******************************************************************************/ + +#if (CPU_FAMILY==PPC) + +#define XCACHE_ENABLE_CACHE() \ + { XCACHE_ENABLE_DCACHE(); XCACHE_ENABLE_ICACHE(); } + +#define XCACHE_DISABLE_CACHE() \ + { XCACHE_DISABLE_DCACHE(); XCACHE_DISABLE_ICACHE(); } + + +#define XCACHE_ENABLE_DCACHE() cacheEnable(DATA_CACHE) +#define XCACHE_DISABLE_DCACHE() cacheDisable(DATA_CACHE) +#define XCACHE_ENABLE_ICACHE() cacheEnable(INSTRUCTION_CACHE) +#define XCACHE_DISABLE_ICACHE() cacheDisable(INSTRUCTION_CACHE) + + +#define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) \ + cacheInvalidate(DATA_CACHE, (void *)(Addr), (Len)) + +#define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + cacheFlush(DATA_CACHE, (void *)(Addr), (Len)) + +#define XCACHE_INVALIDATE_ICACHE_RANGE(Addr, Len) \ + cacheInvalidate(INSTRUCTION_CACHE, (void *)(Addr), (Len)) + +#define XCACHE_FLUSH_ICACHE_RANGE(Addr, Len) \ + cacheFlush(INSTRUCTION_CACHE, (void *)(Addr), (Len)) + + +/****************************************************************************** + * + * Unknown processor / architecture + * + ******************************************************************************/ + +#else +#error "Unknown processor / architecture. Must be PPC for VxWorks." +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* #ifdef XENV_VXWORKS_H */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpio.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpio.h new file mode 100755 index 000000000..bd77b9204 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpio.h @@ -0,0 +1,203 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xgpio.h +* +* This file contains the software API definition of the Xilinx General Purpose +* I/O (XGpio) device driver. +* +* The Xilinx GPIO controller is a soft IP core designed for Xilinx FPGAs and +* contains the following general features: +* - Support for up to 32 I/O discretes for each channel (64 bits total). +* - Each of the discretes can be configured for input or output. +* - Configurable support for dual channels and interrupt generation. +* +* The driver provides interrupt management functions. Implementation of +* interrupt handlers is left to the user. Refer to the provided interrupt +* example in the examples directory for details. +* +* This driver is intended to be RTOS and processor independent. Any needs for +* dynamic memory management, threads or thread mutual exclusion, virtual +* memory, or cache control must be satisfied by the layer above this driver. +* +* <b>Initialization & Configuration</b> +* +* The XGpio_Config structure is used by the driver to configure itself. This +* configuration structure is typically created by the tool-chain based on HW +* build properties. +* +* To support multiple runtime loading and initialization strategies employed +* by various operating systems, the driver instance can be initialized in one +* of the following ways: +* +* - XGpio_Initialize(InstancePtr, DeviceId) - The driver looks up its own +* configuration structure created by the tool-chain based on an ID provided +* by the tool-chain. +* +* - XGpio_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a +* configuration structure provided by the caller. If running in a system +* with address translation, the provided virtual memory base address +* replaces the physical address present in the configuration structure. +* +* @note +* +* This API utilizes 32 bit I/O to the GPIO registers. With less than 32 bits, +* the unused bits from registers are read as zero and written as don't cares. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a rmm 03/13/02 First release +* 2.00a jhl 11/26/03 Added support for dual channels and interrupts +* 2.01a jvb 12/14/05 I separated dependency on the static config table and +* xparameters.h from the driver initialization by moving +* _Initialize and _LookupConfig to _sinit.c. I also added +* the new _CfgInitialize routine. +* 2.11a mta 03/21/07 Updated to new coding style, added GetDataDirection +* 2.12a sv 11/21/07 Updated driver to support access through DCR bus +* 2.12a sv 06/05/08 Updated driver to fix the XGpio_InterruptDisable function +* to properly update the Interrupt Enable register +* 2.13a sdm 08/22/08 Removed support for static interrupt handlers from the MDD +* file +* 3.00a sv 11/21/09 Updated to use HAL Processor APIs. +* Renamed the macros XGpio_mWriteReg to XGpio_WriteReg and +* XGpio_mReadReg to XGpio_ReadReg. Removed the macros +* XGpio_mSetDataDirection, XGpio_mGetDataReg and +* XGpio_mSetDataReg. Users should use XGpio_WriteReg and +* XGpio_ReadReg to achieve the same functionality. +* 3.01a bss 04/18/13 Updated driver tcl to generate Canonical params in +* xparameters.h. CR#698589 +* </pre> +*****************************************************************************/ + +#ifndef XGPIO_H /* prevent circular inclusions */ +#define XGPIO_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xgpio_l.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /* Unique ID of device */ + u32 BaseAddress; /* Device base address */ + int InterruptPresent; /* Are interrupts supported in h/w */ + int IsDual; /* Are 2 channels supported in h/w */ +} XGpio_Config; + +/** + * The XGpio driver instance data. The user is required to allocate a + * variable of this type for every GPIO device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + u32 BaseAddress; /* Device base address */ + u32 IsReady; /* Device is initialized and ready */ + int InterruptPresent; /* Are interrupts supported in h/w */ + int IsDual; /* Are 2 channels supported in h/w */ +} XGpio; + +/***************** Macros (Inline Functions) Definitions ********************/ + + +/************************** Function Prototypes *****************************/ + +/* + * Initialization functions in xgpio_sinit.c + */ +int XGpio_Initialize(XGpio *InstancePtr, u16 DeviceId); +XGpio_Config *XGpio_LookupConfig(u16 DeviceId); + +/* + * API Basic functions implemented in xgpio.c + */ +int XGpio_CfgInitialize(XGpio *InstancePtr, XGpio_Config * Config, + u32 EffectiveAddr); +void XGpio_SetDataDirection(XGpio *InstancePtr, unsigned Channel, + u32 DirectionMask); +u32 XGpio_GetDataDirection(XGpio *InstancePtr, unsigned Channel); +u32 XGpio_DiscreteRead(XGpio *InstancePtr, unsigned Channel); +void XGpio_DiscreteWrite(XGpio *InstancePtr, unsigned Channel, u32 Mask); + + +/* + * API Functions implemented in xgpio_extra.c + */ +void XGpio_DiscreteSet(XGpio *InstancePtr, unsigned Channel, u32 Mask); +void XGpio_DiscreteClear(XGpio *InstancePtr, unsigned Channel, u32 Mask); + +/* + * API Functions implemented in xgpio_selftest.c + */ +int XGpio_SelfTest(XGpio *InstancePtr); + +/* + * API Functions implemented in xgpio_intr.c + */ +void XGpio_InterruptGlobalEnable(XGpio *InstancePtr); +void XGpio_InterruptGlobalDisable(XGpio *InstancePtr); +void XGpio_InterruptEnable(XGpio *InstancePtr, u32 Mask); +void XGpio_InterruptDisable(XGpio *InstancePtr, u32 Mask); +void XGpio_InterruptClear(XGpio *InstancePtr, u32 Mask); +u32 XGpio_InterruptGetEnabled(XGpio *InstancePtr); +u32 XGpio_InterruptGetStatus(XGpio *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpio_l.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpio_l.h new file mode 100755 index 000000000..5b3480706 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpio_l.h @@ -0,0 +1,235 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpio_l.h +* +* This header file contains identifiers and driver functions (or +* macros) that can be used to access the device. The user should refer to the +* hardware device specification for more details of the device operation. +* +* The macros that are available in this file use a multiply to calculate the +* addresses of registers. The user can control whether that multiply is done +* at run time or at compile time. A constant passed as the channel parameter +* will cause the multiply to be done at compile time. A variable passed as the +* channel parameter will cause it to occur at run time. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a jhl 04/24/02 First release of low level driver +* 2.00a jhl 11/26/03 Added support for dual channels and interrupts. This +* change required the functions to be changed such that +* the interface is not compatible with previous versions. +* See the examples in the example directory for macros +* to help compile an application that was designed for +* previous versions of the driver. The interrupt registers +* are accessible using the ReadReg and WriteReg macros and +* a channel parameter was added to the other macros. +* 2.11a mta 03/21/07 Updated to new coding style +* 2.12a sv 11/21/07 Updated driver to support access through DCR bus. +* 3.00a sv 11/21/09 Renamed the macros XGpio_mWriteReg to XGpio_WriteReg +* XGpio_mReadReg to XGpio_ReadReg. +* Removed the macros XGpio_mSetDataDirection, +* XGpio_mGetDataReg and XGpio_mSetDataReg. Users +* should use XGpio_WriteReg/XGpio_ReadReg to achieve the +* same functionality. +* </pre> +* +******************************************************************************/ + +#ifndef XGPIO_L_H /* prevent circular inclusions */ +#define XGPIO_L_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/* + * XPAR_XGPIO_USE_DCR_BRIDGE has to be set to 1 if the GPIO device is + * accessed through a DCR bus connected to a bridge + */ +#define XPAR_XGPIO_USE_DCR_BRIDGE 0 + + +#if (XPAR_XGPIO_USE_DCR_BRIDGE != 0) +#include "xio_dcr.h" +#endif + +/************************** Constant Definitions *****************************/ + +/** @name Registers + * + * Register offsets for this device. + * @{ + */ +#if (XPAR_XGPIO_USE_DCR_BRIDGE != 0) + +#define XGPIO_DATA_OFFSET 0x0 /**< Data register for 1st channel */ +#define XGPIO_TRI_OFFSET 0x1 /**< I/O direction reg for 1st channel */ +#define XGPIO_DATA2_OFFSET 0x2 /**< Data register for 2nd channel */ +#define XGPIO_TRI2_OFFSET 0x3 /**< I/O direction reg for 2nd channel */ + +#define XGPIO_GIE_OFFSET 0x47 /**< Global interrupt enable register */ +#define XGPIO_ISR_OFFSET 0x48 /**< Interrupt status register */ +#define XGPIO_IER_OFFSET 0x4A /**< Interrupt enable register */ + +#else + +#define XGPIO_DATA_OFFSET 0x0 /**< Data register for 1st channel */ +#define XGPIO_TRI_OFFSET 0x4 /**< I/O direction reg for 1st channel */ +#define XGPIO_DATA2_OFFSET 0x8 /**< Data register for 2nd channel */ +#define XGPIO_TRI2_OFFSET 0xC /**< I/O direction reg for 2nd channel */ + +#define XGPIO_GIE_OFFSET 0x11C /**< Glogal interrupt enable register */ +#define XGPIO_ISR_OFFSET 0x120 /**< Interrupt status register */ +#define XGPIO_IER_OFFSET 0x128 /**< Interrupt enable register */ + +#endif + +/* @} */ + +/* The following constant describes the offset of each channels data and + * tristate register from the base address. + */ +#define XGPIO_CHAN_OFFSET 8 + +/** @name Interrupt Status and Enable Register bitmaps and masks + * + * Bit definitions for the interrupt status register and interrupt enable + * registers. + * @{ + */ +#define XGPIO_IR_MASK 0x3 /**< Mask of all bits */ +#define XGPIO_IR_CH1_MASK 0x1 /**< Mask for the 1st channel */ +#define XGPIO_IR_CH2_MASK 0x2 /**< Mask for the 2nd channel */ +/*@}*/ + + +/** @name Global Interrupt Enable Register bitmaps and masks + * + * Bit definitions for the Global Interrupt Enable register + * @{ + */ +#define XGPIO_GIE_GINTR_ENABLE_MASK 0x80000000 +/*@}*/ + + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + /* + * Define the appropriate I/O access method to memory mapped I/O or DCR. + */ +#if (XPAR_XGPIO_USE_DCR_BRIDGE != 0) + +#define XGpio_In32 XIo_DcrIn +#define XGpio_Out32 XIo_DcrOut + +#else + +#define XGpio_In32 Xil_In32 +#define XGpio_Out32 Xil_Out32 + +#endif + + +/****************************************************************************/ +/** +* +* Write a value to a GPIO register. A 32 bit write is performed. If the +* GPIO core is implemented in a smaller width, only the least significant data +* is written. +* +* @param BaseAddress is the base address of the GPIO device. +* @param RegOffset is the register offset from the base to write to. +* @param Data is the data written to the register. +* +* @return None. +* +* @note C-style signature: +* void XGpio_WriteReg(u32 BaseAddress, u32 RegOffset, u32 Data) +* +****************************************************************************/ +#define XGpio_WriteReg(BaseAddress, RegOffset, Data) \ + XGpio_Out32((BaseAddress) + (RegOffset), (u32)(Data)) + +/****************************************************************************/ +/** +* +* Read a value from a GPIO register. A 32 bit read is performed. If the +* GPIO core is implemented in a smaller width, only the least +* significant data is read from the register. The most significant data +* will be read as 0. +* +* @param BaseAddress is the base address of the GPIO device. +* @param RegOffset is the register offset from the base to read from. +* +* @return Data read from the register. +* +* @note C-style signature: +* u32 XGpio_ReadReg(u32 BaseAddress, u32 RegOffset) +* +****************************************************************************/ +#define XGpio_ReadReg(BaseAddress, RegOffset) \ + XGpio_In32((BaseAddress) + (RegOffset)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpiops.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpiops.h new file mode 100755 index 000000000..1b8eb4ff2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpiops.h @@ -0,0 +1,262 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops.h +* +* The Xilinx PS GPIO driver. This driver supports the Xilinx PS GPIO +* Controller. +* +* The GPIO Controller supports the following features: +* - 4 banks +* - Masked writes (There are no masked reads) +* - Bypass mode +* - Configurable Interrupts (Level/Edge) +* +* This driver is intended to be RTOS and processor independent. Any needs for +* dynamic memory management, threads or thread mutual exclusion, virtual +* memory, or cache control must be satisfied by the layer above this driver. + +* This driver supports all the features listed above, if applicable. +* +* <b>Driver Description</b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate to the GPIO. +* +* <b>Interrupts</b> +* +* The driver provides interrupt management functions and an interrupt handler. +* Users of this driver need to provide callback functions. An interrupt handler +* example is available with the driver. +* +* <b>Threads</b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* <b>Asserts</b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* <b>Building the driver</b> +* +* The XGpioPs driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* <br><br> +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sv 01/15/10 First Release +* 1.01a sv 04/15/12 Removed the APIs XGpioPs_SetMode, XGpioPs_SetModePin +* XGpioPs_GetMode, XGpioPs_GetModePin as they are not +* relevant to Zynq device.The interrupts are disabled +* for output pins on all banks during initialization. +* 1.02a hk 08/22/13 Added low level reset API +* </pre> +* +******************************************************************************/ +#ifndef XGPIOPS_H /* prevent circular inclusions */ +#define XGPIOPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xgpiops_hw.h" + +/************************** Constant Definitions *****************************/ + +/** @name Interrupt types + * @{ + * The following constants define the interrupt types that can be set for each + * GPIO pin. + */ +#define XGPIOPS_IRQ_TYPE_EDGE_RISING 0 /**< Interrupt on Rising edge */ +#define XGPIOPS_IRQ_TYPE_EDGE_FALLING 1 /**< Interrupt Falling edge */ +#define XGPIOPS_IRQ_TYPE_EDGE_BOTH 2 /**< Interrupt on both edges */ +#define XGPIOPS_IRQ_TYPE_LEVEL_HIGH 3 /**< Interrupt on high level */ +#define XGPIOPS_IRQ_TYPE_LEVEL_LOW 4 /**< Interrupt on low level */ +/*@}*/ + +#define XGPIOPS_BANK0 0 /**< GPIO Bank 0 */ +#define XGPIOPS_BANK1 1 /**< GPIO Bank 1 */ +#define XGPIOPS_BANK2 2 /**< GPIO Bank 2 */ +#define XGPIOPS_BANK3 3 /**< GPIO Bank 3 */ + +#define XGPIOPS_MAX_BANKS 4 /**< Max banks in a GPIO device */ +#define XGPIOPS_BANK_MAX_PINS 32 /**< Max pins in a GPIO bank */ + +#define XGPIOPS_DEVICE_MAX_PIN_NUM 118 /*< Max pins in the GPIO device + * 0 - 31, Bank 0 + * 32 - 53, Bank 1 + * 54 - 85, Bank 2 + * 86 - 117, Bank 3 + */ + +/**************************** Type Definitions *******************************/ + +/****************************************************************************/ +/** + * This handler data type allows the user to define a callback function to + * handle the interrupts for the GPIO device. The application using this + * driver is expected to define a handler of this type, to support interrupt + * driven mode. The handler executes in an interrupt context such that minimal + * processing should be performed. + * + * @param CallBackRef is a callback reference passed in by the upper layer + * when setting the callback functions for a GPIO bank. It is + * passed back to the upper layer when the callback is invoked. Its + * type is not important to the driver component, so it is a void + * pointer. + * @param Bank is the bank for which the interrupt status has changed. + * @param Status is the Interrupt status of the GPIO bank. + * + *****************************************************************************/ +typedef void (*XGpioPs_Handler) (void *CallBackRef, int Bank, u32 Status); + +/** + * This typedef contains configuration information for a device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Register base address */ +} XGpioPs_Config; + +/** + * The XGpioPs driver instance data. The user is required to allocate a + * variable of this type for the GPIO device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XGpioPs_Config GpioConfig; /**< Device configuration */ + u32 IsReady; /**< Device is initialized and ready */ + XGpioPs_Handler Handler; /**< Status handlers for all banks */ + void *CallBackRef; /**< Callback ref for bank handlers */ +} XGpioPs; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/* + * Functions in xgpiops.c + */ +int XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr, + u32 EffectiveAddr); + +/* + * Bank APIs in xgpiops.c + */ +u32 XGpioPs_Read(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_Write(XGpioPs *InstancePtr, u8 Bank, u32 Data); +void XGpioPs_SetDirection(XGpioPs *InstancePtr, u8 Bank, u32 Direction); +u32 XGpioPs_GetDirection(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_SetOutputEnable(XGpioPs *InstancePtr, u8 Bank, u32 Enable); +u32 XGpioPs_GetOutputEnable(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_GetBankPin(u8 PinNumber, u8 *BankNumber, u8 *PinNumberInBank); + +/* + * Pin APIs in xgpiops.c + */ +int XGpioPs_ReadPin(XGpioPs *InstancePtr, int Pin); +void XGpioPs_WritePin(XGpioPs *InstancePtr, int Pin, int Data); +void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, int Pin, int Direction); +int XGpioPs_GetDirectionPin(XGpioPs *InstancePtr, int Pin); +void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, int Pin, int Enable); +int XGpioPs_GetOutputEnablePin(XGpioPs *InstancePtr, int Pin); + +/* + * Diagnostic functions in xgpiops_selftest.c + */ +int XGpioPs_SelfTest(XGpioPs *InstancePtr); + +/* + * Functions in xgpiops_intr.c + */ +/* + * Bank APIs in xgpiops_intr.c + */ +void XGpioPs_IntrEnable(XGpioPs *InstancePtr, u8 Bank, u32 Mask); +void XGpioPs_IntrDisable(XGpioPs *InstancePtr, u8 Bank, u32 Mask); +u32 XGpioPs_IntrGetEnabled(XGpioPs *InstancePtr, u8 Bank); +u32 XGpioPs_IntrGetStatus(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_IntrClear(XGpioPs *InstancePtr, u8 Bank, u32 Mask); +void XGpioPs_SetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 IntrType, + u32 IntrPolarity, u32 IntrOnAny); +void XGpioPs_GetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 *IntrType, + u32 *IntrPolarity, u32 *IntrOnAny); +void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef, + XGpioPs_Handler FuncPtr); +void XGpioPs_IntrHandler(XGpioPs *InstancePtr); + +/* + * Pin APIs in xgpiops_intr.c + */ +void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, int Pin, u8 IrqType); +u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, int Pin); + +void XGpioPs_IntrEnablePin(XGpioPs *InstancePtr, int Pin); +void XGpioPs_IntrDisablePin(XGpioPs *InstancePtr, int Pin); +int XGpioPs_IntrGetEnabledPin(XGpioPs *InstancePtr, int Pin); +int XGpioPs_IntrGetStatusPin(XGpioPs *InstancePtr, int Pin); +void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, int Pin); + +/* + * Functions in xgpiops_sinit.c + */ +XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpiops_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpiops_hw.h new file mode 100755 index 000000000..28c4993fa --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xgpiops_hw.h @@ -0,0 +1,158 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_hw.h +* +* This header file contains the identifiers and basic driver functions (or +* macros) that can be used to access the device. Other driver functions +* are defined in xgpiops.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------- +* 1.00a sv 01/15/10 First Release +* 1.02a hk 08/22/13 Added low level reset API function prototype and +* related constant definitions +* </pre> +* +******************************************************************************/ +#ifndef XGPIOPS_HW_H /* prevent circular inclusions */ +#define XGPIOPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register offsets for the GPIO. Each register is 32 bits. + * @{ + */ +#define XGPIOPS_DATA_LSW_OFFSET 0x000 /* Mask and Data Register LSW, WO */ +#define XGPIOPS_DATA_MSW_OFFSET 0x004 /* Mask and Data Register MSW, WO */ +#define XGPIOPS_DATA_OFFSET 0x040 /* Data Register, RW */ +#define XGPIOPS_DIRM_OFFSET 0x204 /* Direction Mode Register, RW */ +#define XGPIOPS_OUTEN_OFFSET 0x208 /* Output Enable Register, RW */ +#define XGPIOPS_INTMASK_OFFSET 0x20C /* Interrupt Mask Register, RO */ +#define XGPIOPS_INTEN_OFFSET 0x210 /* Interrupt Enable Register, WO */ +#define XGPIOPS_INTDIS_OFFSET 0x214 /* Interrupt Disable Register, WO*/ +#define XGPIOPS_INTSTS_OFFSET 0x218 /* Interrupt Status Register, RO */ +#define XGPIOPS_INTTYPE_OFFSET 0x21C /* Interrupt Type Register, RW */ +#define XGPIOPS_INTPOL_OFFSET 0x220 /* Interrupt Polarity Register, RW */ +#define XGPIOPS_INTANY_OFFSET 0x224 /* Interrupt On Any Register, RW */ +/* @} */ + +/** @name Register offsets for each Bank. + * @{ + */ +#define XGPIOPS_DATA_MASK_OFFSET 0x8 /* Data/Mask Registers offset */ +#define XGPIOPS_DATA_BANK_OFFSET 0x4 /* Data Registers offset */ +#define XGPIOPS_REG_MASK_OFFSET 0x40 /* Registers offset */ +/* @} */ + +/* For backwards compatibility */ +#define XGPIOPS_BYPM_MASK_OFFSET XGPIOPS_REG_MASK_OFFSET + +/** @name Interrupt type reset values for each bank + * @{ + */ +#define XGPIOPS_INTTYPE_BANK0_RESET 0xFFFFFFFF +#define XGPIOPS_INTTYPE_BANK1_RESET 0x3FFFFFFF +#define XGPIOPS_INTTYPE_BANK2_RESET 0xFFFFFFFF +#define XGPIOPS_INTTYPE_BANK3_RESET 0xFFFFFFFF +/* @} */ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* This macro reads the given register. +* +* @param BaseAddr is the base address of the device. +* @param RegOffset is the register offset to be read. +* +* @return The 32-bit value of the register +* +* @note None. +* +*****************************************************************************/ +#define XGpioPs_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (RegOffset)) + +/****************************************************************************/ +/** +* +* This macro writes to the given register. +* +* @param BaseAddr is the base address of the device. +* @param RegOffset is the offset of the register to be written. +* @param Data is the 32-bit value to write to the register. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#define XGpioPs_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (RegOffset), (Data)) + +/************************** Function Prototypes ******************************/ + +void XGpioPs_ResetHw(u32 BaseAddress); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XGPIOPS_HW_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xiicps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xiicps.h new file mode 100755 index 000000000..de89a9901 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xiicps.h @@ -0,0 +1,394 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps.h +* +* This is an implementation of IIC driver in the PS block. The device can +* be either a master or a slave on the IIC bus. This implementation supports +* both interrupt mode transfer and polled mode transfer. Only 7-bit address +* is used in the driver, although the hardware also supports 10-bit address. +* +* IIC is a 2-wire serial interface. The master controls the clock, so it can +* regulate when it wants to send or receive data. The slave is under control of +* the master, it must respond quickly since it has no control of the clock and +* must send/receive data as fast or as slow as the master does. +* +* The higher level software must implement a higher layer protocol to inform +* the slave what to send to the master. +* +* <b>Initialization & Configuration</b> +* +* The XIicPs_Config structure is used by the driver to configure itself. This +* configuration structure is typically created by the tool-chain based on HW +* build properties. +* +* To support multiple runtime loading and initialization strategies employed by +* various operating systems, the driver instance can be initialized in the +* following way: +* +* - XIicPs_LookupConfig(DeviceId) - Use the device identifier to find +* the static configuration structure defined in xiicps_g.c. This is +* setup by the tools. For some operating systems the config structure +* will be initialized by the software and this call is not needed. +* +* - XIicPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a +* configuration structure provided by the caller. If running in a +* system with address translation, the provided virtual memory base +* address replaces the physical address in the configuration +* structure. +* +* <b>Multiple Masters</b> +* +* More than one master can exist, bus arbitration is defined in the IIC +* standard. Lost of arbitration causes arbitration loss interrupt on the device. +* +* <b>Multiple Slaves</b> +* +* Multiple slaves are supported by selecting them with unique addresses. It is +* up to the system designer to be sure all devices on the IIC bus have +* unique addresses. +* +* <b>Addressing</b> +* +* The IIC hardware can use 7 or 10 bit addresses. The driver provides the +* ability to control which address size is sent in messages as a master to a +* slave device. +* +* <b>FIFO Size </b> +* The hardware FIFO is 32 bytes deep. The user must know the limitations of +* other IIC devices on the bus. Some are only able to receive a limited number +* of bytes in a single transfer. +* +* <b>Data Rates</b> +* +* The data rate is set by values in the control register. The formula for +* determining the correct register values is: +* Fscl = Fpclk/(22 x (divisor_a+1) x (divisor_b+1)) +* +* When the device is configured as a slave, the slck setting controls the +* sample rate and so must be set to be at least as fast as the fastest scl +* expected to be seen in the system. +* +* <b>Polled Mode Operation</b> +* +* This driver supports polled mode transfers. +* +* <b>Interrupts</b> +* +* The user must connect the interrupt handler of the driver, +* XIicPs_InterruptHandler to an interrupt system such that it will be called +* when an interrupt occurs. This function does not save and restore the +* processor context such that the user must provide this processing. +* +* The driver handles the following interrupts: +* - Transfer complete +* - More Data +* - Transfer not Acknowledged +* - Transfer Time out +* - Monitored slave ready - master mode only +* - Receive Overflow +* - Transmit FIFO overflow +* - Receive FIFO underflow +* - Arbitration lost +* +* <b>Bus Busy</b> +* +* Bus busy is checked before the setup of a master mode device, to avoid +* unnecessary arbitration loss interrupt. +* +* <b>RTOS Independence</b> +* +* This driver is intended to be RTOS and processor independent. It works with +* physical addresses only. Any needs for dynamic memory management, threads or +* thread mutual exclusion, virtual memory, or cache control must be satisfied by +* the layer above this driver. +* +* @note +* . Less than FIFO size transfers work for both 100 KHz and 400 KHz. +* . Larger than FIFO size interrupt-driven transfers are not reliable on +* busy systems where interrupt latency is high. +* . Larger than FIFO size interrupt-driven transfers are not reliable for +* data rate of 400 KHz. +* . Larger than FIFO size polled mode transfers work reliably. +* +* <pre> MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00a drg/jz 01/30/08 First release +* 1.00a sdm 09/21/11 Fixed an issue in the XIicPs_SetOptions and +* XIicPs_ClearOptions where the InstancePtr->Options +* was not updated correctly. +* Updated the InstancePtr->Options in the +* XIicPs_CfgInitialize by calling XIicPs_GetOptions. +* Updated the XIicPs_SetupMaster to not check for +* Bus Busy condition when the Hold Bit is set. +* Removed some unused variables. +* 1.01a sg 03/30/12 Fixed an issue in XIicPs_MasterSendPolled where a +* check for transfer completion is added, which indicates +* the completion of current transfer. +* 1.02a sg 08/29/12 Updated the logic to arrive at the best divisors +* to achieve I2C clock with minimum error for +* CR #674195 +* 1.03a hk 05/04/13 Initialized BestDivA and BestDivB to 0. +* This is fix for CR#704398 to remove warning. +* +* </pre> +* +******************************************************************************/ + +#ifndef XIICPS_H /* prevent circular inclusions */ +#define XIICPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xiicps_hw.h" + +/************************** Constant Definitions *****************************/ + +/** @name Configuration options + * + * The following options may be specified or retrieved for the device and + * enable/disable additional features of the IIC. Each of the options + * are bit fields, so more than one may be specified. + * + * @{ + */ +#define XIICPS_7_BIT_ADDR_OPTION 0x01 /**< 7-bit address mode */ +#define XIICPS_10_BIT_ADDR_OPTION 0x02 /**< 10-bit address mode */ +#define XIICPS_SLAVE_MON_OPTION 0x04 /**< Slave monitor mode */ +#define XIICPS_REP_START_OPTION 0x08 /**< Repeated Start */ +/*@}*/ + +/** @name Callback events + * + * These constants specify the handler events that are passed to an application + * event handler from the driver. These constants are bit masks such that + * more than one event can be passed to the handler. + * + * @{ + */ +#define XIICPS_EVENT_COMPLETE_SEND 0x0001 /**< Transmit Complete Event*/ +#define XIICPS_EVENT_COMPLETE_RECV 0x0002 /**< Receive Complete Event*/ +#define XIICPS_EVENT_TIME_OUT 0x0004 /**< Transfer timed out */ +#define XIICPS_EVENT_ERROR 0x0008 /**< Receive error */ +#define XIICPS_EVENT_ARB_LOST 0x0010 /**< Arbitration lost */ +#define XIICPS_EVENT_NACK 0x0020 /**< NACK Received */ +#define XIICPS_EVENT_SLAVE_RDY 0x0040 /**< Slave ready */ +#define XIICPS_EVENT_RX_OVR 0x0080 /**< RX overflow */ +#define XIICPS_EVENT_TX_OVR 0x0100 /**< TX overflow */ +#define XIICPS_EVENT_RX_UNF 0x0200 /**< RX underflow */ +/*@}*/ + +/** @name Role constants + * + * These constants are used to pass into the device setup routines to + * set up the device according to transfer direction. + */ +#define SENDING_ROLE 1 /**< Transfer direction is sending */ +#define RECVING_ROLE 0 /**< Transfer direction is receiving */ + + +/**************************** Type Definitions *******************************/ + +/** +* The handler data type allows the user to define a callback function to +* respond to interrupt events in the system. This function is executed +* in interrupt context, so amount of processing should be minimized. +* +* @param CallBackRef is the callback reference passed in by the upper +* layer when setting the callback functions, and passed back to +* the upper layer when the callback is invoked. Its type is +* not important to the driver, so it is a void pointer. +* @param StatusEvent indicates one or more status events that occurred. +*/ +typedef void (*XIicPs_IntrHandler) (void *CallBackRef, u32 StatusEvent); + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Base address of the device */ + u32 InputClockHz; /**< Input clock frequency */ +} XIicPs_Config; + +/** + * The XIicPs driver instance data. The user is required to allocate a + * variable of this type for each IIC device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XIicPs_Config Config; /* Configuration structure */ + u32 IsReady; /* Device is initialized and ready */ + u32 Options; /* Options set in the device */ + + u8 *SendBufferPtr; /* Pointer to send buffer */ + u8 *RecvBufferPtr; /* Pointer to recv buffer */ + int SendByteCount; /* Number of bytes still expected to send */ + int RecvByteCount; /* Number of bytes still expected to receive */ + + XIicPs_IntrHandler StatusHandler; /* Event handler function */ + void *CallBackRef; /* Callback reference for event handler */ +} XIicPs; + +/***************** Macros (Inline Functions) Definitions *********************/ +/****************************************************************************/ +/* +* +* Place one byte into the transmit FIFO. +* +* @param InstancePtr is the instance of IIC +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_SendByte(XIicPs *InstancePtr) +* +*****************************************************************************/ +#define XIicPs_SendByte(InstancePtr) \ +{ \ + XIicPs_Out32((InstancePtr)->Config.BaseAddress \ + + XIICPS_DATA_OFFSET, \ + *(InstancePtr)->SendBufferPtr ++); \ + (InstancePtr)->SendByteCount --; \ +} + +/****************************************************************************/ +/* +* +* Receive one byte from FIFO. +* +* @param InstancePtr is the instance of IIC +* +* @return None. +* +* @note C-Style signature: +* u8 XIicPs_RecvByte(XIicPs *InstancePtr) +* +*****************************************************************************/ +#define XIicPs_RecvByte(InstancePtr) \ +{ \ + *(InstancePtr)->RecvBufferPtr ++ = \ + (u8)XIicPs_In32((InstancePtr)->Config.BaseAddress \ + + XIICPS_DATA_OFFSET); \ + (InstancePtr)->RecvByteCount --; \ +} + +/************************** Function Prototypes ******************************/ + +/* + * Function for configuration lookup, in xiicps_sinit.c + */ +XIicPs_Config *XIicPs_LookupConfig(u16 DeviceId); + +/* + * Functions for general setup, in xiicps.c + */ +int XIicPs_CfgInitialize(XIicPs *InstancePtr, XIicPs_Config * Config, + u32 EffectiveAddr); + +void XIicPs_Abort(XIicPs *InstancePtr); +void XIicPs_Reset(XIicPs *InstancePtr); + +int XIicPs_BusIsBusy(XIicPs *InstancePtr); + +/* + * Functions for interrupts, in xiicps_intr.c + */ +void XIicPs_SetStatusHandler(XIicPs *InstancePtr, void *CallBackRef, + XIicPs_IntrHandler FuncPtr); + +/* + * Functions for device as master, in xiicps_master.c + */ +void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr); +void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr); +int XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr); +int XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr); +void XIicPs_EnableSlaveMonitor(XIicPs *InstancePtr, u16 SlaveAddr); +void XIicPs_DisableSlaveMonitor(XIicPs *InstancePtr); +void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr); + +/* + * Functions for device as slave, in xiicps_slave.c + */ +void XIicPs_SetupSlave(XIicPs *InstancePtr, u16 SlaveAddr); +void XIicPs_SlaveSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount); +void XIicPs_SlaveRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount); +int XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount); +int XIicPs_SlaveRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount); +void XIicPs_SlaveInterruptHandler(XIicPs *InstancePtr); + +/* + * Functions for selftest, in xiicps_selftest.c + */ +int XIicPs_SelfTest(XIicPs *InstancePtr); + +/* + * Functions for setting and getting data rate, in xiicps_options.c + */ +int XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options); +int XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options); +u32 XIicPs_GetOptions(XIicPs *InstancePtr); + +int XIicPs_SetSClk(XIicPs *InstancePtr, u32 FsclHz); +u32 XIicPs_GetSClk(XIicPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xiicps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xiicps_hw.h new file mode 100755 index 000000000..69b71ce09 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xiicps_hw.h @@ -0,0 +1,388 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_hw.h +* +* This header file contains the hardware definition for an IIC device. +* It includes register definitions and interface functions to read/write +* the registers. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00a drg/jz 01/30/10 First release +* 1.04a kpc 11/07/13 Added function prototype. +* </pre> +* +******************************************************************************/ +#ifndef XIICPS_HW_H /* prevent circular inclusions */ +#define XIICPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * + * Register offsets for the IIC. + * @{ + */ +#define XIICPS_CR_OFFSET 0x00 /**< 32-bit Control */ +#define XIICPS_SR_OFFSET 0x04 /**< Status */ +#define XIICPS_ADDR_OFFSET 0x08 /**< IIC Address */ +#define XIICPS_DATA_OFFSET 0x0C /**< IIC FIFO Data */ +#define XIICPS_ISR_OFFSET 0x10 /**< Interrupt Status */ +#define XIICPS_TRANS_SIZE_OFFSET 0x14 /**< Transfer Size */ +#define XIICPS_SLV_PAUSE_OFFSET 0x18 /**< Slave monitor pause */ +#define XIICPS_TIME_OUT_OFFSET 0x1C /**< Time Out */ +#define XIICPS_IMR_OFFSET 0x20 /**< Interrupt Enabled Mask */ +#define XIICPS_IER_OFFSET 0x24 /**< Interrupt Enable */ +#define XIICPS_IDR_OFFSET 0x28 /**< Interrupt Disable */ +/* @} */ + +/** @name Control Register + * + * This register contains various control bits that + * affects the operation of the IIC controller. Read/Write. + * @{ + */ + +#define XIICPS_CR_DIV_A_MASK 0x0000C000 /**< Clock Divisor A */ +#define XIICPS_CR_DIV_A_SHIFT 14 /**< Clock Divisor A shift */ +#define XIICPS_DIV_A_MAX 4 /**< Maximum value of Divisor A */ +#define XIICPS_CR_DIV_B_MASK 0x00003F00 /**< Clock Divisor B */ +#define XIICPS_CR_DIV_B_SHIFT 8 /**< Clock Divisor B shift */ +#define XIICPS_CR_CLR_FIFO_MASK 0x00000040 /**< Clear FIFO, auto clears*/ +#define XIICPS_CR_SLVMON_MASK 0x00000020 /**< Slave monitor mode */ +#define XIICPS_CR_HOLD_MASK 0x00000010 /**< Hold bus 1=Hold scl, + 0=terminate transfer */ +#define XIICPS_CR_ACKEN_MASK 0x00000008 /**< Enable TX of ACK when + Master receiver*/ +#define XIICPS_CR_NEA_MASK 0x00000004 /**< Addressing Mode 1=7 bit, + 0=10 bit */ +#define XIICPS_CR_MS_MASK 0x00000002 /**< Master mode bit 1=Master, + 0=Slave */ +#define XIICPS_CR_RD_WR_MASK 0x00000001 /**< Read or Write Master + transfer 0=Transmitter, + 1=Receiver*/ +#define XIICPS_CR_RESET_VALUE 0 /**< Reset value of the Control + register */ +/* @} */ + +/** @name IIC Status Register + * + * This register is used to indicate status of the IIC controller. Read only + * @{ + */ +#define XIICPS_SR_BA_MASK 0x00000100 /**< Bus Active Mask */ +#define XIICPS_SR_RXOVF_MASK 0x00000080 /**< Receiver Overflow Mask */ +#define XIICPS_SR_TXDV_MASK 0x00000040 /**< Transmit Data Valid Mask */ +#define XIICPS_SR_RXDV_MASK 0x00000020 /**< Receiver Data Valid Mask */ +#define XIICPS_SR_RXRW_MASK 0x00000008 /**< Receive read/write Mask */ +/* @} */ + +/** @name IIC Address Register + * + * Normal addressing mode uses add[6:0]. Extended addressing mode uses add[9:0]. + * A write access to this register always initiates a transfer if the IIC is in + * master mode. Read/Write + * @{ + */ +#define XIICPS_ADDR_MASK 0x000003FF /**< IIC Address Mask */ +/* @} */ + +/** @name IIC Data Register + * + * When written to, the data register sets data to transmit. When read from, the + * data register reads the last received byte of data. Read/Write + * @{ + */ +#define XIICPS_DATA_MASK 0x000000FF /**< IIC Data Mask */ +/* @} */ + +/** @name IIC Interrupt Registers + * + * <b>IIC Interrupt Status Register</b> + * + * This register holds the interrupt status flags for the IIC controller. Some + * of the flags are level triggered + * - i.e. are set as long as the interrupt condition exists. Other flags are + * edge triggered, which means they are set one the interrupt condition occurs + * then remain set until they are cleared by software. + * The interrupts are cleared by writing a one to the interrupt bit position + * in the Interrupt Status Register. Read/Write. + * + * <b>IIC Interrupt Enable Register</b> + * + * This register is used to enable interrupt sources for the IIC controller. + * Writing a '1' to a bit in this register clears the corresponding bit in the + * IIC Interrupt Mask register. Write only. + * + * <b>IIC Interrupt Disable Register </b> + * + * This register is used to disable interrupt sources for the IIC controller. + * Writing a '1' to a bit in this register sets the corresponding bit in the + * IIC Interrupt Mask register. Write only. + * + * <b>IIC Interrupt Mask Register</b> + * + * This register shows the enabled/disabled status of each IIC controller + * interrupt source. A bit set to 1 will ignore the corresponding interrupt in + * the status register. A bit set to 0 means the interrupt is enabled. + * All mask bits are set and all interrupts are disabled after reset. Read only. + * + * All four registers have the same bit definitions. They are only defined once + * for each of the Interrupt Enable Register, Interrupt Disable Register, + * Interrupt Mask Register, and Interrupt Status Register + * @{ + */ + +#define XIICPS_IXR_ARB_LOST_MASK 0x00000200 /**< Arbitration Lost Interrupt + mask */ +#define XIICPS_IXR_RX_UNF_MASK 0x00000080 /**< FIFO Recieve Underflow + Interrupt mask */ +#define XIICPS_IXR_TX_OVR_MASK 0x00000040 /**< Transmit Overflow + Interrupt mask */ +#define XIICPS_IXR_RX_OVR_MASK 0x00000020 /**< Receive Overflow Interrupt + mask */ +#define XIICPS_IXR_SLV_RDY_MASK 0x00000010 /**< Monitored Slave Ready + Interrupt mask */ +#define XIICPS_IXR_TO_MASK 0x00000008 /**< Transfer Time Out + Interrupt mask */ +#define XIICPS_IXR_NACK_MASK 0x00000004 /**< NACK Interrupt mask */ +#define XIICPS_IXR_DATA_MASK 0x00000002 /**< Data Interrupt mask */ +#define XIICPS_IXR_COMP_MASK 0x00000001 /**< Transfer Complete + Interrupt mask */ +#define XIICPS_IXR_DEFAULT_MASK 0x000002FF /**< Default ISR Mask */ +#define XIICPS_IXR_ALL_INTR_MASK 0x000002FF /**< All ISR Mask */ +/* @} */ + + +/** @name IIC Transfer Size Register +* +* The register's meaning varies according to the operating mode as follows: +* - Master transmitter mode: number of data bytes still not transmitted minus +* one +* - Master receiver mode: number of data bytes that are still expected to be +* received +* - Slave transmitter mode: number of bytes remaining in the FIFO after the +* master terminates the transfer +* - Slave receiver mode: number of valid data bytes in the FIFO +* +* This register is cleared if CLR_FIFO bit in the control register is set. +* Read/Write +* @{ +*/ +#define XIICPS_TRANS_SIZE_MASK 0x0000003F /**< IIC Transfer Size Mask */ +#define XIICPS_FIFO_DEPTH 16 /**< Number of bytes in the FIFO */ +#define XIICPS_DATA_INTR_DEPTH 14 /**< Number of bytes at DATA intr */ +/* @} */ + + +/** @name IIC Slave Monitor Pause Register +* +* This register is associated with the slave monitor mode of the I2C interface. +* It is meaningful only when the module is in master mode and bit SLVMON in the +* control register is set. +* +* This register defines the pause interval between consecutive attempts to +* address the slave once a write to an I2C address register is done by the +* host. It represents the number of sclk cycles minus one between two attempts. +* +* The reset value of the register is 0, which results in the master repeatedly +* trying to access the slave immediately after unsuccessful attempt. +* Read/Write +* @{ +*/ +#define XIICPS_SLV_PAUSE_MASK 0x0000000F /**< Slave monitor pause mask */ +/* @} */ + + +/** @name IIC Time Out Register +* +* The value of time out register represents the time out interval in number of +* sclk cycles minus one. +* +* When the accessed slave holds the sclk line low for longer than the time out +* period, thus prohibiting the I2C interface in master mode to complete the +* current transfer, an interrupt is generated and TO interrupt flag is set. +* +* The reset value of the register is 0x1f. +* Read/Write +* @{ + */ +#define XIICPS_TIME_OUT_MASK 0x000000FF /**< IIC Time Out mask */ +#define XIICPS_TO_RESET_VALUE 0x0000001F /**< IIC Time Out reset value */ +/* @} */ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +#define XIicPs_In32 Xil_In32 +#define XIicPs_Out32 Xil_Out32 + +/****************************************************************************/ +/** +* Read an IIC register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the 1st register of the +* device to select the specific register. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u32 XIicPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +#define XIicPs_ReadReg(BaseAddress, RegOffset) \ + XIicPs_In32((BaseAddress) + (RegOffset)) + +/***************************************************************************/ +/** +* Write an IIC register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the 1st register of the +* device to select the specific register. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_WriteReg(u32 BaseAddress, int RegOffset, u32 RegisterValue) +* +******************************************************************************/ +#define XIicPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + XIicPs_Out32((BaseAddress) + (RegOffset), (RegisterValue)) + +/***************************************************************************/ +/** +* Read the interrupt enable register. +* +* @param BaseAddress contains the base address of the device. +* +* @return Current bit mask that represents currently enabled interrupts. +* +* @note C-Style signature: +* u32 XIicPs_ReadIER(u32 BaseAddress) +* +******************************************************************************/ +#define XIicPs_ReadIER(BaseAddress) \ + XIicPs_ReadReg((BaseAddress), XIICPS_IER_OFFSET) + +/***************************************************************************/ +/** +* Write to the interrupt enable register. +* +* @param BaseAddress contains the base address of the device. +* +* @param IntrMask is the interrupts to be enabled. +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_EnabledInterrupts(u32 BaseAddress, u32 IntrMask) +* +******************************************************************************/ +#define XIicPs_EnableInterrupts(BaseAddress, IntrMask) \ + XIicPs_WriteReg((BaseAddress), XIICPS_IER_OFFSET, (IntrMask)) + +/***************************************************************************/ +/** +* Disable all interrupts. +* +* @param BaseAddress contains the base address of the device. +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_DisableAllInterrupts(u32 BaseAddress) +* +******************************************************************************/ +#define XIicPs_DisableAllInterrupts(BaseAddress) \ + XIicPs_WriteReg((BaseAddress), XIICPS_IDR_OFFSET, \ + XIICPS_IXR_ALL_INTR_MASK) + +/***************************************************************************/ +/** +* Disable selected interrupts. +* +* @param BaseAddress contains the base address of the device. +* +* @param IntrMask is the interrupts to be disabled. +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_DisableInterrupts(u32 BaseAddress, u32 IntrMask) +* +******************************************************************************/ +#define XIicPs_DisableInterrupts(BaseAddress, IntrMask) \ + XIicPs_WriteReg((BaseAddress), XIICPS_IDR_OFFSET, \ + (IntrMask)) + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ +/* + * Perform reset operation to the I2c interface + */ +void XIicPs_ResetHw(u32 BaseAddr); +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_assert.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_assert.h new file mode 100755 index 000000000..419492f94 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_assert.h @@ -0,0 +1,195 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_assert.h +* +* This file contains assert related functions. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 07/14/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XIL_ASSERT_H /* prevent circular inclusions */ +#define XIL_ASSERT_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + + +/************************** Constant Definitions *****************************/ + +#define XIL_ASSERT_NONE 0 +#define XIL_ASSERT_OCCURRED 1 + +extern unsigned int Xil_AssertStatus; +extern void Xil_Assert(const char *, int); + + +/** + * This data type defines a callback to be invoked when an + * assert occurs. The callback is invoked only when asserts are enabled + */ +typedef void (*Xil_AssertCallback) (const char *File, int Line); + +/***************** Macros (Inline Functions) Definitions *********************/ + +#ifndef NDEBUG + +/*****************************************************************************/ +/** +* This assert macro is to be used for functions that do not return anything +* (void). This in conjunction with the Xil_AssertWait boolean can be used to +* accomodate tests so that asserts which fail allow execution to continue. +* +* @param expression is the expression to evaluate. If it evaluates to +* false, the assert occurs. +* +* @return Returns void unless the Xil_AssertWait variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define Xil_AssertVoid(Expression) \ +{ \ + if (Expression) { \ + Xil_AssertStatus = XIL_ASSERT_NONE; \ + } else { \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return; \ + } \ +} + +/*****************************************************************************/ +/** +* This assert macro is to be used for functions that do return a value. This in +* conjunction with the Xil_AssertWait boolean can be used to accomodate tests +* so that asserts which fail allow execution to continue. +* +* @param expression is the expression to evaluate. If it evaluates to false, +* the assert occurs. +* +* @return Returns 0 unless the Xil_AssertWait variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define Xil_AssertNonvoid(Expression) \ +{ \ + if (Expression) { \ + Xil_AssertStatus = XIL_ASSERT_NONE; \ + } else { \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return 0; \ + } \ +} + +/*****************************************************************************/ +/** +* Always assert. This assert macro is to be used for functions that do not +* return anything (void). Use for instances where an assert should always +* occur. +* +* @return Returns void unless the Xil_AssertWait variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define Xil_AssertVoidAlways() \ +{ \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return; \ +} + +/*****************************************************************************/ +/** +* Always assert. This assert macro is to be used for functions that do return +* a value. Use for instances where an assert should always occur. +* +* @return Returns void unless the Xil_AssertWait variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define Xil_AssertNonvoidAlways() \ +{ \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return 0; \ +} + + +#else + +#define Xil_AssertVoid(Expression) +#define Xil_AssertVoidAlways() +#define Xil_AssertNonvoid(Expression) +#define Xil_AssertNonvoidAlways() + +#endif + +/************************** Function Prototypes ******************************/ + +void Xil_AssertSetCallback(Xil_AssertCallback Routine); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache.h new file mode 100755 index 000000000..e1e0adaac --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache.h @@ -0,0 +1,84 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache.h +* +* Contains required functions for the ARM cache functionality +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 01/29/10 First release +* 3.04a sdm 01/02/12 Remove redundant dsb/dmb instructions in cache maintenance +* APIs. +* </pre> +* +******************************************************************************/ +#ifndef XIL_CACHE_H +#define XIL_CACHE_H + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void Xil_DCacheEnable(void); +void Xil_DCacheDisable(void); +void Xil_DCacheInvalidate(void); +void Xil_DCacheInvalidateRange(unsigned int adr, unsigned len); +void Xil_DCacheFlush(void); +void Xil_DCacheFlushRange(unsigned int adr, unsigned len); + +void Xil_ICacheEnable(void); +void Xil_ICacheDisable(void); +void Xil_ICacheInvalidate(void); +void Xil_ICacheInvalidateRange(unsigned int adr, unsigned len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache_l.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache_l.h new file mode 100755 index 000000000..d0c3f40e6 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache_l.h @@ -0,0 +1,103 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache_l.h +* +* Contains L1 and L2 specific functions for the ARM cache functionality +* used by xcache.c. This functionality is being made available here for +* more sophisticated users. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 01/24/10 First release +* </pre> +* +******************************************************************************/ +#ifndef XIL_CACHE_MACH_H +#define XIL_CACHE_MACH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Function Prototypes ******************************/ + +void Xil_DCacheInvalidateLine(unsigned int adr); +void Xil_DCacheFlushLine(unsigned int adr); +void Xil_DCacheStoreLine(unsigned int adr); +void Xil_ICacheInvalidateLine(unsigned int adr); + +void Xil_L1DCacheEnable(void); +void Xil_L1DCacheDisable(void); +void Xil_L1DCacheInvalidate(void); +void Xil_L1DCacheInvalidateLine(unsigned int adr); +void Xil_L1DCacheInvalidateRange(unsigned int adr, unsigned len); +void Xil_L1DCacheFlush(void); +void Xil_L1DCacheFlushLine(unsigned int adr); +void Xil_L1DCacheFlushRange(unsigned int adr, unsigned len); +void Xil_L1DCacheStoreLine(unsigned int adr); + +void Xil_L1ICacheEnable(void); +void Xil_L1ICacheDisable(void); +void Xil_L1ICacheInvalidate(void); +void Xil_L1ICacheInvalidateLine(unsigned int adr); +void Xil_L1ICacheInvalidateRange(unsigned int adr, unsigned len); + +void Xil_L2CacheEnable(void); +void Xil_L2CacheDisable(void); +void Xil_L2CacheInvalidate(void); +void Xil_L2CacheInvalidateLine(unsigned int adr); +void Xil_L2CacheInvalidateRange(unsigned int adr, unsigned len); +void Xil_L2CacheFlush(void); +void Xil_L2CacheFlushLine(unsigned int adr); +void Xil_L2CacheFlushRange(unsigned int adr, unsigned len); +void Xil_L2CacheStoreLine(unsigned int adr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache_vxworks.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache_vxworks.h new file mode 100755 index 000000000..3ad8965df --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_cache_vxworks.h @@ -0,0 +1,103 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache_vxworks.h +* +* Contains the cache related functions for VxWorks that is wrapped by +* xil_cache. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 12/11/09 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ + +#ifndef XIL_CACHE_VXWORKS_H +#define XIL_CACHE_VXWORKS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vxWorks.h" +#include "vxLib.h" +#include "sysLibExtra.h" +#include "cacheLib.h" + +#if (CPU_FAMILY==PPC) + +#define Xil_DCacheEnable() cacheEnable(DATA_CACHE) + +#define Xil_DCacheDisable() cacheDisable(DATA_CACHE) + +#define Xil_DCacheInvalidateRange(Addr, Len) \ + cacheInvalidate(DATA_CACHE, (void *)(Addr), (Len)) + +#define Xil_DCacheFlushRange(Addr, Len) \ + cacheFlush(DATA_CACHE, (void *)(Addr), (Len)) + +#define Xil_ICacheEnable() cacheEnable(INSTRUCTION_CACHE) + +#define Xil_ICacheDisable() cacheDisable(INSTRUCTION_CACHE) + +#define Xil_ICacheInvalidateRange(Addr, Len) \ + cacheInvalidate(INSTRUCTION_CACHE, (void *)(Addr), (Len)) + + +#else +#error "Unknown processor / architecture. Must be PPC for VxWorks." +#endif + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_errata.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_errata.h new file mode 100755 index 000000000..bb09eef3f --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_errata.h @@ -0,0 +1,117 @@ +/******************************************************************************* +* +* (c) Copyright 2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_errata.h +* +* This header file contains Cortex A9 and PL310 Errata definitions. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a srt 04/18/13 First release +* </pre> +* +******************************************************************************/ +#ifndef XIL_ERRATA_H +#define XIL_ERRATA_H + +#define ENABLE_ARM_ERRATA 1 + +#ifdef ENABLE_ARM_ERRATA +/* Cortex A9 ARM Errata */ + +/* + * Errata No: 742230 + * Description: DMB operation may be faulty + */ +#define CONFIG_ARM_ERRATA_742230 1 + +/* + * Errata No: 743622 + * Description: Faulty hazard checking in the Store Buffer may lead + * to data corruption. + */ +#define CONFIG_ARM_ERRATA_743622 1 + +/* + * Errata No: 775420 + * Description: A data cache maintenance operation which aborts, + * might lead to deadlock + */ +#define CONFIG_ARM_ERRATA_775420 1 + +/* + * Errata No: 794073 + * Description: Speculative instruction fetches with MMU disabled + * might not comply with architectural requirements + */ +#define CONFIG_ARM_ERRATA_794073 1 + + +/* PL310 L2 Cache Errata */ + +/* + * Errata No: 588369 + * Description: Clean & Invalidate maintenance operations do not + * invalidate clean lines + */ +#define CONFIG_PL310_ERRATA_588369 1 + +/* + * Errata No: 727915 + * Description: Background Clean and Invalidate by Way operation + * can cause data corruption + */ +#define CONFIG_PL310_ERRATA_727915 1 + +/* + * Errata No: 753970 + * Description: Cache sync operation may be faulty + */ +#define CONFIG_PL310_ERRATA_753970 1 + +#endif /* ENABLE_ARM_ERRATA */ + +#endif /* XIL_ERRATA_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_exception.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_exception.h new file mode 100755 index 000000000..dfa50d7fa --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_exception.h @@ -0,0 +1,241 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_exception.h +* +* This header file contains ARM Cortex A9 specific exception related APIs. +* For exception related functions that can be used across all Xilinx supported +* processors, please use xil_exception.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 11/04/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XIL_EXCEPTION_H /* prevent circular inclusions */ +#define XIL_EXCEPTION_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xpseudo_asm.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions ****************************/ + +#define XIL_EXCEPTION_FIQ XREG_CPSR_FIQ_ENABLE +#define XIL_EXCEPTION_IRQ XREG_CPSR_IRQ_ENABLE +#define XIL_EXCEPTION_ALL (XREG_CPSR_FIQ_ENABLE | XREG_CPSR_IRQ_ENABLE) + +#define XIL_EXCEPTION_ID_FIRST 0 +#define XIL_EXCEPTION_ID_RESET 0 +#define XIL_EXCEPTION_ID_UNDEFINED_INT 1 +#define XIL_EXCEPTION_ID_SWI_INT 2 +#define XIL_EXCEPTION_ID_PREFETCH_ABORT_INT 3 +#define XIL_EXCEPTION_ID_DATA_ABORT_INT 4 +#define XIL_EXCEPTION_ID_IRQ_INT 5 +#define XIL_EXCEPTION_ID_FIQ_INT 6 +#define XIL_EXCEPTION_ID_LAST 6 + +/* + * XIL_EXCEPTION_ID_INT is defined for all Xilinx processors. + */ +#define XIL_EXCEPTION_ID_INT XIL_EXCEPTION_ID_IRQ_INT + +/**************************** Type Definitions ******************************/ + +/** + * This typedef is the exception handler function. + */ +typedef void (*Xil_ExceptionHandler)(void *data); +typedef void (*Xil_InterruptHandler)(void *data); + +/***************** Macros (Inline Functions) Definitions ********************/ + +/****************************************************************************/ +/** +* Enable Exceptions. +* +* @param Mask for exceptions to be enabled. +* +* @return None. +* +* @note If bit is 0, exception is enabled. +* C-Style signature: void Xil_ExceptionEnableMask(Mask); +* +******************************************************************************/ +#ifdef __GNUC__ +#define Xil_ExceptionEnableMask(Mask) \ + mtcpsr(mfcpsr() & ~ (Mask & XIL_EXCEPTION_ALL)) +#elif defined (__ICCARM__) +#define Xil_ExceptionEnableMask(Mask) \ + { register unsigned int rval; \ + mfcpsr(rval); \ + mtcpsr(rval & ~ (Mask & XIL_EXCEPTION_ALL)) ;} +#else +#define Xil_ExceptionEnableMask(Mask) \ + { register unsigned int Reg __asm("cpsr"); \ + mtcpsr(Reg & ~ (Mask & XIL_EXCEPTION_ALL)) } +#endif + +/****************************************************************************/ +/** +* Enable the IRQ exception. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +#define Xil_ExceptionEnable() \ + Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ) + +/****************************************************************************/ +/** +* Disable Exceptions. +* +* @param Mask for exceptions to be enabled. +* +* @return None. +* +* @note If bit is 1, exception is disabled. +* C-Style signature: Xil_ExceptionDisableMask(Mask); +* +******************************************************************************/ +#ifdef __GNUC__ +#define Xil_ExceptionDisableMask(Mask) \ + mtcpsr(mfcpsr() | (Mask & XIL_EXCEPTION_ALL)) +#elif defined (__ICCARM__) +#define Xil_ExceptionDisableMask(Mask) \ + { register unsigned int rval; \ + mfcpsr(rval); \ + mtcpsr(rval | (Mask & XIL_EXCEPTION_ALL)) ;} +#else +#define Xil_ExceptionDisableMask(Mask) \ + { register unsigned int Reg __asm("cpsr"); \ + mtcpsr(Reg | (Mask & XIL_EXCEPTION_ALL)) } +#endif + +/****************************************************************************/ +/** +* Disable the IRQ exception. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +#define Xil_ExceptionDisable() \ + Xil_ExceptionDisableMask(XIL_EXCEPTION_IRQ) + +/****************************************************************************/ +/** +* Enable nested interrupts by clearing the I and F bits it CPSR +* +* @return None. +* +* @note This macro is supposed to be used from interrupt handlers. In the +* interrupt handler the interrupts are disabled by default (I and F +* are 1). To allow nesting of interrupts, this macro should be +* used. It clears the I and F bits by changing the ARM mode to +* system mode. Once these bits are cleared and provided the +* preemption of interrupt conditions are met in the GIC, nesting of +* interrupts will start happening. +* Caution: This macro must be used with caution. Before calling this +* macro, the user must ensure that the source of the current IRQ +* is appropriately cleared. Otherwise, as soon as we clear the I and +* F bits, there can be an infinite loop of interrupts with an +* eventual crash (all the stack space getting consumed). +******************************************************************************/ +#define Xil_EnableNestedInterrupts() \ + __asm__ __volatile__ ("mrs lr, spsr"); \ + __asm__ __volatile__ ("stmfd sp!, {lr}"); \ + __asm__ __volatile__ ("msr cpsr_c, #0x1F"); \ + __asm__ __volatile__ ("stmfd sp!, {lr}"); + +/****************************************************************************/ +/** +* Disable the nested interrupts by setting the I and F bits. +* +* @return None. +* +* @note This macro is meant to be called in the interrupt service routines. +* This macro cannot be used independently. It can only be used when +* nesting of interrupts have been enabled by using the macro +* Xil_EnableNestedInterrupts(). In a typical flow, the user first +* calls the Xil_EnableNestedInterrupts in the ISR at the appropriate +* point. The user then must call this macro before exiting the interrupt +* service routine. This macro puts the ARM back in IRQ/FIQ mode and +* hence sets back the I and F bits. +******************************************************************************/ +#define Xil_DisableNestedInterrupts() \ + __asm__ __volatile__ ("ldmfd sp!, {lr}"); \ + __asm__ __volatile__ ("msr cpsr_c, #0x92"); \ + __asm__ __volatile__ ("ldmfd sp!, {lr}"); \ + __asm__ __volatile__ ("msr spsr_cxsf, lr"); + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +extern void Xil_ExceptionRegisterHandler(u32 id, + Xil_ExceptionHandler handler, + void *data); + +extern void Xil_ExceptionRemoveHandler(u32 id); + +extern void Xil_ExceptionInit(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_EXCEPTION_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_hal.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_hal.h new file mode 100755 index 000000000..b58c7eb8a --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_hal.h @@ -0,0 +1,71 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_hal.h +* +* Contains all the HAL header files. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 07/28/09 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ + +#ifndef XIL_HAL_H +#define XIL_HAL_H + +#include "xil_cache.h" +#include "xil_io.h" +#include "xil_assert.h" +#include "xil_exception.h" +#include "xil_types.h" + +#endif + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_io.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_io.h new file mode 100755 index 000000000..06e83bfa8 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_io.h @@ -0,0 +1,254 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_io.h +* +* This file contains the interface for the general IO component, which +* encapsulates the Input/Output functions for processors that do not +* require any special I/O handling. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 10/24/09 First release +* 1.00a sdm 07/21/10 Added Xil_Htonl/s, Xil_Ntohl/s +* 3.07a asa 08/31/12 Added xil_printf.h include +* 3.08a sgd 11/05/12 Reverted SYNC macros definitions +* </pre> +******************************************************************************/ + +#ifndef XIL_IO_H /* prevent circular inclusions */ +#define XIL_IO_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xpseudo_asm.h" +#include "xil_printf.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +#if defined __GNUC__ +# define SYNCHRONIZE_IO dmb() +# define INST_SYNC isb() +# define DATA_SYNC dsb() +#else +# define SYNCHRONIZE_IO +# define INST_SYNC +# define DATA_SYNC +#endif /* __GNUC__ */ + +/*****************************************************************************/ +/** +* +* Perform an big-endian input operation for a 16-bit memory location +* by reading from the specified address and returning the Value read from +* that address. +* +* @param Addr contains the address to perform the input operation at. +* +* @return The Value read from the specified input address with the +* proper endianness. The return Value has the same endianness +* as that of the processor, i.e. if the processor is +* little-engian, the return Value is the byte-swapped Value read +* from the address. +* +* @note None. +* +******************************************************************************/ +#define Xil_In16LE(Addr) Xil_In16(Addr) + +/*****************************************************************************/ +/** +* +* Perform a big-endian input operation for a 32-bit memory location +* by reading from the specified address and returning the Value read from +* that address. +* +* @param Addr contains the address to perform the input operation at. +* +* @return The Value read from the specified input address with the +* proper endianness. The return Value has the same endianness +* as that of the processor, i.e. if the processor is +* little-engian, the return Value is the byte-swapped Value read +* from the address. +* +* +* @note None. +* +******************************************************************************/ +#define Xil_In32LE(Addr) Xil_In32(Addr) + +/*****************************************************************************/ +/** +* +* Perform a big-endian output operation for a 16-bit memory location +* by writing the specified Value to the specified address. +* +* @param Addr contains the address to perform the output operation at. +* @param Value contains the Value to be output at the specified address. +* The Value has the same endianness as that of the processor. +* If the processor is little-endian, the byte-swapped Value is +* written to the address. +* +* +* @return None +* +* @note None. +* +******************************************************************************/ +#define Xil_Out16LE(Addr, Value) Xil_Out16(Addr, Value) + +/*****************************************************************************/ +/** +* +* Perform a big-endian output operation for a 32-bit memory location +* by writing the specified Value to the specified address. +* +* @param Addr contains the address to perform the output operation at. +* @param Value contains the Value to be output at the specified address. +* The Value has the same endianness as that of the processor. +* If the processor is little-endian, the byte-swapped Value is +* written to the address. +* +* @return None +* +* @note None. +* +******************************************************************************/ +#define Xil_Out32LE(Addr, Value) Xil_Out32(Addr, Value) + +/*****************************************************************************/ +/** +* +* Convert a 32-bit number from host byte order to network byte order. +* +* @param Data the 32-bit number to be converted. +* +* @return The converted 32-bit number in network byte order. +* +* @note None. +* +******************************************************************************/ +#define Xil_Htonl(Data) Xil_EndianSwap32(Data) + +/*****************************************************************************/ +/** +* +* Convert a 16-bit number from host byte order to network byte order. +* +* @param Data the 16-bit number to be converted. +* +* @return The converted 16-bit number in network byte order. +* +* @note None. +* +******************************************************************************/ +#define Xil_Htons(Data) Xil_EndianSwap16(Data) + +/*****************************************************************************/ +/** +* +* Convert a 32-bit number from network byte order to host byte order. +* +* @param Data the 32-bit number to be converted. +* +* @return The converted 32-bit number in host byte order. +* +* @note None. +* +******************************************************************************/ +#define Xil_Ntohl(Data) Xil_EndianSwap32(Data) + +/*****************************************************************************/ +/** +* +* Convert a 16-bit number from network byte order to host byte order. +* +* @param Data the 16-bit number to be converted. +* +* @return The converted 16-bit number in host byte order. +* +* @note None. +* +******************************************************************************/ +#define Xil_Ntohs(Data) Xil_EndianSwap16(Data) + +/************************** Function Prototypes ******************************/ + +/* The following functions allow the software to be transportable across + * processors which may use memory mapped I/O or I/O which is mapped into a + * seperate address space. + */ +u8 Xil_In8(u32 Addr); +u16 Xil_In16(u32 Addr); +u32 Xil_In32(u32 Addr); + +void Xil_Out8(u32 Addr, u8 Value); +void Xil_Out16(u32 Addr, u16 Value); +void Xil_Out32(u32 Addr, u32 Value); + +u16 Xil_In16BE(u32 Addr); +u32 Xil_In32BE(u32 Addr); +void Xil_Out16BE(u32 Addr, u16 Value); +void Xil_Out32BE(u32 Addr, u32 Value); + +u16 Xil_EndianSwap16(u16 Data); +u32 Xil_EndianSwap32(u32 Data); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_macroback.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_macroback.h new file mode 100755 index 000000000..c614daaf5 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_macroback.h @@ -0,0 +1,1069 @@ +/*********************************************************************/ +/** + * (c) Copyright 2010 Xilinx, Inc. All rights reserved. + * + * This file contains confidential and proprietary information + * of Xilinx, Inc. and is protected under U.S. and + * international copyright and other intellectual property + * laws. + * + * DISCLAIMER + * This disclaimer is not a license and does not grant any + * rights to the materials distributed herewith. Except as + * otherwise provided in a valid license issued to you by + * Xilinx, and to the maximum extent permitted by applicable + * law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND + * WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES + * AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING + * BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- + * INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and + * (2) Xilinx shall not be liable (whether in contract or tort, + * including negligence, or under any other theory of + * liability) for any loss or damage of any kind or nature + * related to, arising under or in connection with these + * materials, including for any direct, or any indirect, + * special, incidental, or consequential loss or damage + * (including loss of data, profits, goodwill, or any type of + * loss or damage suffered as a result of any action brought + * by a third party) even if such damage or loss was + * reasonably foreseeable or Xilinx had been advised of the + * possibility of the same. + * + * CRITICAL APPLICATIONS + * Xilinx products are not designed or intended to be fail- + * safe, or for use in any application requiring fail-safe + * performance, such as life-support or safety devices or + * systems, Class III medical devices, nuclear facilities, + * applications related to the deployment of airbags, or any + * other applications that could lead to death, personal + * injury, or severe property or environmental damage + * (individually and collectively, "Critical + * Applications"). Customer assumes the sole risk and + * liability of any use of Xilinx products in Critical + * Applications, subject only to applicable laws and + * regulations governing limitations on product liability. + * + * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS + * PART OF THIS FILE AT ALL TIMES. + *********************************************************************/ + +/*********************************************************************/ +/** + * @file xil_macroback.h + * + * This header file is meant to bring back the removed _m macros. + * This header file must be included last. + * The following macros are not defined here due to the driver change: + * XGpio_mSetDataDirection + * XGpio_mGetDataReg + * XGpio_mSetDataReg + * XIIC_RESET + * XIIC_CLEAR_STATS + * XSpi_mReset + * XSysAce_mSetCfgAddr + * XSysAce_mIsCfgDone + * XTft_mSetPixel + * XTft_mGetPixel + * XWdtTb_mEnableWdt + * XWdtTb_mDisbleWdt + * XWdtTb_mRestartWdt + * XWdtTb_mGetTimebaseReg + * XWdtTb_mHasReset + * + * Please refer the corresonding driver document for replacement. + * + *********************************************************************/ + +#ifndef XIL_MACROBACK_H +#define XIL_MACROBACK_H + +/*********************************************************************/ +/** + * Macros for Driver XCan + * + *********************************************************************/ +#ifndef XCan_mReadReg +#define XCan_mReadReg XCan_ReadReg +#endif + +#ifndef XCan_mWriteReg +#define XCan_mWriteReg XCan_WriteReg +#endif + +#ifndef XCan_mIsTxDone +#define XCan_mIsTxDone XCan_IsTxDone +#endif + +#ifndef XCan_mIsTxFifoFull +#define XCan_mIsTxFifoFull XCan_IsTxFifoFull +#endif + +#ifndef XCan_mIsHighPriorityBufFull +#define XCan_mIsHighPriorityBufFull XCan_IsHighPriorityBufFull +#endif + +#ifndef XCan_mIsRxEmpty +#define XCan_mIsRxEmpty XCan_IsRxEmpty +#endif + +#ifndef XCan_mIsAcceptFilterBusy +#define XCan_mIsAcceptFilterBusy XCan_IsAcceptFilterBusy +#endif + +#ifndef XCan_mCreateIdValue +#define XCan_mCreateIdValue XCan_CreateIdValue +#endif + +#ifndef XCan_mCreateDlcValue +#define XCan_mCreateDlcValue XCan_CreateDlcValue +#endif + +/*********************************************************************/ +/** + * Macros for Driver XDmaCentral + * + *********************************************************************/ +#ifndef XDmaCentral_mWriteReg +#define XDmaCentral_mWriteReg XDmaCentral_WriteReg +#endif + +#ifndef XDmaCentral_mReadReg +#define XDmaCentral_mReadReg XDmaCentral_ReadReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XDsAdc + * + *********************************************************************/ +#ifndef XDsAdc_mWriteReg +#define XDsAdc_mWriteReg XDsAdc_WriteReg +#endif + +#ifndef XDsAdc_mReadReg +#define XDsAdc_mReadReg XDsAdc_ReadReg +#endif + +#ifndef XDsAdc_mIsEmpty +#define XDsAdc_mIsEmpty XDsAdc_IsEmpty +#endif + +#ifndef XDsAdc_mSetFstmReg +#define XDsAdc_mSetFstmReg XDsAdc_SetFstmReg +#endif + +#ifndef XDsAdc_mGetFstmReg +#define XDsAdc_mGetFstmReg XDsAdc_GetFstmReg +#endif + +#ifndef XDsAdc_mEnableConversion +#define XDsAdc_mEnableConversion XDsAdc_EnableConversion +#endif + +#ifndef XDsAdc_mDisableConversion +#define XDsAdc_mDisableConversion XDsAdc_DisableConversion +#endif + +#ifndef XDsAdc_mGetFifoOccyReg +#define XDsAdc_mGetFifoOccyReg XDsAdc_GetFifoOccyReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XDsDac + * + *********************************************************************/ +#ifndef XDsDac_mWriteReg +#define XDsDac_mWriteReg XDsDac_WriteReg +#endif + +#ifndef XDsDac_mReadReg +#define XDsDac_mReadReg XDsDac_ReadReg +#endif + +#ifndef XDsDac_mIsEmpty +#define XDsDac_mIsEmpty XDsDac_IsEmpty +#endif + +#ifndef XDsDac_mFifoIsFull +#define XDsDac_mFifoIsFull XDsDac_FifoIsFull +#endif + +#ifndef XDsDac_mGetVacancy +#define XDsDac_mGetVacancy XDsDac_GetVacancy +#endif + +/*********************************************************************/ +/** + * Macros for Driver XEmacLite + * + *********************************************************************/ +#ifndef XEmacLite_mReadReg +#define XEmacLite_mReadReg XEmacLite_ReadReg +#endif + +#ifndef XEmacLite_mWriteReg +#define XEmacLite_mWriteReg XEmacLite_WriteReg +#endif + +#ifndef XEmacLite_mGetTxStatus +#define XEmacLite_mGetTxStatus XEmacLite_GetTxStatus +#endif + +#ifndef XEmacLite_mSetTxStatus +#define XEmacLite_mSetTxStatus XEmacLite_SetTxStatus +#endif + +#ifndef XEmacLite_mGetRxStatus +#define XEmacLite_mGetRxStatus XEmacLite_GetRxStatus +#endif + +#ifndef XEmacLite_mSetRxStatus +#define XEmacLite_mSetRxStatus XEmacLite_SetRxStatus +#endif + +#ifndef XEmacLite_mIsTxDone +#define XEmacLite_mIsTxDone XEmacLite_IsTxDone +#endif + +#ifndef XEmacLite_mIsRxEmpty +#define XEmacLite_mIsRxEmpty XEmacLite_IsRxEmpty +#endif + +#ifndef XEmacLite_mNextTransmitAddr +#define XEmacLite_mNextTransmitAddr XEmacLite_NextTransmitAddr +#endif + +#ifndef XEmacLite_mNextReceiveAddr +#define XEmacLite_mNextReceiveAddr XEmacLite_NextReceiveAddr +#endif + +#ifndef XEmacLite_mIsMdioConfigured +#define XEmacLite_mIsMdioConfigured XEmacLite_IsMdioConfigured +#endif + +#ifndef XEmacLite_mIsLoopbackConfigured +#define XEmacLite_mIsLoopbackConfigured XEmacLite_IsLoopbackConfigured +#endif + +#ifndef XEmacLite_mGetReceiveDataLength +#define XEmacLite_mGetReceiveDataLength XEmacLite_GetReceiveDataLength +#endif + +#ifndef XEmacLite_mGetTxActive +#define XEmacLite_mGetTxActive XEmacLite_GetTxActive +#endif + +#ifndef XEmacLite_mSetTxActive +#define XEmacLite_mSetTxActive XEmacLite_SetTxActive +#endif + +/*********************************************************************/ +/** + * Macros for Driver XGpio + * + *********************************************************************/ +#ifndef XGpio_mWriteReg +#define XGpio_mWriteReg XGpio_WriteReg +#endif + +#ifndef XGpio_mReadReg +#define XGpio_mReadReg XGpio_ReadReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XHwIcap + * + *********************************************************************/ +#ifndef XHwIcap_mFifoWrite +#define XHwIcap_mFifoWrite XHwIcap_FifoWrite +#endif + +#ifndef XHwIcap_mFifoRead +#define XHwIcap_mFifoRead XHwIcap_FifoRead +#endif + +#ifndef XHwIcap_mSetSizeReg +#define XHwIcap_mSetSizeReg XHwIcap_SetSizeReg +#endif + +#ifndef XHwIcap_mGetControlReg +#define XHwIcap_mGetControlReg XHwIcap_GetControlReg +#endif + +#ifndef XHwIcap_mStartConfig +#define XHwIcap_mStartConfig XHwIcap_StartConfig +#endif + +#ifndef XHwIcap_mStartReadBack +#define XHwIcap_mStartReadBack XHwIcap_StartReadBack +#endif + +#ifndef XHwIcap_mGetStatusReg +#define XHwIcap_mGetStatusReg XHwIcap_GetStatusReg +#endif + +#ifndef XHwIcap_mIsTransferDone +#define XHwIcap_mIsTransferDone XHwIcap_IsTransferDone +#endif + +#ifndef XHwIcap_mIsDeviceBusy +#define XHwIcap_mIsDeviceBusy XHwIcap_IsDeviceBusy +#endif + +#ifndef XHwIcap_mIntrGlobalEnable +#define XHwIcap_mIntrGlobalEnable XHwIcap_IntrGlobalEnable +#endif + +#ifndef XHwIcap_mIntrGlobalDisable +#define XHwIcap_mIntrGlobalDisable XHwIcap_IntrGlobalDisable +#endif + +#ifndef XHwIcap_mIntrGetStatus +#define XHwIcap_mIntrGetStatus XHwIcap_IntrGetStatus +#endif + +#ifndef XHwIcap_mIntrDisable +#define XHwIcap_mIntrDisable XHwIcap_IntrDisable +#endif + +#ifndef XHwIcap_mIntrEnable +#define XHwIcap_mIntrEnable XHwIcap_IntrEnable +#endif + +#ifndef XHwIcap_mIntrGetEnabled +#define XHwIcap_mIntrGetEnabled XHwIcap_IntrGetEnabled +#endif + +#ifndef XHwIcap_mIntrClear +#define XHwIcap_mIntrClear XHwIcap_IntrClear +#endif + +#ifndef XHwIcap_mGetWrFifoVacancy +#define XHwIcap_mGetWrFifoVacancy XHwIcap_GetWrFifoVacancy +#endif + +#ifndef XHwIcap_mGetRdFifoOccupancy +#define XHwIcap_mGetRdFifoOccupancy XHwIcap_GetRdFifoOccupancy +#endif + +#ifndef XHwIcap_mSliceX2Col +#define XHwIcap_mSliceX2Col XHwIcap_SliceX2Col +#endif + +#ifndef XHwIcap_mSliceY2Row +#define XHwIcap_mSliceY2Row XHwIcap_SliceY2Row +#endif + +#ifndef XHwIcap_mSliceXY2Slice +#define XHwIcap_mSliceXY2Slice XHwIcap_SliceXY2Slice +#endif + +#ifndef XHwIcap_mReadReg +#define XHwIcap_mReadReg XHwIcap_ReadReg +#endif + +#ifndef XHwIcap_mWriteReg +#define XHwIcap_mWriteReg XHwIcap_WriteReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XIic + * + *********************************************************************/ +#ifndef XIic_mReadReg +#define XIic_mReadReg XIic_ReadReg +#endif + +#ifndef XIic_mWriteReg +#define XIic_mWriteReg XIic_WriteReg +#endif + +#ifndef XIic_mEnterCriticalRegion +#define XIic_mEnterCriticalRegion XIic_IntrGlobalDisable +#endif + +#ifndef XIic_mExitCriticalRegion +#define XIic_mExitCriticalRegion XIic_IntrGlobalEnable +#endif + +#ifndef XIIC_GINTR_DISABLE +#define XIIC_GINTR_DISABLE XIic_IntrGlobalDisable +#endif + +#ifndef XIIC_GINTR_ENABLE +#define XIIC_GINTR_ENABLE XIic_IntrGlobalEnable +#endif + +#ifndef XIIC_IS_GINTR_ENABLED +#define XIIC_IS_GINTR_ENABLED XIic_IsIntrGlobalEnabled +#endif + +#ifndef XIIC_WRITE_IISR +#define XIIC_WRITE_IISR XIic_WriteIisr +#endif + +#ifndef XIIC_READ_IISR +#define XIIC_READ_IISR XIic_ReadIisr +#endif + +#ifndef XIIC_WRITE_IIER +#define XIIC_WRITE_IIER XIic_WriteIier +#endif + +#ifndef XIic_mClearIisr +#define XIic_mClearIisr XIic_ClearIisr +#endif + +#ifndef XIic_mSend7BitAddress +#define XIic_mSend7BitAddress XIic_Send7BitAddress +#endif + +#ifndef XIic_mDynSend7BitAddress +#define XIic_mDynSend7BitAddress XIic_DynSend7BitAddress +#endif + +#ifndef XIic_mDynSendStartStopAddress +#define XIic_mDynSendStartStopAddress XIic_DynSendStartStopAddress +#endif + +#ifndef XIic_mDynSendStop +#define XIic_mDynSendStop XIic_DynSendStop +#endif + +#ifndef XIic_mSend10BitAddrByte1 +#define XIic_mSend10BitAddrByte1 XIic_Send10BitAddrByte1 +#endif + +#ifndef XIic_mSend10BitAddrByte2 +#define XIic_mSend10BitAddrByte2 XIic_Send10BitAddrByte2 +#endif + +#ifndef XIic_mSend7BitAddr +#define XIic_mSend7BitAddr XIic_Send7BitAddr +#endif + +#ifndef XIic_mDisableIntr +#define XIic_mDisableIntr XIic_DisableIntr +#endif + +#ifndef XIic_mEnableIntr +#define XIic_mEnableIntr XIic_EnableIntr +#endif + +#ifndef XIic_mClearIntr +#define XIic_mClearIntr XIic_ClearIntr +#endif + +#ifndef XIic_mClearEnableIntr +#define XIic_mClearEnableIntr XIic_ClearEnableIntr +#endif + +#ifndef XIic_mFlushRxFifo +#define XIic_mFlushRxFifo XIic_FlushRxFifo +#endif + +#ifndef XIic_mFlushTxFifo +#define XIic_mFlushTxFifo XIic_FlushTxFifo +#endif + +#ifndef XIic_mReadRecvByte +#define XIic_mReadRecvByte XIic_ReadRecvByte +#endif + +#ifndef XIic_mWriteSendByte +#define XIic_mWriteSendByte XIic_WriteSendByte +#endif + +#ifndef XIic_mSetControlRegister +#define XIic_mSetControlRegister XIic_SetControlRegister +#endif + +/*********************************************************************/ +/** + * Macros for Driver XIntc + * + *********************************************************************/ +#ifndef XIntc_mMasterEnable +#define XIntc_mMasterEnable XIntc_MasterEnable +#endif + +#ifndef XIntc_mMasterDisable +#define XIntc_mMasterDisable XIntc_MasterDisable +#endif + +#ifndef XIntc_mEnableIntr +#define XIntc_mEnableIntr XIntc_EnableIntr +#endif + +#ifndef XIntc_mDisableIntr +#define XIntc_mDisableIntr XIntc_DisableIntr +#endif + +#ifndef XIntc_mAckIntr +#define XIntc_mAckIntr XIntc_AckIntr +#endif + +#ifndef XIntc_mGetIntrStatus +#define XIntc_mGetIntrStatus XIntc_GetIntrStatus +#endif + +/*********************************************************************/ +/** + * Macros for Driver XLlDma + * + *********************************************************************/ +#ifndef XLlDma_mBdRead +#define XLlDma_mBdRead XLlDma_BdRead +#endif + +#ifndef XLlDma_mBdWrite +#define XLlDma_mBdWrite XLlDma_BdWrite +#endif + +#ifndef XLlDma_mWriteReg +#define XLlDma_mWriteReg XLlDma_WriteReg +#endif + +#ifndef XLlDma_mReadReg +#define XLlDma_mReadReg XLlDma_ReadReg +#endif + +#ifndef XLlDma_mBdClear +#define XLlDma_mBdClear XLlDma_BdClear +#endif + +#ifndef XLlDma_mBdSetStsCtrl +#define XLlDma_mBdSetStsCtrl XLlDma_BdSetStsCtrl +#endif + +#ifndef XLlDma_mBdGetStsCtrl +#define XLlDma_mBdGetStsCtrl XLlDma_BdGetStsCtrl +#endif + +#ifndef XLlDma_mBdSetLength +#define XLlDma_mBdSetLength XLlDma_BdSetLength +#endif + +#ifndef XLlDma_mBdGetLength +#define XLlDma_mBdGetLength XLlDma_BdGetLength +#endif + +#ifndef XLlDma_mBdSetId +#define XLlDma_mBdSetId XLlDma_BdSetId +#endif + +#ifndef XLlDma_mBdGetId +#define XLlDma_mBdGetId XLlDma_BdGetId +#endif + +#ifndef XLlDma_mBdSetBufAddr +#define XLlDma_mBdSetBufAddr XLlDma_BdSetBufAddr +#endif + +#ifndef XLlDma_mBdGetBufAddr +#define XLlDma_mBdGetBufAddr XLlDma_BdGetBufAddr +#endif + +#ifndef XLlDma_mBdGetLength +#define XLlDma_mBdGetLength XLlDma_BdGetLength +#endif + +#ifndef XLlDma_mGetTxRing +#define XLlDma_mGetTxRing XLlDma_GetTxRing +#endif + +#ifndef XLlDma_mGetRxRing +#define XLlDma_mGetRxRing XLlDma_GetRxRing +#endif + +#ifndef XLlDma_mGetCr +#define XLlDma_mGetCr XLlDma_GetCr +#endif + +#ifndef XLlDma_mSetCr +#define XLlDma_mSetCr XLlDma_SetCr +#endif + +#ifndef XLlDma_mBdRingCntCalc +#define XLlDma_mBdRingCntCalc XLlDma_BdRingCntCalc +#endif + +#ifndef XLlDma_mBdRingMemCalc +#define XLlDma_mBdRingMemCalc XLlDma_BdRingMemCalc +#endif + +#ifndef XLlDma_mBdRingGetCnt +#define XLlDma_mBdRingGetCnt XLlDma_BdRingGetCnt +#endif + +#ifndef XLlDma_mBdRingGetFreeCnt +#define XLlDma_mBdRingGetFreeCnt XLlDma_BdRingGetFreeCnt +#endif + +#ifndef XLlDma_mBdRingSnapShotCurrBd +#define XLlDma_mBdRingSnapShotCurrBd XLlDma_BdRingSnapShotCurrBd +#endif + +#ifndef XLlDma_mBdRingNext +#define XLlDma_mBdRingNext XLlDma_BdRingNext +#endif + +#ifndef XLlDma_mBdRingPrev +#define XLlDma_mBdRingPrev XLlDma_BdRingPrev +#endif + +#ifndef XLlDma_mBdRingGetSr +#define XLlDma_mBdRingGetSr XLlDma_BdRingGetSr +#endif + +#ifndef XLlDma_mBdRingSetSr +#define XLlDma_mBdRingSetSr XLlDma_BdRingSetSr +#endif + +#ifndef XLlDma_mBdRingGetCr +#define XLlDma_mBdRingGetCr XLlDma_BdRingGetCr +#endif + +#ifndef XLlDma_mBdRingSetCr +#define XLlDma_mBdRingSetCr XLlDma_BdRingSetCr +#endif + +#ifndef XLlDma_mBdRingBusy +#define XLlDma_mBdRingBusy XLlDma_BdRingBusy +#endif + +#ifndef XLlDma_mBdRingIntEnable +#define XLlDma_mBdRingIntEnable XLlDma_BdRingIntEnable +#endif + +#ifndef XLlDma_mBdRingIntDisable +#define XLlDma_mBdRingIntDisable XLlDma_BdRingIntDisable +#endif + +#ifndef XLlDma_mBdRingIntGetEnabled +#define XLlDma_mBdRingIntGetEnabled XLlDma_BdRingIntGetEnabled +#endif + +#ifndef XLlDma_mBdRingGetIrq +#define XLlDma_mBdRingGetIrq XLlDma_BdRingGetIrq +#endif + +#ifndef XLlDma_mBdRingAckIrq +#define XLlDma_mBdRingAckIrq XLlDma_BdRingAckIrq +#endif + +/*********************************************************************/ +/** + * Macros for Driver XMbox + * + *********************************************************************/ +#ifndef XMbox_mWriteReg +#define XMbox_mWriteReg XMbox_WriteReg +#endif + +#ifndef XMbox_mReadReg +#define XMbox_mReadReg XMbox_ReadReg +#endif + +#ifndef XMbox_mWriteMBox +#define XMbox_mWriteMBox XMbox_WriteMBox +#endif + +#ifndef XMbox_mReadMBox +#define XMbox_mReadMBox XMbox_ReadMBox +#endif + +#ifndef XMbox_mFSLReadMBox +#define XMbox_mFSLReadMBox XMbox_FSLReadMBox +#endif + +#ifndef XMbox_mFSLWriteMBox +#define XMbox_mFSLWriteMBox XMbox_FSLWriteMBox +#endif + +#ifndef XMbox_mFSLIsEmpty +#define XMbox_mFSLIsEmpty XMbox_FSLIsEmpty +#endif + +#ifndef XMbox_mFSLIsFull +#define XMbox_mFSLIsFull XMbox_FSLIsFull +#endif + +#ifndef XMbox_mIsEmpty +#define XMbox_mIsEmpty XMbox_IsEmptyHw +#endif + +#ifndef XMbox_mIsFull +#define XMbox_mIsFull XMbox_IsFullHw +#endif + +/*********************************************************************/ +/** + * Macros for Driver XMpmc + * + *********************************************************************/ +#ifndef XMpmc_mReadReg +#define XMpmc_mReadReg XMpmc_ReadReg +#endif + +#ifndef XMpmc_mWriteReg +#define XMpmc_mWriteReg XMpmc_WriteReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XMutex + * + *********************************************************************/ +#ifndef XMutex_mWriteReg +#define XMutex_mWriteReg XMutex_WriteReg +#endif + +#ifndef XMutex_mReadReg +#define XMutex_mReadReg XMutex_ReadReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XPcie + * + *********************************************************************/ +#ifndef XPcie_mReadReg +#define XPcie_mReadReg XPcie_ReadReg +#endif + +#ifndef XPcie_mWriteReg +#define XPcie_mWriteReg XPcie_WriteReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XSpi + * + *********************************************************************/ +#ifndef XSpi_mIntrGlobalEnable +#define XSpi_mIntrGlobalEnable XSpi_IntrGlobalEnable +#endif + +#ifndef XSpi_mIntrGlobalDisable +#define XSpi_mIntrGlobalDisable XSpi_IntrGlobalDisable +#endif + +#ifndef XSpi_mIsIntrGlobalEnabled +#define XSpi_mIsIntrGlobalEnabled XSpi_IsIntrGlobalEnabled +#endif + +#ifndef XSpi_mIntrGetStatus +#define XSpi_mIntrGetStatus XSpi_IntrGetStatus +#endif + +#ifndef XSpi_mIntrClear +#define XSpi_mIntrClear XSpi_IntrClear +#endif + +#ifndef XSpi_mIntrEnable +#define XSpi_mIntrEnable XSpi_IntrEnable +#endif + +#ifndef XSpi_mIntrDisable +#define XSpi_mIntrDisable XSpi_IntrDisable +#endif + +#ifndef XSpi_mIntrGetEnabled +#define XSpi_mIntrGetEnabled XSpi_IntrGetEnabled +#endif + +#ifndef XSpi_mSetControlReg +#define XSpi_mSetControlReg XSpi_SetControlReg +#endif + +#ifndef XSpi_mGetControlReg +#define XSpi_mGetControlReg XSpi_GetControlReg +#endif + +#ifndef XSpi_mGetStatusReg +#define XSpi_mGetStatusReg XSpi_GetStatusReg +#endif + +#ifndef XSpi_mSetSlaveSelectReg +#define XSpi_mSetSlaveSelectReg XSpi_SetSlaveSelectReg +#endif + +#ifndef XSpi_mGetSlaveSelectReg +#define XSpi_mGetSlaveSelectReg XSpi_GetSlaveSelectReg +#endif + +#ifndef XSpi_mEnable +#define XSpi_mEnable XSpi_Enable +#endif + +#ifndef XSpi_mDisable +#define XSpi_mDisable XSpi_Disable +#endif + +/*********************************************************************/ +/** + * Macros for Driver XSysAce + * + *********************************************************************/ +#ifndef XSysAce_mGetControlReg +#define XSysAce_mGetControlReg XSysAce_GetControlReg +#endif + +#ifndef XSysAce_mSetControlReg +#define XSysAce_mSetControlReg XSysAce_SetControlReg +#endif + +#ifndef XSysAce_mOrControlReg +#define XSysAce_mOrControlReg XSysAce_OrControlReg +#endif + +#ifndef XSysAce_mAndControlReg +#define XSysAce_mAndControlReg XSysAce_AndControlReg +#endif + +#ifndef XSysAce_mGetErrorReg +#define XSysAce_mGetErrorReg XSysAce_GetErrorReg +#endif + +#ifndef XSysAce_mGetStatusReg +#define XSysAce_mGetStatusReg XSysAce_GetStatusReg +#endif + +#ifndef XSysAce_mWaitForLock +#define XSysAce_mWaitForLock XSysAce_WaitForLock +#endif + +#ifndef XSysAce_mEnableIntr +#define XSysAce_mEnableIntr XSysAce_EnableIntr +#endif + +#ifndef XSysAce_mDisableIntr +#define XSysAce_mDisableIntr XSysAce_DisableIntr +#endif + +#ifndef XSysAce_mIsReadyForCmd +#define XSysAce_mIsReadyForCmd XSysAce_IsReadyForCmd +#endif + +#ifndef XSysAce_mIsMpuLocked +#define XSysAce_mIsMpuLocked XSysAce_IsMpuLocked +#endif + +#ifndef XSysAce_mIsIntrEnabled +#define XSysAce_mIsIntrEnabled XSysAce_IsIntrEnabled +#endif + +/*********************************************************************/ +/** + * Macros for Driver XSysMon + * + *********************************************************************/ +#ifndef XSysMon_mIsEventSamplingModeSet +#define XSysMon_mIsEventSamplingModeSet XSysMon_IsEventSamplingModeSet +#endif + +#ifndef XSysMon_mIsDrpBusy +#define XSysMon_mIsDrpBusy XSysMon_IsDrpBusy +#endif + +#ifndef XSysMon_mIsDrpLocked +#define XSysMon_mIsDrpLocked XSysMon_IsDrpLocked +#endif + +#ifndef XSysMon_mRawToTemperature +#define XSysMon_mRawToTemperature XSysMon_RawToTemperature +#endif + +#ifndef XSysMon_mRawToVoltage +#define XSysMon_mRawToVoltage XSysMon_RawToVoltage +#endif + +#ifndef XSysMon_mTemperatureToRaw +#define XSysMon_mTemperatureToRaw XSysMon_TemperatureToRaw +#endif + +#ifndef XSysMon_mVoltageToRaw +#define XSysMon_mVoltageToRaw XSysMon_VoltageToRaw +#endif + +#ifndef XSysMon_mReadReg +#define XSysMon_mReadReg XSysMon_ReadReg +#endif + +#ifndef XSysMon_mWriteReg +#define XSysMon_mWriteReg XSysMon_WriteReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XTmrCtr + * + *********************************************************************/ +#ifndef XTimerCtr_mReadReg +#define XTimerCtr_mReadReg XTimerCtr_ReadReg +#endif + +#ifndef XTmrCtr_mWriteReg +#define XTmrCtr_mWriteReg XTmrCtr_WriteReg +#endif + +#ifndef XTmrCtr_mSetControlStatusReg +#define XTmrCtr_mSetControlStatusReg XTmrCtr_SetControlStatusReg +#endif + +#ifndef XTmrCtr_mGetControlStatusReg +#define XTmrCtr_mGetControlStatusReg XTmrCtr_GetControlStatusReg +#endif + +#ifndef XTmrCtr_mGetTimerCounterReg +#define XTmrCtr_mGetTimerCounterReg XTmrCtr_GetTimerCounterReg +#endif + +#ifndef XTmrCtr_mSetLoadReg +#define XTmrCtr_mSetLoadReg XTmrCtr_SetLoadReg +#endif + +#ifndef XTmrCtr_mGetLoadReg +#define XTmrCtr_mGetLoadReg XTmrCtr_GetLoadReg +#endif + +#ifndef XTmrCtr_mEnable +#define XTmrCtr_mEnable XTmrCtr_Enable +#endif + +#ifndef XTmrCtr_mDisable +#define XTmrCtr_mDisable XTmrCtr_Disable +#endif + +#ifndef XTmrCtr_mEnableIntr +#define XTmrCtr_mEnableIntr XTmrCtr_EnableIntr +#endif + +#ifndef XTmrCtr_mDisableIntr +#define XTmrCtr_mDisableIntr XTmrCtr_DisableIntr +#endif + +#ifndef XTmrCtr_mLoadTimerCounterReg +#define XTmrCtr_mLoadTimerCounterReg XTmrCtr_LoadTimerCounterReg +#endif + +#ifndef XTmrCtr_mHasEventOccurred +#define XTmrCtr_mHasEventOccurred XTmrCtr_HasEventOccurred +#endif + +/*********************************************************************/ +/** + * Macros for Driver XUartLite + * + *********************************************************************/ +#ifndef XUartLite_mUpdateStats +#define XUartLite_mUpdateStats XUartLite_UpdateStats +#endif + +#ifndef XUartLite_mWriteReg +#define XUartLite_mWriteReg XUartLite_WriteReg +#endif + +#ifndef XUartLite_mReadReg +#define XUartLite_mReadReg XUartLite_ReadReg +#endif + +#ifndef XUartLite_mClearStats +#define XUartLite_mClearStats XUartLite_ClearStats +#endif + +#ifndef XUartLite_mSetControlReg +#define XUartLite_mSetControlReg XUartLite_SetControlReg +#endif + +#ifndef XUartLite_mGetStatusReg +#define XUartLite_mGetStatusReg XUartLite_GetStatusReg +#endif + +#ifndef XUartLite_mIsReceiveEmpty +#define XUartLite_mIsReceiveEmpty XUartLite_IsReceiveEmpty +#endif + +#ifndef XUartLite_mIsTransmitFull +#define XUartLite_mIsTransmitFull XUartLite_IsTransmitFull +#endif + +#ifndef XUartLite_mIsIntrEnabled +#define XUartLite_mIsIntrEnabled XUartLite_IsIntrEnabled +#endif + +#ifndef XUartLite_mEnableIntr +#define XUartLite_mEnableIntr XUartLite_EnableIntr +#endif + +#ifndef XUartLite_mDisableIntr +#define XUartLite_mDisableIntr XUartLite_DisableIntr +#endif + +/*********************************************************************/ +/** + * Macros for Driver XUartNs550 + * + *********************************************************************/ +#ifndef XUartNs550_mUpdateStats +#define XUartNs550_mUpdateStats XUartNs550_UpdateStats +#endif + +#ifndef XUartNs550_mReadReg +#define XUartNs550_mReadReg XUartNs550_ReadReg +#endif + +#ifndef XUartNs550_mWriteReg +#define XUartNs550_mWriteReg XUartNs550_WriteReg +#endif + +#ifndef XUartNs550_mClearStats +#define XUartNs550_mClearStats XUartNs550_ClearStats +#endif + +#ifndef XUartNs550_mGetLineStatusReg +#define XUartNs550_mGetLineStatusReg XUartNs550_GetLineStatusReg +#endif + +#ifndef XUartNs550_mGetLineControlReg +#define XUartNs550_mGetLineControlReg XUartNs550_GetLineControlReg +#endif + +#ifndef XUartNs550_mSetLineControlReg +#define XUartNs550_mSetLineControlReg XUartNs550_SetLineControlReg +#endif + +#ifndef XUartNs550_mEnableIntr +#define XUartNs550_mEnableIntr XUartNs550_EnableIntr +#endif + +#ifndef XUartNs550_mDisableIntr +#define XUartNs550_mDisableIntr XUartNs550_DisableIntr +#endif + +#ifndef XUartNs550_mIsReceiveData +#define XUartNs550_mIsReceiveData XUartNs550_IsReceiveData +#endif + +#ifndef XUartNs550_mIsTransmitEmpty +#define XUartNs550_mIsTransmitEmpty XUartNs550_IsTransmitEmpty +#endif + +/*********************************************************************/ +/** + * Macros for Driver XUsb + * + *********************************************************************/ +#ifndef XUsb_mReadReg +#define XUsb_mReadReg XUsb_ReadReg +#endif + +#ifndef XUsb_mWriteReg +#define XUsb_mWriteReg XUsb_WriteReg +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_misc_psreset_api.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_misc_psreset_api.h new file mode 100755 index 000000000..d74906877 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_misc_psreset_api.h @@ -0,0 +1,286 @@ +/****************************************************************************** +* +* (c) Copyright 2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil_misc_psreset_api.h +* +* This file contains the various register defintions and function prototypes for +* implementing the reset functionality of zynq ps devices +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00b kpc 03/07/13 First release. +* </pre> +* +******************************************************************************/ + +#ifndef XIL_MISC_RESET_H /* prevent circular inclusions */ +#define XIL_MISC_RESET_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ +#include "xil_types.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ +#define XDDRC_CTRL_BASEADDR 0xF8006000 +#define XSLCR_BASEADDR 0xF8000000 +/**< OCM configuration register */ +#define XSLCR_OCM_CFG_ADDR (XSLCR_BASEADDR + 0x910) +/**< SLCR unlock register */ +#define XSLCR_UNLOCK_ADDR (XSLCR_BASEADDR + 0x8) +/**< SLCR GEM0 rx clock control register */ +#define XSLCR_GEM0_RCLK_CTRL_ADDR (XSLCR_BASEADDR + 0x138) +/**< SLCR GEM1 rx clock control register */ +#define XSLCR_GEM1_RCLK_CTRL_ADDR (XSLCR_BASEADDR + 0x13C) +/**< SLCR GEM0 clock control register */ +#define XSLCR_GEM0_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x140) +/**< SLCR GEM1 clock control register */ +#define XSLCR_GEM1_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x144) +/**< SLCR SMC clock control register */ +#define XSLCR_SMC_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x148) +/**< SLCR GEM reset control register */ +#define XSLCR_GEM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x214) +/**< SLCR USB0 clock control register */ +#define XSLCR_USB0_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x130) +/**< SLCR USB1 clock control register */ +#define XSLCR_USB1_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x134) +/**< SLCR USB1 reset control register */ +#define XSLCR_USB_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x210) +/**< SLCR SMC reset control register */ +#define XSLCR_SMC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x234) +/**< SLCR Level shifter enable register */ +#define XSLCR_LVL_SHFTR_EN_ADDR (XSLCR_BASEADDR + 0x900) +/**< SLCR ARM pll control register */ +#define XSLCR_ARM_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x100) +/**< SLCR DDR pll control register */ +#define XSLCR_DDR_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x104) +/**< SLCR IO pll control register */ +#define XSLCR_IO_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x108) +/**< SLCR ARM pll configuration register */ +#define XSLCR_ARM_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x110) +/**< SLCR DDR pll configuration register */ +#define XSLCR_DDR_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x114) +/**< SLCR IO pll configuration register */ +#define XSLCR_IO_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x118) +/**< SLCR ARM clock control register */ +#define XSLCR_ARM_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x120) +/**< SLCR DDR clock control register */ +#define XSLCR_DDR_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x124) +/**< SLCR MIO pin address register */ +#define XSLCR_MIO_PIN_00_ADDR (XSLCR_BASEADDR + 0x700) +/**< SLCR DMAC reset control address register */ +#define XSLCR_DMAC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x20C) +/**< SLCR USB reset control address register */ +#define XSLCR_USB_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x210) +/**< SLCR GEM reset control address register */ +#define XSLCR_GEM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x214) +/**< SLCR SDIO reset control address register */ +#define XSLCR_SDIO_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x218) +/**< SLCR SPI reset control address register */ +#define XSLCR_SPI_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x21C) +/**< SLCR CAN reset control address register */ +#define XSLCR_CAN_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x220) +/**< SLCR I2C reset control address register */ +#define XSLCR_I2C_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x224) +/**< SLCR UART reset control address register */ +#define XSLCR_UART_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x228) +/**< SLCR GPIO reset control address register */ +#define XSLCR_GPIO_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x22C) +/**< SLCR LQSPI reset control address register */ +#define XSLCR_LQSPI_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x230) +/**< SLCR SMC reset control address register */ +#define XSLCR_SMC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x234) +/**< SLCR OCM reset control address register */ +#define XSLCR_OCM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x238) + +/**< SMC mem controller clear config register */ +#define XSMC_MEMC_CLR_CONFIG_OFFSET 0x0C +/**< SMC idlecount configuration register */ +#define XSMC_REFRESH_PERIOD_0_OFFSET 0x20 +#define XSMC_REFRESH_PERIOD_1_OFFSET 0x24 +/**< SMC ECC configuration register */ +#define XSMC_ECC_MEMCFG1_OFFSET 0x404 +/**< SMC ECC command 1 register */ +#define XSMC_ECC_MEMCMD1_OFFSET 0x404 +/**< SMC ECC command 2 register */ +#define XSMC_ECC_MEMCMD2_OFFSET 0x404 + +/**< SLCR unlock code */ +#define XSLCR_UNLOCK_CODE 0x0000DF0D + +/**< SMC mem clear configuration mask */ +#define XSMC_MEMC_CLR_CONFIG_MASK 0x5F +/**< SMC ECC memconfig 1 reset value */ +#define XSMC_ECC_MEMCFG1_RESET_VAL 0x43 +/**< SMC ECC memcommand 1 reset value */ +#define XSMC_ECC_MEMCMD1_RESET_VAL 0x01300080 +/**< SMC ECC memcommand 2 reset value */ +#define XSMC_ECC_MEMCMD2_RESET_VAL 0x01E00585 + +/**< DDR controller reset bit mask */ +#define XDDRPS_CTRL_RESET_MASK 0x1 +/**< SLCR OCM configuration reset value*/ +#define XSLCR_OCM_CFG_RESETVAL 0x8 +/**< SLCR OCM bank selection mask*/ +#define XSLCR_OCM_CFG_HIADDR_MASK 0xF +/**< SLCR level shifter enable mask*/ +#define XSLCR_LVL_SHFTR_EN_MASK 0xF + +/**< SLCR PLL register reset values */ +#define XSLCR_ARM_PLL_CTRL_RESET_VAL 0x0001A008 +#define XSLCR_DDR_PLL_CTRL_RESET_VAL 0x0001A008 +#define XSLCR_IO_PLL_CTRL_RESET_VAL 0x0001A008 +#define XSLCR_ARM_PLL_CFG_RESET_VAL 0x00177EA0 +#define XSLCR_DDR_PLL_CFG_RESET_VAL 0x00177EA0 +#define XSLCR_IO_PLL_CFG_RESET_VAL 0x00177EA0 +#define XSLCR_ARM_CLK_CTRL_RESET_VAL 0x1F000400 +#define XSLCR_DDR_CLK_CTRL_RESET_VAL 0x18400003 + +/**< SLCR MIO register default values */ +#define XSLCR_MIO_PIN_00_RESET_VAL 0x00001601 +#define XSLCR_MIO_PIN_02_RESET_VAL 0x00000601 + +/**< SLCR Reset control registers default values */ +#define XSLCR_DMAC_RST_CTRL_VAL 0x1 +#define XSLCR_GEM_RST_CTRL_VAL 0xF3 +#define XSLCR_USB_RST_CTRL_VAL 0x3 +#define XSLCR_I2C_RST_CTRL_VAL 0x3 +#define XSLCR_SPI_RST_CTRL_VAL 0xF +#define XSLCR_UART_RST_CTRL_VAL 0xF +#define XSLCR_QSPI_RST_CTRL_VAL 0x3 +#define XSLCR_GPIO_RST_CTRL_VAL 0x1 +#define XSLCR_SMC_RST_CTRL_VAL 0x3 +#define XSLCR_OCM_RST_CTRL_VAL 0x1 +#define XSLCR_SDIO_RST_CTRL_VAL 0x33 +#define XSLCR_CAN_RST_CTRL_VAL 0x3 +/**************************** Type Definitions *******************************/ + +/* the following data type is used to hold a null terminated version string + * consisting of the following format, "X.YYX" + */ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ +/* + * Performs reset operation to the ddr interface + */ +void XDdr_ResetHw(); +/* + * Map the ocm region to post bootrom state + */ +void XOcm_Remap(); +/* + * Performs the smc interface reset + */ +void XSmc_ResetHw(u32 BaseAddress); +/* + * updates the MIO registers with reset values + */ +void XSlcr_MioWriteResetValues(); +/* + * updates the PLL and clock registers with reset values + */ +void XSlcr_PllWriteResetValues(); +/* + * Disables the level shifters + */ +void XSlcr_DisableLevelShifters(); +/* + * provides softreset to the GPIO interface + */ +void XSlcr_GpioPsReset(void); +/* + * provides softreset to the DMA interface + */ +void XSlcr_DmaPsReset(void); +/* + * provides softreset to the SMC interface + */ +void XSlcr_SmcPsReset(void); +/* + * provides softreset to the CAN interface + */ +void XSlcr_CanPsReset(void); +/* + * provides softreset to the Uart interface + */ +void XSlcr_UartPsReset(void); +/* + * provides softreset to the I2C interface + */ +void XSlcr_I2cPsReset(void); +/* + * provides softreset to the SPI interface + */ +void XSlcr_SpiPsReset(void); +/* + * provides softreset to the QSPI interface + */ +void XSlcr_QspiPsReset(void); +/* + * provides softreset to the USB interface + */ +void XSlcr_UsbPsReset(void); +/* + * provides softreset to the GEM interface + */ +void XSlcr_EmacPsReset(void); +/* + * provides softreset to the OCM interface + */ +void XSlcr_OcmReset(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* XIL_MISC_RESET_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_mmu.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_mmu.h new file mode 100755 index 000000000..edbb7e523 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_mmu.h @@ -0,0 +1,87 @@ +/****************************************************************************** +* +* (c) Copyright 2012 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil_mmu.h +* +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 01/12/12 Initial version +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef XIL_MMU_H +#define XIL_MMU_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/***************************** Include Files *********************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void Xil_SetTlbAttributes(u32 addr, u32 attrib); +void Xil_EnableMMU(void); +void Xil_DisableMMU(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_MMU_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_printf.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_printf.h new file mode 100755 index 000000000..89a051c23 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_printf.h @@ -0,0 +1,47 @@ + #ifndef XIL_PRINTF_H + #define XIL_PRINTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <ctype.h> +#include <string.h> +#include <stdarg.h> +#include "xparameters.h" +#include "xil_types.h" + +/*----------------------------------------------------*/ +/* Use the following parameter passing structure to */ +/* make xil_printf re-entrant. */ +/*----------------------------------------------------*/ + +struct params_s; + + +/*---------------------------------------------------*/ +/* The purpose of this routine is to output data the */ +/* same as the standard printf function without the */ +/* overhead most run-time libraries involve. Usually */ +/* the printf brings in many kilobytes of code and */ +/* that is unacceptable in most embedded systems. */ +/*---------------------------------------------------*/ + +typedef char* charptr; +typedef int (*func_ptr)(int c); + +/* */ +void padding( const int l_flag, struct params_s *par); +void outs( charptr lp, struct params_s *par); +void outnum( const long n, const long base, struct params_s *par); +int getnum( charptr* linep); +void xil_printf( const char *ctrl1, ...); +void print( const char *ptr); +void outbyte (char); +char inbyte(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testcache.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testcache.h new file mode 100755 index 000000000..db6d29652 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testcache.h @@ -0,0 +1,71 @@ +/****************************************************************************** +* +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testcache.h +* +* This file contains utility functions to test cache. +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a hbm 07/29/09 First release +* +******************************************************************************/ + +#ifndef XIL_TESTCACHE_H /* prevent circular inclusions */ +#define XIL_TESTCACHE_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int Xil_TestDCacheRange(void); +extern int Xil_TestDCacheAll(void); +extern int Xil_TestICacheRange(void); +extern int Xil_TestICacheAll(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testio.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testio.h new file mode 100755 index 000000000..33a8286f1 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testio.h @@ -0,0 +1,101 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmemend.h +* +* This file contains utility functions to teach endian related memory +* IO functions. +* +* <b>Memory test description</b> +* +* A subset of the memory tests can be selected or all of the tests can be run +* in order. If there is an error detected by a subtest, the test stops and the +* failure code is returned. Further tests are not run even if all of the tests +* are selected. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00 hbm 08/05/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XIL_TESTIO_H /* prevent circular inclusions */ +#define XIL_TESTIO_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + + +#define XIL_TESTIO_DEFAULT 0 +#define XIL_TESTIO_LE 1 +#define XIL_TESTIO_BE 2 + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +extern int Xil_TestIO8(u8 *Addr, int Len, u8 Value); +extern int Xil_TestIO16(u16 *Addr, int Len, u16 Value, int Kind, int Swap); +extern int Xil_TestIO32(u32 *Addr, int Len, u32 Value, int Kind, int Swap); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testmem.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testmem.h new file mode 100755 index 000000000..74e131d5b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_testmem.h @@ -0,0 +1,173 @@ +/****************************************************************************** +* +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmem.h +* +* This file contains utility functions to test memory. +* +* <b>Memory test description</b> +* +* A subset of the memory tests can be selected or all of the tests can be run +* in order. If there is an error detected by a subtest, the test stops and the +* failure code is returned. Further tests are not run even if all of the tests +* are selected. +* +* Subtest descriptions: +* <pre> +* XIL_TESTMEM_ALLMEMTESTS: +* Runs all of the following tests +* +* XIL_TESTMEM_INCREMENT: +* Incrementing Value Test. +* This test starts at 'XIL_TESTMEM_INIT_VALUE' and uses the +* incrementing value as the test value for memory. +* +* XIL_TESTMEM_WALKONES: +* Walking Ones Test. +* This test uses a walking '1' as the test value for memory. +* location 1 = 0x00000001 +* location 2 = 0x00000002 +* ... +* +* XIL_TESTMEM_WALKZEROS: +* Walking Zero's Test. +* This test uses the inverse value of the walking ones test +* as the test value for memory. +* location 1 = 0xFFFFFFFE +* location 2 = 0xFFFFFFFD +* ... +* +* XIL_TESTMEM_INVERSEADDR: +* Inverse Address Test. +* This test uses the inverse of the address of the location under test +* as the test value for memory. +* +* XIL_TESTMEM_FIXEDPATTERN: +* Fixed Pattern Test. +* This test uses the provided patters as the test value for memory. +* If zero is provided as the pattern the test uses '0xDEADBEEF". +* </pre> +* +* <i>WARNING</i> +* +* The tests are <b>DESTRUCTIVE</b>. Run before any initialized memory spaces +* have been set up. +* +* The address provided to the memory tests is not checked for +* validity except for the NULL case. It is possible to provide a code-space +* pointer for this test to start with and ultimately destroy executable code +* causing random failures. +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** width, +* the patterns used in XIL_TESTMEM_WALKONES and XIL_TESTMEM_WALKZEROS will +* repeat on a boundry of a power of two making it more difficult to detect +* addressing errors. The XIL_TESTMEM_INCREMENT and XIL_TESTMEM_INVERSEADDR +* tests suffer the same problem. Ideally, if large blocks of memory are to be +* tested, break them up into smaller regions of memory to allow the test +* patterns used not to repeat over the region tested. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a hbm 08/25/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XIL_TESTMEM_H /* prevent circular inclusions */ +#define XIL_TESTMEM_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/* xutil_memtest defines */ + +#define XIL_TESTMEM_INIT_VALUE 1 + +/** @name Memory subtests + * @{ + */ +/** + * See the detailed description of the subtests in the file description. + */ +#define XIL_TESTMEM_ALLMEMTESTS 0 +#define XIL_TESTMEM_INCREMENT 1 +#define XIL_TESTMEM_WALKONES 2 +#define XIL_TESTMEM_WALKZEROS 3 +#define XIL_TESTMEM_INVERSEADDR 4 +#define XIL_TESTMEM_FIXEDPATTERN 5 +#define XIL_TESTMEM_MAXTEST XIL_TESTMEM_FIXEDPATTERN +/* @} */ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/* xutil_testmem prototypes */ + +extern int Xil_TestMem32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest); +extern int Xil_TestMem16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest); +extern int Xil_TestMem8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_types.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_types.h new file mode 100755 index 000000000..f86329e8b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xil_types.h @@ -0,0 +1,160 @@ +/****************************************************************************** +* +* (c) Copyright 2009-2011 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_types.h +* +* This file contains basic types for Xilinx software IP. + +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 07/14/09 First release +* 3.03a sdm 05/30/11 Added Xuint64 typedef and XUINT64_MSW/XUINT64_LSW macros +* </pre> +* +******************************************************************************/ + +#ifndef XIL_TYPES_H /* prevent circular inclusions */ +#define XIL_TYPES_H /* by using protection macros */ + + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +# define TRUE 1 +#endif + +#ifndef FALSE +# define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#define XIL_COMPONENT_IS_READY 0x11111111 /**< component has been initialized */ +#define XIL_COMPONENT_IS_STARTED 0x22222222 /**< component has been started */ + +/** @name New types + * New simple types. + * @{ + */ +#ifndef __KERNEL__ +#ifndef XBASIC_TYPES_H +/** + * guarded against xbasic_types.h. + */ +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; + +#define __XUINT64__ +typedef struct +{ + u32 Upper; + u32 Lower; +} Xuint64; + +/*****************************************************************************/ +/** +* Return the most significant half of the 64 bit data type. +* +* @param x is the 64 bit word. +* +* @return The upper 32 bits of the 64 bit word. +* +* @note None. +* +******************************************************************************/ +#define XUINT64_MSW(x) ((x).Upper) + +/*****************************************************************************/ +/** +* Return the least significant half of the 64 bit data type. +* +* @param x is the 64 bit word. +* +* @return The lower 32 bits of the 64 bit word. +* +* @note None. +* +******************************************************************************/ +#define XUINT64_LSW(x) ((x).Lower) + +#endif /* XBASIC_TYPES_H */ + +/** + * xbasic_types.h does not typedef s* or u64 + */ +typedef unsigned long long u64; + +typedef char s8; +typedef short s16; +typedef long s32; +typedef long long s64; +#else +#include <linux/types.h> +#endif + + +/*@}*/ + + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xl2cc.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xl2cc.h new file mode 100755 index 000000000..d7b4cfc94 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xl2cc.h @@ -0,0 +1,180 @@ +/****************************************************************************** +* +* (c) Copyright 2011-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xl2cc.h +* +* This file contains the address definitions for the PL310 Level-2 Cache +* Controller. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 02/01/10 Initial version +* 3.10a srt 04/18/13 Implemented ARM Erratas. Please refer to file +* 'xil_errata.h' for errata description +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _XL2CC_H_ +#define _XL2CC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ +/* L2CC Register Offsets */ +#define XPS_L2CC_ID_OFFSET 0x0000 +#define XPS_L2CC_TYPE_OFFSET 0x0004 +#define XPS_L2CC_CNTRL_OFFSET 0x0100 +#define XPS_L2CC_AUX_CNTRL_OFFSET 0x0104 +#define XPS_L2CC_TAG_RAM_CNTRL_OFFSET 0x0108 +#define XPS_L2CC_DATA_RAM_CNTRL_OFFSET 0x010C + +#define XPS_L2CC_EVNT_CNTRL_OFFSET 0x0200 +#define XPS_L2CC_EVNT_CNT1_CTRL_OFFSET 0x0204 +#define XPS_L2CC_EVNT_CNT0_CTRL_OFFSET 0x0208 +#define XPS_L2CC_EVNT_CNT1_VAL_OFFSET 0x020C +#define XPS_L2CC_EVNT_CNT0_VAL_OFFSET 0x0210 + +#define XPS_L2CC_IER_OFFSET 0x0214 /* Interrupt Mask */ +#define XPS_L2CC_IPR_OFFSET 0x0218 /* Masked interrupt status */ +#define XPS_L2CC_ISR_OFFSET 0x021C /* Raw Interrupt Status */ +#define XPS_L2CC_IAR_OFFSET 0x0220 /* Interrupt Clear */ + +#define XPS_L2CC_CACHE_SYNC_OFFSET 0x0730 /* Cache Sync */ +#define XPS_L2CC_DUMMY_CACHE_SYNC_OFFSET 0x0740 /* Dummy Register for Cache Sync */ +#define XPS_L2CC_CACHE_INVLD_PA_OFFSET 0x0770 /* Cache Invalid by PA */ +#define XPS_L2CC_CACHE_INVLD_WAY_OFFSET 0x077C /* Cache Invalid by Way */ +#define XPS_L2CC_CACHE_CLEAN_PA_OFFSET 0x07B0 /* Cache Clean by PA */ +#define XPS_L2CC_CACHE_CLEAN_INDX_OFFSET 0x07B8 /* Cache Clean by Index */ +#define XPS_L2CC_CACHE_CLEAN_WAY_OFFSET 0x07BC /* Cache Clean by Way */ +#define XPS_L2CC_CACHE_INV_CLN_PA_OFFSET 0x07F0 /* Cache Invalidate and Clean by PA */ +#define XPS_L2CC_CACHE_INV_CLN_INDX_OFFSET 0x07F8 /* Cache Invalidate and Clean by Index */ +#define XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET 0x07FC /* Cache Invalidate and Clean by Way */ + +#define XPS_L2CC_CACHE_DLCKDWN_0_WAY_OFFSET 0x0900 /* Cache Data Lockdown 0 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_0_WAY_OFFSET 0x0904 /* Cache Instruction Lockdown 0 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_1_WAY_OFFSET 0x0908 /* Cache Data Lockdown 1 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_1_WAY_OFFSET 0x090C /* Cache Instruction Lockdown 1 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_2_WAY_OFFSET 0x0910 /* Cache Data Lockdown 2 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_2_WAY_OFFSET 0x0914 /* Cache Instruction Lockdown 2 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_3_WAY_OFFSET 0x0918 /* Cache Data Lockdown 3 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_3_WAY_OFFSET 0x091C /* Cache Instruction Lockdown 3 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_4_WAY_OFFSET 0x0920 /* Cache Data Lockdown 4 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_4_WAY_OFFSET 0x0924 /* Cache Instruction Lockdown 4 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_5_WAY_OFFSET 0x0928 /* Cache Data Lockdown 5 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_5_WAY_OFFSET 0x092C /* Cache Instruction Lockdown 5 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_6_WAY_OFFSET 0x0930 /* Cache Data Lockdown 6 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_6_WAY_OFFSET 0x0934 /* Cache Instruction Lockdown 6 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_7_WAY_OFFSET 0x0938 /* Cache Data Lockdown 7 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_7_WAY_OFFSET 0x093C /* Cache Instruction Lockdown 7 by Way */ + +#define XPS_L2CC_CACHE_LCKDWN_LINE_ENABLE_OFFSET 0x0950 /* Cache Lockdown Line Enable */ +#define XPS_L2CC_CACHE_UUNLOCK_ALL_WAY_OFFSET 0x0954 /* Cache Unlock All Lines by Way */ + +#define XPS_L2CC_ADDR_FILTER_START_OFFSET 0x0C00 /* Start of address filtering */ +#define XPS_L2CC_ADDR_FILTER_END_OFFSET 0x0C04 /* Start of address filtering */ + +#define XPS_L2CC_DEBUG_CTRL_OFFSET 0x0F40 /* Debug Control Register */ + +/* XPS_L2CC_CNTRL_OFFSET bit masks */ +#define XPS_L2CC_ENABLE_MASK 0x00000001 /* enables the L2CC */ + +/* XPS_L2CC_AUX_CNTRL_OFFSET bit masks */ +#define XPS_L2CC_AUX_EBRESPE_MASK 0x40000000 /* Early BRESP Enable */ +#define XPS_L2CC_AUX_IPFE_MASK 0x20000000 /* Instruction Prefetch Enable */ +#define XPS_L2CC_AUX_DPFE_MASK 0x10000000 /* Data Prefetch Enable */ +#define XPS_L2CC_AUX_NSIC_MASK 0x08000000 /* Non-secure interrupt access control */ +#define XPS_L2CC_AUX_NSLE_MASK 0x04000000 /* Non-secure lockdown enable */ +#define XPS_L2CC_AUX_CRP_MASK 0x02000000 /* Cache replacement policy */ +#define XPS_L2CC_AUX_FWE_MASK 0x01800000 /* Force write allocate */ +#define XPS_L2CC_AUX_SAOE_MASK 0x00400000 /* Shared attribute override enable */ +#define XPS_L2CC_AUX_PE_MASK 0x00200000 /* Parity enable */ +#define XPS_L2CC_AUX_EMBE_MASK 0x00100000 /* Event monitor bus enable */ +#define XPS_L2CC_AUX_WAY_SIZE_MASK 0x000E0000 /* Way-size */ +#define XPS_L2CC_AUX_ASSOC_MASK 0x00010000 /* Associativity */ +#define XPS_L2CC_AUX_SAIE_MASK 0x00002000 /* Shared attribute invalidate enable */ +#define XPS_L2CC_AUX_EXCL_CACHE_MASK 0x00001000 /* Exclusive cache configuration */ +#define XPS_L2CC_AUX_SBDLE_MASK 0x00000800 /* Store buffer device limitation Enable */ +#define XPS_L2CC_AUX_HPSODRE_MASK 0x00000400 /* High Priority for SO and Dev Reads Enable */ +#define XPS_L2CC_AUX_FLZE_MASK 0x00000001 /* Full line of zero enable */ + +#define XPS_L2CC_AUX_REG_DEFAULT_MASK 0x72360000 /* Enable all prefetching, */ + /* Cache replacement policy, Parity enable, */ + /* Event monitor bus enable and Way Size (64 KB) */ +#define XPS_L2CC_AUX_REG_ZERO_MASK 0xFFF1FFFF /* */ + +#define XPS_L2CC_TAG_RAM_DEFAULT_MASK 0x00000111 /* latency for TAG RAM */ +#define XPS_L2CC_DATA_RAM_DEFAULT_MASK 0x00000121 /* latency for DATA RAM */ + +/* Interrupt bit masks */ +#define XPS_L2CC_IXR_DECERR_MASK 0x00000100 /* DECERR from L3 */ +#define XPS_L2CC_IXR_SLVERR_MASK 0x00000080 /* SLVERR from L3 */ +#define XPS_L2CC_IXR_ERRRD_MASK 0x00000040 /* Error on L2 data RAM (Read) */ +#define XPS_L2CC_IXR_ERRRT_MASK 0x00000020 /* Error on L2 tag RAM (Read) */ +#define XPS_L2CC_IXR_ERRWD_MASK 0x00000010 /* Error on L2 data RAM (Write) */ +#define XPS_L2CC_IXR_ERRWT_MASK 0x00000008 /* Error on L2 tag RAM (Write) */ +#define XPS_L2CC_IXR_PARRD_MASK 0x00000004 /* Parity Error on L2 data RAM (Read) */ +#define XPS_L2CC_IXR_PARRT_MASK 0x00000002 /* Parity Error on L2 tag RAM (Read) */ +#define XPS_L2CC_IXR_ECNTR_MASK 0x00000001 /* Event Counter1/0 Overflow Increment */ + +/* Address filtering mask and enable bit */ +#define XPS_L2CC_ADDR_FILTER_VALID_MASK 0xFFF00000 /* Address filtering valid bits*/ +#define XPS_L2CC_ADDR_FILTER_ENABLE_MASK 0x00000001 /* Address filtering enable bit*/ + +/* Debug control bits */ +#define XPS_L2CC_DEBUG_SPIDEN_MASK 0x00000004 /* Debug SPIDEN bit */ +#define XPS_L2CC_DEBUG_DWB_MASK 0x00000002 /* Debug DWB bit, forces write through */ +#define XPS_L2CC_DEBUG_DCL_MASK 0x00000002 /* Debug DCL bit, disables cache line fill */ + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xl2cc_counter.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xl2cc_counter.h new file mode 100755 index 000000000..30952b1dc --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xl2cc_counter.h @@ -0,0 +1,117 @@ +/****************************************************************************** +* +* (c) Copyright 2011-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xl2cc_counter.h +* +* This header file contains APIs for configuring and controlling the event +* counters in PL310 L2 cache controller. +* PL310 has 2 event counters which can be used to count a variety of events +* like DRHIT, DRREQ, DWHIT, DWREQ, etc. This file defines configurations, +* where value configures the event counters to count a set of events. +* +* XL2cc_EventCtrInit API can be used to select a set of events and +* XL2cc_EventCtrStart configures the event counters and starts the counters. +* XL2cc_EventCtrStop diables the event counters and returns the counter values. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sdm 07/11/11 First release +* 3.07a asa 08/30/12 Updated for CR 675636 to provide the L2 Base Address +* inside the APIs +* </pre> +* +******************************************************************************/ + +#ifndef L2CCCOUNTER_H /* prevent circular inclusions */ +#define L2CCCOUNTER_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xpseudo_asm.h" +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/************************** Constant Definitions ****************************/ + +/* + * The following constants define the event codes for the event counters. + */ +#define XL2CC_CO 0x1 +#define XL2CC_DRHIT 0x2 +#define XL2CC_DRREQ 0x3 +#define XL2CC_DWHIT 0x4 +#define XL2CC_DWREQ 0x5 +#define XL2CC_DWTREQ 0x6 +#define XL2CC_IRHIT 0x7 +#define XL2CC_IRREQ 0x8 +#define XL2CC_WA 0x9 +#define XL2CC_IPFALLOC 0xa +#define XL2CC_EPFHIT 0xb +#define XL2CC_EPFALLOC 0xc +#define XL2CC_SRRCVD 0xd +#define XL2CC_SRCONF 0xe +#define XL2CC_EPFRCVD 0xf + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +void XL2cc_EventCtrInit(int Event0, int Event1); +void XL2cc_EventCtrStart(void); +void XL2cc_EventCtrStop(u32 *EveCtr0, u32 *EveCtr1); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* L2CCCOUNTER_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xparameters.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xparameters.h new file mode 100644 index 000000000..ca53a8df2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xparameters.h @@ -0,0 +1,539 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver parameters +* +*******************************************************************/ + +#include "xparameters_ps.h" + +#define STDIN_BASEADDRESS 0xE0001000 +#define STDOUT_BASEADDRESS 0xE0001000 + +/******************************************************************/ + +/* Definitions for driver TMRCTR */ +#define XPAR_XTMRCTR_NUM_INSTANCES 1 + +/* Definitions for peripheral AXI_TIMER_0 */ +#define XPAR_AXI_TIMER_0_DEVICE_ID 0 +#define XPAR_AXI_TIMER_0_BASEADDR 0x42800000 +#define XPAR_AXI_TIMER_0_HIGHADDR 0x4280FFFF +#define XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ 100000000 + + +/******************************************************************/ + +/* Canonical definitions for peripheral AXI_TIMER_0 */ +#define XPAR_TMRCTR_0_DEVICE_ID XPAR_AXI_TIMER_0_DEVICE_ID +#define XPAR_TMRCTR_0_BASEADDR 0x42800000 +#define XPAR_TMRCTR_0_HIGHADDR 0x4280FFFF +#define XPAR_TMRCTR_0_CLOCK_FREQ_HZ XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ + +/******************************************************************/ + +/* Definitions for driver GPIO */ +#define XPAR_XGPIO_NUM_INSTANCES 1 + +/* Definitions for peripheral BTNS_4BITS_TRI_IO */ +#define XPAR_BTNS_4BITS_TRI_IO_BASEADDR 0x41200000 +#define XPAR_BTNS_4BITS_TRI_IO_HIGHADDR 0x4120FFFF +#define XPAR_BTNS_4BITS_TRI_IO_DEVICE_ID 0 +#define XPAR_BTNS_4BITS_TRI_IO_INTERRUPT_PRESENT 0 +#define XPAR_BTNS_4BITS_TRI_IO_IS_DUAL 0 + + +/******************************************************************/ + +/* Canonical definitions for peripheral BTNS_4BITS_TRI_IO */ +#define XPAR_GPIO_0_BASEADDR 0x41200000 +#define XPAR_GPIO_0_HIGHADDR 0x4120FFFF +#define XPAR_GPIO_0_DEVICE_ID XPAR_BTNS_4BITS_TRI_IO_DEVICE_ID +#define XPAR_GPIO_0_INTERRUPT_PRESENT 0 +#define XPAR_GPIO_0_IS_DUAL 0 + + +/******************************************************************/ + + +/* Definitions for peripheral PS7_AFI_0 */ +#define XPAR_PS7_AFI_0_S_AXI_BASEADDR 0xF8008000 +#define XPAR_PS7_AFI_0_S_AXI_HIGHADDR 0xF8008FFF + + +/* Definitions for peripheral PS7_AFI_1 */ +#define XPAR_PS7_AFI_1_S_AXI_BASEADDR 0xF8009000 +#define XPAR_PS7_AFI_1_S_AXI_HIGHADDR 0xF8009FFF + + +/* Definitions for peripheral PS7_AFI_2 */ +#define XPAR_PS7_AFI_2_S_AXI_BASEADDR 0xF800A000 +#define XPAR_PS7_AFI_2_S_AXI_HIGHADDR 0xF800AFFF + + +/* Definitions for peripheral PS7_AFI_3 */ +#define XPAR_PS7_AFI_3_S_AXI_BASEADDR 0xF800B000 +#define XPAR_PS7_AFI_3_S_AXI_HIGHADDR 0xF800BFFF + + +/* Definitions for peripheral PS7_CORESIGHT_COMP_0 */ +#define XPAR_PS7_CORESIGHT_COMP_0_S_AXI_BASEADDR 0xF8800000 +#define XPAR_PS7_CORESIGHT_COMP_0_S_AXI_HIGHADDR 0xF88FFFFF + + +/* Definitions for peripheral PS7_DDR_0 */ +#define XPAR_PS7_DDR_0_S_AXI_BASEADDR 0x00100000 +#define XPAR_PS7_DDR_0_S_AXI_HIGHADDR 0x1FFFFFFF +#define XPAR_PS7_DDR_0_S_AXI_HP0_BASEADDR 0x00000000 +#define XPAR_PS7_DDR_0_S_AXI_HP0_HIGHADDR 0x1FFFFFFF +#define XPAR_PS7_DDR_0_S_AXI_HP1_BASEADDR 0x00000000 +#define XPAR_PS7_DDR_0_S_AXI_HP1_HIGHADDR 0x1FFFFFFF +#define XPAR_PS7_DDR_0_S_AXI_HP2_BASEADDR 0x00000000 +#define XPAR_PS7_DDR_0_S_AXI_HP2_HIGHADDR 0x1FFFFFFF +#define XPAR_PS7_DDR_0_S_AXI_HP3_BASEADDR 0x00000000 +#define XPAR_PS7_DDR_0_S_AXI_HP3_HIGHADDR 0x1FFFFFFF + + +/* Definitions for peripheral PS7_DDRC_0 */ +#define XPAR_PS7_DDRC_0_S_AXI_BASEADDR 0xF8006000 +#define XPAR_PS7_DDRC_0_S_AXI_HIGHADDR 0xF8006FFF + + +/* Definitions for peripheral PS7_GLOBALTIMER_0 */ +#define XPAR_PS7_GLOBALTIMER_0_S_AXI_BASEADDR 0xF8F00200 +#define XPAR_PS7_GLOBALTIMER_0_S_AXI_HIGHADDR 0xF8F002FF + + +/* Definitions for peripheral PS7_GPV_0 */ +#define XPAR_PS7_GPV_0_S_AXI_BASEADDR 0xF8900000 +#define XPAR_PS7_GPV_0_S_AXI_HIGHADDR 0xF89FFFFF + + +/* Definitions for peripheral PS7_INTC_DIST_0 */ +#define XPAR_PS7_INTC_DIST_0_S_AXI_BASEADDR 0xF8F01000 +#define XPAR_PS7_INTC_DIST_0_S_AXI_HIGHADDR 0xF8F01FFF + + +/* Definitions for peripheral PS7_IOP_BUS_CONFIG_0 */ +#define XPAR_PS7_IOP_BUS_CONFIG_0_S_AXI_BASEADDR 0xE0200000 +#define XPAR_PS7_IOP_BUS_CONFIG_0_S_AXI_HIGHADDR 0xE0200FFF + + +/* Definitions for peripheral PS7_L2CACHEC_0 */ +#define XPAR_PS7_L2CACHEC_0_S_AXI_BASEADDR 0xF8F02000 +#define XPAR_PS7_L2CACHEC_0_S_AXI_HIGHADDR 0xF8F02FFF + + +/* Definitions for peripheral PS7_OCMC_0 */ +#define XPAR_PS7_OCMC_0_S_AXI_BASEADDR 0xF800C000 +#define XPAR_PS7_OCMC_0_S_AXI_HIGHADDR 0xF800CFFF + + +/* Definitions for peripheral PS7_QSPI_LINEAR_0 */ +#define XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR 0xFC000000 +#define XPAR_PS7_QSPI_LINEAR_0_S_AXI_HIGHADDR 0xFCFFFFFF + + +/* Definitions for peripheral PS7_RAM_0 */ +#define XPAR_PS7_RAM_0_S_AXI_BASEADDR 0x00000000 +#define XPAR_PS7_RAM_0_S_AXI_HIGHADDR 0x0002FFFF +#define XPAR_PS7_RAM_0_S_AXI_HP0_HIGHOCM_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_0_S_AXI_HP0_HIGHOCM_HIGHADDR 0xFFFFFDFF +#define XPAR_PS7_RAM_0_S_AXI_HP1_HIGHOCM_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_0_S_AXI_HP1_HIGHOCM_HIGHADDR 0xFFFFFDFF +#define XPAR_PS7_RAM_0_S_AXI_HP2_HIGHOCM_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_0_S_AXI_HP2_HIGHOCM_HIGHADDR 0xFFFFFDFF +#define XPAR_PS7_RAM_0_S_AXI_HP3_HIGHOCM_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_0_S_AXI_HP3_HIGHOCM_HIGHADDR 0xFFFFFDFF + + +/* Definitions for peripheral PS7_RAM_1 */ +#define XPAR_PS7_RAM_1_S_AXI_BASEADDR 0xFFFF0000 +#define XPAR_PS7_RAM_1_S_AXI_HIGHADDR 0xFFFFFDFF +#define XPAR_PS7_RAM_1_S_AXI_HP0_HIGHOCM_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_1_S_AXI_HP0_HIGHOCM_HIGHADDR 0xFFFFFDFF +#define XPAR_PS7_RAM_1_S_AXI_HP1_HIGHOCM_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_1_S_AXI_HP1_HIGHOCM_HIGHADDR 0xFFFFFDFF +#define XPAR_PS7_RAM_1_S_AXI_HP2_HIGHOCM_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_1_S_AXI_HP2_HIGHOCM_HIGHADDR 0xFFFFFDFF +#define XPAR_PS7_RAM_1_S_AXI_HP3_HIGHOCM_BASEADDR 0xFFFC0000 +#define XPAR_PS7_RAM_1_S_AXI_HP3_HIGHOCM_HIGHADDR 0xFFFFFDFF + + +/* Definitions for peripheral PS7_SCUC_0 */ +#define XPAR_PS7_SCUC_0_S_AXI_BASEADDR 0xF8F00000 +#define XPAR_PS7_SCUC_0_S_AXI_HIGHADDR 0xF8F000FC + + +/* Definitions for peripheral PS7_SD_0 */ +#define XPAR_PS7_SD_0_S_AXI_BASEADDR 0xE0100000 +#define XPAR_PS7_SD_0_S_AXI_HIGHADDR 0xE0100FFF + + +/* Definitions for peripheral PS7_SLCR_0 */ +#define XPAR_PS7_SLCR_0_S_AXI_BASEADDR 0xF8000000 +#define XPAR_PS7_SLCR_0_S_AXI_HIGHADDR 0xF8000FFF + + +/* Definitions for peripheral PWM_RECORDER_0 */ +#define XPAR_PWM_RECORDER_0_BASEADDR 0x76EA0000 +#define XPAR_PWM_RECORDER_0_HIGHADDR 0x76EAFFFF + + +/* Definitions for peripheral PWM_RECORDER_1 */ +#define XPAR_PWM_RECORDER_1_BASEADDR 0x76E80000 +#define XPAR_PWM_RECORDER_1_HIGHADDR 0x76E8FFFF + + +/* Definitions for peripheral PWM_RECORDER_2 */ +#define XPAR_PWM_RECORDER_2_BASEADDR 0x76E60000 +#define XPAR_PWM_RECORDER_2_HIGHADDR 0x76E6FFFF + + +/* Definitions for peripheral PWM_RECORDER_3 */ +#define XPAR_PWM_RECORDER_3_BASEADDR 0x76E40000 +#define XPAR_PWM_RECORDER_3_HIGHADDR 0x76E4FFFF + + +/* Definitions for peripheral PWM_RECORDER_4 */ +#define XPAR_PWM_RECORDER_4_BASEADDR 0x76E20000 +#define XPAR_PWM_RECORDER_4_HIGHADDR 0x76E2FFFF + + +/* Definitions for peripheral PWM_RECORDER_5 */ +#define XPAR_PWM_RECORDER_5_BASEADDR 0x76E00000 +#define XPAR_PWM_RECORDER_5_HIGHADDR 0x76E0FFFF + + +/* Definitions for peripheral PWM_SIGNAL_OUT_WKILLSWITCH_0 */ +#define XPAR_PWM_SIGNAL_OUT_WKILLSWITCH_0_BASEADDR 0x79460000 +#define XPAR_PWM_SIGNAL_OUT_WKILLSWITCH_0_HIGHADDR 0x7946FFFF + + +/* Definitions for peripheral PWM_SIGNAL_OUT_WKILLSWITCH_1 */ +#define XPAR_PWM_SIGNAL_OUT_WKILLSWITCH_1_BASEADDR 0x79440000 +#define XPAR_PWM_SIGNAL_OUT_WKILLSWITCH_1_HIGHADDR 0x7944FFFF + + +/* Definitions for peripheral PWM_SIGNAL_OUT_WKILLSWITCH_2 */ +#define XPAR_PWM_SIGNAL_OUT_WKILLSWITCH_2_BASEADDR 0x79420000 +#define XPAR_PWM_SIGNAL_OUT_WKILLSWITCH_2_HIGHADDR 0x7942FFFF + + +/* Definitions for peripheral PWM_SIGNAL_OUT_WKILLSWITCH_3 */ +#define XPAR_PWM_SIGNAL_OUT_WKILLSWITCH_3_BASEADDR 0x79400000 +#define XPAR_PWM_SIGNAL_OUT_WKILLSWITCH_3_HIGHADDR 0x7940FFFF + + +/******************************************************************/ + +/* Definitions for driver DEVCFG */ +#define XPAR_XDCFG_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_DEV_CFG_0 */ +#define XPAR_PS7_DEV_CFG_0_DEVICE_ID 0 +#define XPAR_PS7_DEV_CFG_0_BASEADDR 0xF8007000 +#define XPAR_PS7_DEV_CFG_0_HIGHADDR 0xF80070FF + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_DEV_CFG_0 */ +#define XPAR_XDCFG_0_DEVICE_ID XPAR_PS7_DEV_CFG_0_DEVICE_ID +#define XPAR_XDCFG_0_BASEADDR 0xF8007000 +#define XPAR_XDCFG_0_HIGHADDR 0xF80070FF + + +/******************************************************************/ + +/* Definitions for driver DMAPS */ +#define XPAR_XDMAPS_NUM_INSTANCES 2 + +/* Definitions for peripheral PS7_DMA_NS */ +#define XPAR_PS7_DMA_NS_DEVICE_ID 0 +#define XPAR_PS7_DMA_NS_BASEADDR 0xF8004000 +#define XPAR_PS7_DMA_NS_HIGHADDR 0xF8004FFF + + +/* Definitions for peripheral PS7_DMA_S */ +#define XPAR_PS7_DMA_S_DEVICE_ID 1 +#define XPAR_PS7_DMA_S_BASEADDR 0xF8003000 +#define XPAR_PS7_DMA_S_HIGHADDR 0xF8003FFF + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_DMA_NS */ +#define XPAR_XDMAPS_0_DEVICE_ID XPAR_PS7_DMA_NS_DEVICE_ID +#define XPAR_XDMAPS_0_BASEADDR 0xF8004000 +#define XPAR_XDMAPS_0_HIGHADDR 0xF8004FFF + +/* Canonical definitions for peripheral PS7_DMA_S */ +#define XPAR_XDMAPS_1_DEVICE_ID XPAR_PS7_DMA_S_DEVICE_ID +#define XPAR_XDMAPS_1_BASEADDR 0xF8003000 +#define XPAR_XDMAPS_1_HIGHADDR 0xF8003FFF + + +/******************************************************************/ + +/* Definitions for driver EMACPS */ +#define XPAR_XEMACPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_ETHERNET_0 */ +#define XPAR_PS7_ETHERNET_0_DEVICE_ID 0 +#define XPAR_PS7_ETHERNET_0_BASEADDR 0xE000B000 +#define XPAR_PS7_ETHERNET_0_HIGHADDR 0xE000BFFF +#define XPAR_PS7_ETHERNET_0_ENET_CLK_FREQ_HZ 125000000 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_1000MBPS_DIV0 8 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_1000MBPS_DIV1 1 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_100MBPS_DIV0 8 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_100MBPS_DIV1 5 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_10MBPS_DIV0 8 +#define XPAR_PS7_ETHERNET_0_ENET_SLCR_10MBPS_DIV1 50 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_ETHERNET_0 */ +#define XPAR_XEMACPS_0_DEVICE_ID XPAR_PS7_ETHERNET_0_DEVICE_ID +#define XPAR_XEMACPS_0_BASEADDR 0xE000B000 +#define XPAR_XEMACPS_0_HIGHADDR 0xE000BFFF +#define XPAR_XEMACPS_0_ENET_CLK_FREQ_HZ 125000000 +#define XPAR_XEMACPS_0_ENET_SLCR_1000Mbps_DIV0 8 +#define XPAR_XEMACPS_0_ENET_SLCR_1000Mbps_DIV1 1 +#define XPAR_XEMACPS_0_ENET_SLCR_100Mbps_DIV0 8 +#define XPAR_XEMACPS_0_ENET_SLCR_100Mbps_DIV1 5 +#define XPAR_XEMACPS_0_ENET_SLCR_10Mbps_DIV0 8 +#define XPAR_XEMACPS_0_ENET_SLCR_10Mbps_DIV1 50 + + +/******************************************************************/ + +/* Definitions for driver GPIOPS */ +#define XPAR_XGPIOPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_GPIO_0 */ +#define XPAR_PS7_GPIO_0_DEVICE_ID 0 +#define XPAR_PS7_GPIO_0_BASEADDR 0xE000A000 +#define XPAR_PS7_GPIO_0_HIGHADDR 0xE000AFFF + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_GPIO_0 */ +#define XPAR_XGPIOPS_0_DEVICE_ID XPAR_PS7_GPIO_0_DEVICE_ID +#define XPAR_XGPIOPS_0_BASEADDR 0xE000A000 +#define XPAR_XGPIOPS_0_HIGHADDR 0xE000AFFF + + +/******************************************************************/ + +/* Definitions for driver IICPS */ +#define XPAR_XIICPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_I2C_0 */ +#define XPAR_PS7_I2C_0_DEVICE_ID 0 +#define XPAR_PS7_I2C_0_BASEADDR 0xE0004000 +#define XPAR_PS7_I2C_0_HIGHADDR 0xE0004FFF +#define XPAR_PS7_I2C_0_I2C_CLK_FREQ_HZ 108333336 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_I2C_0 */ +#define XPAR_XIICPS_0_DEVICE_ID XPAR_PS7_I2C_0_DEVICE_ID +#define XPAR_XIICPS_0_BASEADDR 0xE0004000 +#define XPAR_XIICPS_0_HIGHADDR 0xE0004FFF +#define XPAR_XIICPS_0_I2C_CLK_FREQ_HZ 108333336 + + +/******************************************************************/ + +/* Definitions for driver QSPIPS */ +#define XPAR_XQSPIPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_QSPI_0 */ +#define XPAR_PS7_QSPI_0_DEVICE_ID 0 +#define XPAR_PS7_QSPI_0_BASEADDR 0xE000D000 +#define XPAR_PS7_QSPI_0_HIGHADDR 0xE000DFFF +#define XPAR_PS7_QSPI_0_QSPI_CLK_FREQ_HZ 200000000 +#define XPAR_PS7_QSPI_0_QSPI_MODE 0 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_QSPI_0 */ +#define XPAR_XQSPIPS_0_DEVICE_ID XPAR_PS7_QSPI_0_DEVICE_ID +#define XPAR_XQSPIPS_0_BASEADDR 0xE000D000 +#define XPAR_XQSPIPS_0_HIGHADDR 0xE000DFFF +#define XPAR_XQSPIPS_0_QSPI_CLK_FREQ_HZ 200000000 +#define XPAR_XQSPIPS_0_QSPI_MODE 0 + + +/******************************************************************/ + +/* Definitions for Fabric interrupts connected to ps7_scugic_0 */ + +/******************************************************************/ + +/* Canonical definitions for Fabric interrupts connected to ps7_scugic_0 */ + +/******************************************************************/ + +/* Definitions for driver SCUGIC */ +#define XPAR_XSCUGIC_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_SCUGIC_0 */ +#define XPAR_PS7_SCUGIC_0_DEVICE_ID 0 +#define XPAR_PS7_SCUGIC_0_BASEADDR 0xF8F00100 +#define XPAR_PS7_SCUGIC_0_HIGHADDR 0xF8F001FF +#define XPAR_PS7_SCUGIC_0_DIST_BASEADDR 0xF8F01000 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_SCUGIC_0 */ +#define XPAR_SCUGIC_0_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID +#define XPAR_SCUGIC_0_CPU_BASEADDR 0xF8F00100 +#define XPAR_SCUGIC_0_CPU_HIGHADDR 0xF8F001FF +#define XPAR_SCUGIC_0_DIST_BASEADDR 0xF8F01000 + + +/******************************************************************/ + +/* Definitions for driver SCUTIMER */ +#define XPAR_XSCUTIMER_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_SCUTIMER_0 */ +#define XPAR_PS7_SCUTIMER_0_DEVICE_ID 0 +#define XPAR_PS7_SCUTIMER_0_BASEADDR 0xF8F00600 +#define XPAR_PS7_SCUTIMER_0_HIGHADDR 0xF8F0061F + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_SCUTIMER_0 */ +#define XPAR_XSCUTIMER_0_DEVICE_ID XPAR_PS7_SCUTIMER_0_DEVICE_ID +#define XPAR_XSCUTIMER_0_BASEADDR 0xF8F00600 +#define XPAR_XSCUTIMER_0_HIGHADDR 0xF8F0061F + + +/******************************************************************/ + +/* Definitions for driver SCUWDT */ +#define XPAR_XSCUWDT_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_SCUWDT_0 */ +#define XPAR_PS7_SCUWDT_0_DEVICE_ID 0 +#define XPAR_PS7_SCUWDT_0_BASEADDR 0xF8F00620 +#define XPAR_PS7_SCUWDT_0_HIGHADDR 0xF8F006FF + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_SCUWDT_0 */ +#define XPAR_SCUWDT_0_DEVICE_ID XPAR_PS7_SCUWDT_0_DEVICE_ID +#define XPAR_SCUWDT_0_BASEADDR 0xF8F00620 +#define XPAR_SCUWDT_0_HIGHADDR 0xF8F006FF + + +/******************************************************************/ + +/* Definitions for driver UARTPS */ +#define XPAR_XUARTPS_NUM_INSTANCES 2 + +/* Definitions for peripheral PS7_UART_0 */ +#define XPAR_PS7_UART_0_DEVICE_ID 0 +#define XPAR_PS7_UART_0_BASEADDR 0xE0000000 +#define XPAR_PS7_UART_0_HIGHADDR 0xE0000FFF +#define XPAR_PS7_UART_0_UART_CLK_FREQ_HZ 50000000 +#define XPAR_PS7_UART_0_HAS_MODEM 0 + + +/* Definitions for peripheral PS7_UART_1 */ +#define XPAR_PS7_UART_1_DEVICE_ID 1 +#define XPAR_PS7_UART_1_BASEADDR 0xE0001000 +#define XPAR_PS7_UART_1_HIGHADDR 0xE0001FFF +#define XPAR_PS7_UART_1_UART_CLK_FREQ_HZ 50000000 +#define XPAR_PS7_UART_1_HAS_MODEM 0 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_UART_0 */ +#define XPAR_XUARTPS_0_DEVICE_ID XPAR_PS7_UART_0_DEVICE_ID +#define XPAR_XUARTPS_0_BASEADDR 0xE0000000 +#define XPAR_XUARTPS_0_HIGHADDR 0xE0000FFF +#define XPAR_XUARTPS_0_UART_CLK_FREQ_HZ 50000000 +#define XPAR_XUARTPS_0_HAS_MODEM 0 + +/* Canonical definitions for peripheral PS7_UART_1 */ +#define XPAR_XUARTPS_1_DEVICE_ID XPAR_PS7_UART_1_DEVICE_ID +#define XPAR_XUARTPS_1_BASEADDR 0xE0001000 +#define XPAR_XUARTPS_1_HIGHADDR 0xE0001FFF +#define XPAR_XUARTPS_1_UART_CLK_FREQ_HZ 50000000 +#define XPAR_XUARTPS_1_HAS_MODEM 0 + + +/******************************************************************/ + +/* Definitions for driver USBPS */ +#define XPAR_XUSBPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_USB_0 */ +#define XPAR_PS7_USB_0_DEVICE_ID 0 +#define XPAR_PS7_USB_0_BASEADDR 0xE0002000 +#define XPAR_PS7_USB_0_HIGHADDR 0xE0002FFF + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_USB_0 */ +#define XPAR_XUSBPS_0_DEVICE_ID XPAR_PS7_USB_0_DEVICE_ID +#define XPAR_XUSBPS_0_BASEADDR 0xE0002000 +#define XPAR_XUSBPS_0_HIGHADDR 0xE0002FFF + + +/******************************************************************/ + +/* Definitions for driver XADCPS */ +#define XPAR_XADCPS_NUM_INSTANCES 1 + +/* Definitions for peripheral PS7_XADC_0 */ +#define XPAR_PS7_XADC_0_DEVICE_ID 0 +#define XPAR_PS7_XADC_0_BASEADDR 0xF8007100 +#define XPAR_PS7_XADC_0_HIGHADDR 0xF8007120 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_XADC_0 */ +#define XPAR_XADCPS_0_DEVICE_ID XPAR_PS7_XADC_0_DEVICE_ID +#define XPAR_XADCPS_0_BASEADDR 0xF8007100 +#define XPAR_XADCPS_0_HIGHADDR 0xF8007120 + + +/******************************************************************/ + +/* Definition for CPU ID */ +#define XPAR_CPU_ID 0 + +/* Definitions for peripheral PS7_CORTEXA9_0 */ +#define XPAR_PS7_CORTEXA9_0_CPU_CLK_FREQ_HZ 650000000 + + +/******************************************************************/ + +/* Canonical definitions for peripheral PS7_CORTEXA9_0 */ +#define XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ 650000000 + + +/******************************************************************/ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xparameters_ps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xparameters_ps.h new file mode 100755 index 000000000..766e1705b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xparameters_ps.h @@ -0,0 +1,334 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xparameters_ps.h +* +* This file contains the address definitions for the hard peripherals +* attached to the ARM Cortex A9 core. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------- -------- --------------------------------------------------- +* 1.00a ecm/sdm 02/01/10 Initial version +* 3.04a sdm 02/02/12 Removed some of the defines as they are being generated through +* driver tcl +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _XPARAMETERS_PS_H_ +#define _XPARAMETERS_PS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/* + * This block contains constant declarations for the peripherals + * within the hardblock + */ + +/* Canonical definitions for DDR MEMORY */ +#define XPAR_DDR_MEM_BASEADDR 0x00000000 +#define XPAR_DDR_MEM_HIGHADDR 0x3FFFFFFF + +/* Canonical definitions for Interrupts */ +#define XPAR_XUARTPS_0_INTR XPS_UART0_INT_ID +#define XPAR_XUARTPS_1_INTR XPS_UART1_INT_ID +#define XPAR_XUSBPS_0_INTR XPS_USB0_INT_ID +#define XPAR_XUSBPS_1_INTR XPS_USB1_INT_ID +#define XPAR_XIICPS_0_INTR XPS_I2C0_INT_ID +#define XPAR_XIICPS_1_INTR XPS_I2C1_INT_ID +#define XPAR_XSPIPS_0_INTR XPS_SPI0_INT_ID +#define XPAR_XSPIPS_1_INTR XPS_SPI1_INT_ID +#define XPAR_XCANPS_0_INTR XPS_CAN0_INT_ID +#define XPAR_XCANPS_1_INTR XPS_CAN1_INT_ID +#define XPAR_XGPIOPS_0_INTR XPS_GPIO_INT_ID +#define XPAR_XEMACPS_0_INTR XPS_GEM0_INT_ID +#define XPAR_XEMACPS_0_WAKE_INTR XPS_GEM0_WAKE_INT_ID +#define XPAR_XEMACPS_1_INTR XPS_GEM1_INT_ID +#define XPAR_XEMACPS_1_WAKE_INTR XPS_GEM1_WAKE_INT_ID +#define XPAR_XSDIOPS_0_INTR XPS_SDIO0_INT_ID +#define XPAR_XQSPIPS_0_INTR XPS_QSPI_INT_ID +#define XPAR_XSDIOPS_1_INTR XPS_SDIO1_INT_ID +#define XPAR_XWDTPS_0_INTR XPS_WDT_INT_ID +#define XPAR_XDCFG_0_INTR XPS_DVC_INT_ID +#define XPAR_SCUTIMER_INTR XPS_SCU_TMR_INT_ID +#define XPAR_SCUWDT_INTR XPS_SCU_WDT_INT_ID +#define XPAR_XTTCPS_0_INTR XPS_TTC0_0_INT_ID +#define XPAR_XTTCPS_1_INTR XPS_TTC0_1_INT_ID +#define XPAR_XTTCPS_2_INTR XPS_TTC0_2_INT_ID +#define XPAR_XTTCPS_3_INTR XPS_TTC1_0_INT_ID +#define XPAR_XTTCPS_4_INTR XPS_TTC1_1_INT_ID +#define XPAR_XTTCPS_5_INTR XPS_TTC1_2_INT_ID +#define XPAR_XDMAPS_0_FAULT_INTR XPS_DMA0_ABORT_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_0 XPS_DMA0_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_1 XPS_DMA1_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_2 XPS_DMA2_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_3 XPS_DMA3_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_4 XPS_DMA4_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_5 XPS_DMA5_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_6 XPS_DMA6_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_7 XPS_DMA7_INT_ID + + +#define XPAR_XQSPIPS_0_LINEAR_BASEADDR XPS_QSPI_LINEAR_BASEADDR +#define XPAR_XPARPORTPS_CTRL_BASEADDR XPS_PARPORT_CRTL_BASEADDR + + + +/* Canonical definitions for DMAC */ + + +/* Canonical definitions for WDT */ + +/* Canonical definitions for SLCR */ +#define XPAR_XSLCR_NUM_INSTANCES 1 +#define XPAR_XSLCR_0_DEVICE_ID 0 +#define XPAR_XSLCR_0_BASEADDR XPS_SYS_CTRL_BASEADDR + +/* Canonical definitions for SCU GIC */ +#define XPAR_SCUGIC_NUM_INSTANCES 1 +#define XPAR_SCUGIC_SINGLE_DEVICE_ID 0 +#define XPAR_SCUGIC_CPU_BASEADDR (XPS_SCU_PERIPH_BASE + 0x0100) +#define XPAR_SCUGIC_DIST_BASEADDR (XPS_SCU_PERIPH_BASE + 0x1000) +#define XPAR_SCUGIC_ACK_BEFORE 0 + +/* Canonical definitions for Global Timer */ +#define XPAR_GLOBAL_TMR_NUM_INSTANCES 1 +#define XPAR_GLOBAL_TMR_DEVICE_ID 0 +#define XPAR_GLOBAL_TMR_BASEADDR (XPS_SCU_PERIPH_BASE + 0x200) +#define XPAR_GLOBAL_TMR_INTR XPS_GLOBAL_TMR_INT_ID + + +/* Xilinx Parallel Flash Library (XilFlash) User Settings */ +#define XPAR_AXI_EMC + + +#define XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ + + +/* + * This block contains constant declarations for the peripherals + * within the hardblock. These have been put for bacwards compatibilty + */ + +#define XPS_PERIPHERAL_BASEADDR 0xE0000000 +#define XPS_UART0_BASEADDR 0xE0000000 +#define XPS_UART1_BASEADDR 0xE0001000 +#define XPS_USB0_BASEADDR 0xE0002000 +#define XPS_USB1_BASEADDR 0xE0003000 +#define XPS_I2C0_BASEADDR 0xE0004000 +#define XPS_I2C1_BASEADDR 0xE0005000 +#define XPS_SPI0_BASEADDR 0xE0006000 +#define XPS_SPI1_BASEADDR 0xE0007000 +#define XPS_CAN0_BASEADDR 0xE0008000 +#define XPS_CAN1_BASEADDR 0xE0009000 +#define XPS_GPIO_BASEADDR 0xE000A000 +#define XPS_GEM0_BASEADDR 0xE000B000 +#define XPS_GEM1_BASEADDR 0xE000C000 +#define XPS_QSPI_BASEADDR 0xE000D000 +#define XPS_PARPORT_CRTL_BASEADDR 0xE000E000 +#define XPS_SDIO0_BASEADDR 0xE0100000 +#define XPS_SDIO1_BASEADDR 0xE0101000 +#define XPS_IOU_BUS_CFG_BASEADDR 0xE0200000 +#define XPS_NAND_BASEADDR 0xE1000000 +#define XPS_PARPORT0_BASEADDR 0xE2000000 +#define XPS_PARPORT1_BASEADDR 0xE4000000 +#define XPS_QSPI_LINEAR_BASEADDR 0xFC000000 +#define XPS_SYS_CTRL_BASEADDR 0xF8000000 /* AKA SLCR */ +#define XPS_TTC0_BASEADDR 0xF8001000 +#define XPS_TTC1_BASEADDR 0xF8002000 +#define XPS_DMAC0_SEC_BASEADDR 0xF8003000 +#define XPS_DMAC0_NON_SEC_BASEADDR 0xF8004000 +#define XPS_WDT_BASEADDR 0xF8005000 +#define XPS_DDR_CTRL_BASEADDR 0xF8006000 +#define XPS_DEV_CFG_APB_BASEADDR 0xF8007000 +#define XPS_AFI0_BASEADDR 0xF8008000 +#define XPS_AFI1_BASEADDR 0xF8009000 +#define XPS_AFI2_BASEADDR 0xF800A000 +#define XPS_AFI3_BASEADDR 0xF800B000 +#define XPS_OCM_BASEADDR 0xF800C000 +#define XPS_EFUSE_BASEADDR 0xF800D000 +#define XPS_CORESIGHT_BASEADDR 0xF8800000 +#define XPS_TOP_BUS_CFG_BASEADDR 0xF8900000 +#define XPS_SCU_PERIPH_BASE 0xF8F00000 +#define XPS_L2CC_BASEADDR 0xF8F02000 +#define XPS_SAM_RAM_BASEADDR 0xFFFC0000 +#define XPS_FPGA_AXI_S0_BASEADDR 0x40000000 +#define XPS_FPGA_AXI_S1_BASEADDR 0x80000000 +#define XPS_IOU_S_SWITCH_BASEADDR 0xE0000000 +#define XPS_PERIPH_APB_BASEADDR 0xF8000000 + +/* Shared Peripheral Interrupts (SPI) */ +#define XPS_CORE_PARITY0_INT_ID 32 +#define XPS_CORE_PARITY1_INT_ID 33 +#define XPS_L2CC_INT_ID 34 +#define XPS_OCMINTR_INT_ID 35 +#define XPS_ECC_INT_ID 36 +#define XPS_PMU0_INT_ID 37 +#define XPS_PMU1_INT_ID 38 +#define XPS_SYSMON_INT_ID 39 +#define XPS_DVC_INT_ID 40 +#define XPS_WDT_INT_ID 41 +#define XPS_TTC0_0_INT_ID 42 +#define XPS_TTC0_1_INT_ID 43 +#define XPS_TTC0_2_INT_ID 44 +#define XPS_DMA0_ABORT_INT_ID 45 +#define XPS_DMA0_INT_ID 46 +#define XPS_DMA1_INT_ID 47 +#define XPS_DMA2_INT_ID 48 +#define XPS_DMA3_INT_ID 49 +#define XPS_SMC_INT_ID 50 +#define XPS_QSPI_INT_ID 51 +#define XPS_GPIO_INT_ID 52 +#define XPS_USB0_INT_ID 53 +#define XPS_GEM0_INT_ID 54 +#define XPS_GEM0_WAKE_INT_ID 55 +#define XPS_SDIO0_INT_ID 56 +#define XPS_I2C0_INT_ID 57 +#define XPS_SPI0_INT_ID 58 +#define XPS_UART0_INT_ID 59 +#define XPS_CAN0_INT_ID 60 +#define XPS_FPGA0_INT_ID 61 +#define XPS_FPGA1_INT_ID 62 +#define XPS_FPGA2_INT_ID 63 +#define XPS_FPGA3_INT_ID 64 +#define XPS_FPGA4_INT_ID 65 +#define XPS_FPGA5_INT_ID 66 +#define XPS_FPGA6_INT_ID 67 +#define XPS_FPGA7_INT_ID 68 +#define XPS_TTC1_0_INT_ID 69 +#define XPS_TTC1_1_INT_ID 70 +#define XPS_TTC1_2_INT_ID 71 +#define XPS_DMA4_INT_ID 72 +#define XPS_DMA5_INT_ID 73 +#define XPS_DMA6_INT_ID 74 +#define XPS_DMA7_INT_ID 75 +#define XPS_USB1_INT_ID 76 +#define XPS_GEM1_INT_ID 77 +#define XPS_GEM1_WAKE_INT_ID 78 +#define XPS_SDIO1_INT_ID 79 +#define XPS_I2C1_INT_ID 80 +#define XPS_SPI1_INT_ID 81 +#define XPS_UART1_INT_ID 82 +#define XPS_CAN1_INT_ID 83 +#define XPS_FPGA8_INT_ID 84 +#define XPS_FPGA9_INT_ID 85 +#define XPS_FPGA10_INT_ID 86 +#define XPS_FPGA11_INT_ID 87 +#define XPS_FPGA12_INT_ID 88 +#define XPS_FPGA13_INT_ID 89 +#define XPS_FPGA14_INT_ID 90 +#define XPS_FPGA15_INT_ID 91 + +/* Private Peripheral Interrupts (PPI) */ +#define XPS_GLOBAL_TMR_INT_ID 27 /* SCU Global Timer interrupt */ +#define XPS_FIQ_INT_ID 28 /* FIQ from FPGA fabric */ +#define XPS_SCU_TMR_INT_ID 29 /* SCU Private Timer interrupt */ +#define XPS_SCU_WDT_INT_ID 30 /* SCU Private WDT interrupt */ +#define XPS_IRQ_INT_ID 31 /* IRQ from FPGA fabric */ + + +/* REDEFINES for TEST APP */ +/* Definitions for UART */ +#define XPAR_PS7_UART_0_INTR XPS_UART0_INT_ID +#define XPAR_PS7_UART_1_INTR XPS_UART1_INT_ID +#define XPAR_PS7_USB_0_INTR XPS_USB0_INT_ID +#define XPAR_PS7_USB_1_INTR XPS_USB1_INT_ID +#define XPAR_PS7_I2C_0_INTR XPS_I2C0_INT_ID +#define XPAR_PS7_I2C_1_INTR XPS_I2C1_INT_ID +#define XPAR_PS7_SPI_0_INTR XPS_SPI0_INT_ID +#define XPAR_PS7_SPI_1_INTR XPS_SPI1_INT_ID +#define XPAR_PS7_CAN_0_INTR XPS_CAN0_INT_ID +#define XPAR_PS7_CAN_1_INTR XPS_CAN1_INT_ID +#define XPAR_PS7_GPIO_0_INTR XPS_GPIO_INT_ID +#define XPAR_PS7_ETHERNET_0_INTR XPS_GEM0_INT_ID +#define XPAR_PS7_ETHERNET_0_WAKE_INTR XPS_GEM0_WAKE_INT_ID +#define XPAR_PS7_ETHERNET_1_INTR XPS_GEM1_INT_ID +#define XPAR_PS7_ETHERNET_1_WAKE_INTR XPS_GEM1_WAKE_INT_ID +#define XPAR_PS7_QSPI_0_INTR XPS_QSPI_INT_ID +#define XPAR_PS7_WDT_0_INTR XPS_WDT_INT_ID +#define XPAR_PS7_SCUWDT_0_INTR XPS_SCU_WDT_INT_ID +#define XPAR_PS7_SCUTIMER_0_INTR XPS_SCU_TMR_INT_ID +#define XPAR_PS7_XADC_0_INTR XPS_SYSMON_INT_ID + +#define XPAR_XADCPS_INT_ID XPS_SYSMON_INT_ID + +/* For backwards compatibilty */ +#define XPAR_XUARTPS_0_CLOCK_HZ XPAR_XUARTPS_0_UART_CLK_FREQ_HZ +#define XPAR_XUARTPS_1_CLOCK_HZ XPAR_XUARTPS_1_UART_CLK_FREQ_HZ +#define XPAR_XTTCPS_0_CLOCK_HZ XPAR_XTTCPS_0_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_1_CLOCK_HZ XPAR_XTTCPS_1_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_2_CLOCK_HZ XPAR_XTTCPS_2_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_3_CLOCK_HZ XPAR_XTTCPS_3_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_4_CLOCK_HZ XPAR_XTTCPS_4_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_5_CLOCK_HZ XPAR_XTTCPS_5_TTC_CLK_FREQ_HZ +#define XPAR_XIICPS_0_CLOCK_HZ XPAR_XIICPS_0_I2C_CLK_FREQ_HZ +#define XPAR_XIICPS_1_CLOCK_HZ XPAR_XIICPS_1_I2C_CLK_FREQ_HZ + +#define XPAR_XQSPIPS_0_CLOCK_HZ XPAR_XQSPIPS_0_QSPI_CLK_FREQ_HZ + +#ifdef XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ +#define XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ +#endif + +#ifdef XPAR_CPU_CORTEXA9_1_CPU_CLK_FREQ_HZ +#define XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ XPAR_CPU_CORTEXA9_1_CPU_CLK_FREQ_HZ +#endif + +#define XPAR_SCUTIMER_DEVICE_ID 0 +#define XPAR_SCUWDT_DEVICE_ID 0 + + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpm_counter.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpm_counter.h new file mode 100755 index 000000000..2ef3f9fab --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpm_counter.h @@ -0,0 +1,580 @@ +/****************************************************************************** +* +* (c) Copyright 2011-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpm_counter.h +* +* This header file contains APIs for configuring and controlling the Cortex-A9 +* Performance Monitor Events. +* Cortex-A9 Performance Monitor has 6 event counters which can be used to +* count a variety of events described in Coretx-A9 TRM. This file defines +* configurations, where value configures the event counters to count a +* set of events. +* +* Xpm_SetEvents can be used to set the event counters to count a set of events +* and Xpm_GetEventCounters can be used to read the counter values. +* +* @note +* +* This file doesn't handle the Cortex-A9 cycle counter, as the cycle counter is +* being used for time keeping. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sdm 07/11/11 First release +* </pre> +* +******************************************************************************/ + +#ifndef XPMCOUNTER_H /* prevent circular inclusions */ +#define XPMCOUNTER_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include <stdint.h> +#include "xpseudo_asm.h" +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/************************** Constant Definitions ****************************/ + +/* Number of performance counters */ +#define XPM_CTRCOUNT 6 + +/* The following constants define the Cortex-A9 Performance Monitor Events */ + +/* + * Software increment. The register is incremented only on writes to the + * Software Increment Register + */ +#define XPM_EVENT_SOFTINCR 0x00 + +/* + * Instruction fetch that causes a refill at (at least) the lowest level(s) of + * instruction or unified cache. Includes the speculative linefills in the + * count + */ +#define XPM_EVENT_INSRFETCH_CACHEREFILL 0x01 + +/* + * Instruction fetch that causes a TLB refill at (at least) the lowest level of + * TLB. Includes the speculative requests in the count + */ +#define XPM_EVENT_INSTRFECT_TLBREFILL 0x02 + +/* + * Data read or write operation that causes a refill at (at least) the lowest + * level(s)of data or unified cache. Counts the number of allocations performed + * in the Data Cache due to a read or a write + */ +#define XPM_EVENT_DATA_CACHEREFILL 0x03 + +/* + * Data read or write operation that causes a cache access at (at least) the + * lowest level(s) of data or unified cache. This includes speculative reads + */ +#define XPM_EVENT_DATA_CACHEACCESS 0x04 + +/* + * Data read or write operation that causes a TLB refill at (at least) the + * lowest level of TLB. This does not include micro TLB misses due to PLD, PLI, + * CP15 Cache operation by MVA and CP15 VA to PA operations + */ +#define XPM_EVENT_DATA_TLBREFILL 0x05 + +/* + * Data read architecturally executed. Counts the number of data read + * instructions accepted by the Load Store Unit. This includes counting the + * speculative and aborted LDR/LDM, as well as the reads due to the SWP + * instructions + */ +#define XPM_EVENT_DATA_READS 0x06 + +/* + * Data write architecturally executed. Counts the number of data write + * instructions accepted by the Load Store Unit. This includes counting the + * speculative and aborted STR/STM, as well as the writes due to the SWP + * instructions + */ +#define XPM_EVENT_DATA_WRITE 0x07 + +/* Exception taken. Counts the number of exceptions architecturally taken.*/ +#define XPM_EVENT_EXCEPTION 0x09 + +/* Exception return architecturally executed.*/ +#define XPM_EVENT_EXCEPRETURN 0x0A + +/* + * Change to ContextID retired. Counts the number of instructions + * architecturally executed writing into the ContextID Register + */ +#define XPM_EVENT_CHANGECONTEXT 0x0B + +/* + * Software change of PC, except by an exception, architecturally executed. + * Count the number of PC changes architecturally executed, excluding the PC + * changes due to taken exceptions + */ +#define XPM_EVENT_SW_CHANGEPC 0x0C + +/* + * Immediate branch architecturally executed (taken or not taken). This includes + * the branches which are flushed due to a previous load/store which aborts + * late + */ +#define XPM_EVENT_IMMEDBRANCH 0x0D + +/* + * Unaligned access architecturally executed. Counts the number of aborted + * unaligned accessed architecturally executed, and the number of not-aborted + * unaligned accesses, including the speculative ones + */ +#define XPM_EVENT_UNALIGNEDACCESS 0x0F + +/* + * Branch mispredicted/not predicted. Counts the number of mispredicted or + * not-predicted branches executed. This includes the branches which are flushed + * due to a previous load/store which aborts late + */ +#define XPM_EVENT_BRANCHMISS 0x10 + +/* + * Counts clock cycles when the Cortex-A9 processor is not in WFE/WFI. This + * event is not exported on the PMUEVENT bus + */ +#define XPM_EVENT_CLOCKCYCLES 0x11 + +/* + * Branches or other change in program flow that could have been predicted by + * the branch prediction resources of the processor. This includes the branches + * which are flushed due to a previous load/store which aborts late + */ +#define XPM_EVENT_BRANCHPREDICT 0x12 + +/* + * Java bytecode execute. Counts the number of Java bytecodes being decoded, + * including speculative ones + */ +#define XPM_EVENT_JAVABYTECODE 0x40 + +/* + * Software Java bytecode executed. Counts the number of software java bytecodes + * being decoded, including speculative ones + */ +#define XPM_EVENT_SWJAVABYTECODE 0x41 + +/* + * Jazelle backward branches executed. Counts the number of Jazelle taken + * branches being executed. This includes the branches which are flushed due + * to a previous load/store which aborts late + */ +#define XPM_EVENT_JAVABACKBRANCH 0x42 + +/* + * Coherent linefill miss Counts the number of coherent linefill requests + * performed by the Cortex-A9 processor which also miss in all the other + * Cortex-A9 processors, meaning that the request is sent to the external + * memory + */ +#define XPM_EVENT_COHERLINEMISS 0x50 + +/* + * Coherent linefill hit. Counts the number of coherent linefill requests + * performed by the Cortex-A9 processor which hit in another Cortex-A9 + * processor, meaning that the linefill data is fetched directly from the + * relevant Cortex-A9 cache + */ +#define XPM_EVENT_COHERLINEHIT 0x51 + +/* + * Instruction cache dependent stall cycles. Counts the number of cycles where + * the processor is ready to accept new instructions, but does not receive any + * due to the instruction side not being able to provide any and the + * instruction cache is currently performing at least one linefill + */ +#define XPM_EVENT_INSTRSTALL 0x60 + +/* + * Data cache dependent stall cycles. Counts the number of cycles where the core + * has some instructions that it cannot issue to any pipeline, and the Load + * Store unit has at least one pending linefill request, and no pending + */ +#define XPM_EVENT_DATASTALL 0x61 + +/* + * Main TLB miss stall cycles. Counts the number of cycles where the processor + * is stalled waiting for the completion of translation table walks from the + * main TLB. The processor stalls can be due to the instruction side not being + * able to provide the instructions, or to the data side not being able to + * provide the necessary data, due to them waiting for the main TLB translation + * table walk to complete + */ +#define XPM_EVENT_MAINTLBSTALL 0x62 + +/* + * Counts the number of STREX instructions architecturally executed and + * passed + */ +#define XPM_EVENT_STREXPASS 0x63 + +/* + * Counts the number of STREX instructions architecturally executed and + * failed + */ +#define XPM_EVENT_STREXFAIL 0x64 + +/* + * Data eviction. Counts the number of eviction requests due to a linefill in + * the data cache + */ +#define XPM_EVENT_DATAEVICT 0x65 + +/* + * Counts the number of cycles where the issue stage does not dispatch any + * instruction because it is empty or cannot dispatch any instructions + */ +#define XPM_EVENT_NODISPATCH 0x66 + +/* + * Counts the number of cycles where the issue stage is empty + */ +#define XPM_EVENT_ISSUEEMPTY 0x67 + +/* + * Counts the number of instructions going through the Register Renaming stage. + * This number is an approximate number of the total number of instructions + * speculatively executed, and even more approximate of the total number of + * instructions architecturally executed. The approximation depends mainly on + * the branch misprediction rate. + * The renaming stage can handle two instructions in the same cycle so the event + * is two bits long: + * - b00 no instructions renamed + * - b01 one instruction renamed + * - b10 two instructions renamed + */ +#define XPM_EVENT_INSTRRENAME 0x68 + +/* + * Counts the number of procedure returns whose condition codes do not fail, + * excluding all returns from exception. This count includes procedure returns + * which are flushed due to a previous load/store which aborts late. + * Only the following instructions are reported: + * - BX R14 + * - MOV PC LR + * - POP {..,pc} + * - LDR pc,[sp],#offset + * The following instructions are not reported: + * - LDMIA R9!,{..,PC} (ThumbEE state only) + * - LDR PC,[R9],#offset (ThumbEE state only) + * - BX R0 (Rm != R14) + * - MOV PC,R0 (Rm != R14) + * - LDM SP,{...,PC} (writeback not specified) + * - LDR PC,[SP,#offset] (wrong addressing mode) + */ +#define XPM_EVENT_PREDICTFUNCRET 0x6E + +/* + * Counts the number of instructions being executed in the main execution + * pipeline of the processor, the multiply pipeline and arithmetic logic unit + * pipeline. The counted instructions are still speculative + */ +#define XPM_EVENT_MAINEXEC 0x70 + +/* + * Counts the number of instructions being executed in the processor second + * execution pipeline (ALU). The counted instructions are still speculative + */ +#define XPM_EVENT_SECEXEC 0x71 + +/* + * Counts the number of instructions being executed in the Load/Store unit. The + * counted instructions are still speculative + */ +#define XPM_EVENT_LDRSTR 0x72 + +/* + * Counts the number of Floating-point instructions going through the Register + * Rename stage. Instructions are still speculative in this stage. + *Two floating-point instructions can be renamed in the same cycle so the event + * is two bitslong: + *0b00 no floating-point instruction renamed + *0b01 one floating-point instruction renamed + *0b10 two floating-point instructions renamed + */ +#define XPM_EVENT_FLOATRENAME 0x73 + +/* + * Counts the number of Neon instructions going through the Register Rename + * stage.Instructions are still speculative in this stage. + * Two NEON instructions can be renamed in the same cycle so the event is two + * bits long: + *0b00 no NEON instruction renamed + *0b01 one NEON instruction renamed + *0b10 two NEON instructions renamed + */ +#define XPM_EVENT_NEONRENAME 0x74 + +/* + * Counts the number of cycles where the processor is stalled because PLD slots + * are all full + */ +#define XPM_EVENT_PLDSTALL 0x80 + +/* + * Counts the number of cycles when the processor is stalled and the data side + * is stalled too because it is full and executing writes to the external + * memory + */ +#define XPM_EVENT_WRITESTALL 0x81 + +/* + * Counts the number of stall cycles due to main TLB misses on requests issued + * by the instruction side + */ +#define XPM_EVENT_INSTRTLBSTALL 0x82 + +/* + * Counts the number of stall cycles due to main TLB misses on requests issued + * by the data side + */ +#define XPM_EVENT_DATATLBSTALL 0x83 + +/* + * Counts the number of stall cycles due to micro TLB misses on the instruction + * side. This event does not include main TLB miss stall cycles that are already + * counted in the corresponding main TLB event + */ +#define XPM_EVENT_INSTR_uTLBSTALL 0x84 + +/* + * Counts the number of stall cycles due to micro TLB misses on the data side. + * This event does not include main TLB miss stall cycles that are already + * counted in the corresponding main TLB event + */ +#define XPM_EVENT_DATA_uTLBSTALL 0x85 + +/* + * Counts the number of stall cycles because of the execution of a DMB memory + * barrier. This includes all DMB instructions being executed, even + * speculatively + */ +#define XPM_EVENT_DMB_STALL 0x86 + +/* + * Counts the number of cycles during which the integer core clock is enabled + */ +#define XPM_EVENT_INT_CLKEN 0x8A + +/* + * Counts the number of cycles during which the Data Engine clock is enabled + */ +#define XPM_EVENT_DE_CLKEN 0x8B + +/* + * Counts the number of ISB instructions architecturally executed + */ +#define XPM_EVENT_INSTRISB 0x90 + +/* + * Counts the number of DSB instructions architecturally executed + */ +#define XPM_EVENT_INSTRDSB 0x91 + +/* + * Counts the number of DMB instructions speculatively executed + */ +#define XPM_EVENT_INSTRDMB 0x92 + +/* + * Counts the number of external interrupts executed by the processor + */ +#define XPM_EVENT_EXTINT 0x93 + +/* + * PLE cache line request completed + */ +#define XPM_EVENT_PLE_LRC 0xA0 + +/* + * PLE cache line request skipped + */ +#define XPM_EVENT_PLE_LRS 0xA1 + +/* + * PLE FIFO flush + */ +#define XPM_EVENT_PLE_FLUSH 0xA2 + +/* + * PLE request complete + */ +#define XPM_EVENT_PLE_CMPL 0xA3 + +/* + * PLE FIFO overflow + */ +#define XPM_EVENT_PLE_OVFL 0xA4 + +/* + * PLE request programmed + */ +#define XPM_EVENT_PLE_PROG 0xA5 + +/* + * The following constants define the configurations for Cortex-A9 Performance + * Monitor Events. Each configuration configures the event counters for a set + * of events. + * ----------------------------------------------- + * Config PmCtr0... PmCtr5 + * ----------------------------------------------- + * XPM_CNTRCFG1 { XPM_EVENT_SOFTINCR, + * XPM_EVENT_INSRFETCH_CACHEREFILL, + * XPM_EVENT_INSTRFECT_TLBREFILL, + * XPM_EVENT_DATA_CACHEREFILL, + * XPM_EVENT_DATA_CACHEACCESS, + * XPM_EVENT_DATA_TLBREFILL } + * + * XPM_CNTRCFG2 { XPM_EVENT_DATA_READS, + * XPM_EVENT_DATA_WRITE, + * XPM_EVENT_EXCEPTION, + * XPM_EVENT_EXCEPRETURN, + * XPM_EVENT_CHANGECONTEXT, + * XPM_EVENT_SW_CHANGEPC } + * + * XPM_CNTRCFG3 { XPM_EVENT_IMMEDBRANCH, + * XPM_EVENT_UNALIGNEDACCESS, + * XPM_EVENT_BRANCHMISS, + * XPM_EVENT_CLOCKCYCLES, + * XPM_EVENT_BRANCHPREDICT, + * XPM_EVENT_JAVABYTECODE } + * + * XPM_CNTRCFG4 { XPM_EVENT_SWJAVABYTECODE, + * XPM_EVENT_JAVABACKBRANCH, + * XPM_EVENT_COHERLINEMISS, + * XPM_EVENT_COHERLINEHIT, + * XPM_EVENT_INSTRSTALL, + * XPM_EVENT_DATASTALL } + * + * XPM_CNTRCFG5 { XPM_EVENT_MAINTLBSTALL, + * XPM_EVENT_STREXPASS, + * XPM_EVENT_STREXFAIL, + * XPM_EVENT_DATAEVICT, + * XPM_EVENT_NODISPATCH, + * XPM_EVENT_ISSUEEMPTY } + * + * XPM_CNTRCFG6 { XPM_EVENT_INSTRRENAME, + * XPM_EVENT_PREDICTFUNCRET, + * XPM_EVENT_MAINEXEC, + * XPM_EVENT_SECEXEC, + * XPM_EVENT_LDRSTR, + * XPM_EVENT_FLOATRENAME } + * + * XPM_CNTRCFG7 { XPM_EVENT_NEONRENAME, + * XPM_EVENT_PLDSTALL, + * XPM_EVENT_WRITESTALL, + * XPM_EVENT_INSTRTLBSTALL, + * XPM_EVENT_DATATLBSTALL, + * XPM_EVENT_INSTR_uTLBSTALL } + * + * XPM_CNTRCFG8 { XPM_EVENT_DATA_uTLBSTALL, + * XPM_EVENT_DMB_STALL, + * XPM_EVENT_INT_CLKEN, + * XPM_EVENT_DE_CLKEN, + * XPM_EVENT_INSTRISB, + * XPM_EVENT_INSTRDSB } + * + * XPM_CNTRCFG9 { XPM_EVENT_INSTRDMB, + * XPM_EVENT_EXTINT, + * XPM_EVENT_PLE_LRC, + * XPM_EVENT_PLE_LRS, + * XPM_EVENT_PLE_FLUSH, + * XPM_EVENT_PLE_CMPL } + * + * XPM_CNTRCFG10 { XPM_EVENT_PLE_OVFL, + * XPM_EVENT_PLE_PROG, + * XPM_EVENT_PLE_LRC, + * XPM_EVENT_PLE_LRS, + * XPM_EVENT_PLE_FLUSH, + * XPM_EVENT_PLE_CMPL } + * + * XPM_CNTRCFG11 { XPM_EVENT_DATASTALL, + * XPM_EVENT_INSRFETCH_CACHEREFILL, + * XPM_EVENT_INSTRFECT_TLBREFILL, + * XPM_EVENT_DATA_CACHEREFILL, + * XPM_EVENT_DATA_CACHEACCESS, + * XPM_EVENT_DATA_TLBREFILL } + */ +#define XPM_CNTRCFG1 0 +#define XPM_CNTRCFG2 1 +#define XPM_CNTRCFG3 2 +#define XPM_CNTRCFG4 3 +#define XPM_CNTRCFG5 4 +#define XPM_CNTRCFG6 5 +#define XPM_CNTRCFG7 6 +#define XPM_CNTRCFG8 7 +#define XPM_CNTRCFG9 8 +#define XPM_CNTRCFG10 9 +#define XPM_CNTRCFG11 10 + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +/* Interface fuctions to access perfromance counters from abstraction layer */ +void Xpm_SetEvents(int PmcrCfg); +void Xpm_GetEventCounters(u32 *PmCtrValue); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpseudo_asm.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpseudo_asm.h new file mode 100755 index 000000000..e44a79954 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpseudo_asm.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpseudo_asm.h +* +* This header file contains macros for using inline assembler code. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 10/18/09 First release +* 3.04a sdm 01/02/12 Remove redundant dsb in mcr instruction. +* </pre> +* +******************************************************************************/ +#include "xreg_cortexa9.h" +#ifdef __GNUC__ + #include "xpseudo_asm_gcc.h" +#elif defined (__ICCARM__) + #include "xpseudo_asm_iccarm.h" +#else + #include "xpseudo_asm_rvct.h" +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h new file mode 100755 index 000000000..52fac3b34 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xpseudo_asm_gcc.h @@ -0,0 +1,183 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpseudo_asm_gcc.h +* +* This header file contains macros for using inline assembler code. It is +* written specifically for the GNU compiler. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 10/28/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XPSEUDO_ASM_GCC_H /* prevent circular inclusions */ +#define XPSEUDO_ASM_GCC_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/* necessary for pre-processor */ +#define stringify(s) tostring(s) +#define tostring(s) #s + +/* pseudo assembler instructions */ +#define mfcpsr() ({unsigned int rval; \ + __asm__ __volatile__(\ + "mrs %0, cpsr\n"\ + : "=r" (rval)\ + );\ + rval;\ + }) + +#define mtcpsr(v) __asm__ __volatile__(\ + "msr cpsr,%0\n"\ + : : "r" (v)\ + ) + +#define cpsiei() __asm__ __volatile__("cpsie i\n") +#define cpsidi() __asm__ __volatile__("cpsid i\n") + +#define cpsief() __asm__ __volatile__("cpsie f\n") +#define cpsidf() __asm__ __volatile__("cpsid f\n") + + + +#define mtgpr(rn, v) __asm__ __volatile__(\ + "mov r" stringify(rn) ", %0 \n"\ + : : "r" (v)\ + ) + +#define mfgpr(rn) ({unsigned int rval; \ + __asm__ __volatile__(\ + "mov %0,r" stringify(rn) "\n"\ + : "=r" (rval)\ + );\ + rval;\ + }) + +/* memory synchronization operations */ + +/* Instruction Synchronization Barrier */ +#define isb() __asm__ __volatile__ ("isb" : : : "memory") + +/* Data Synchronization Barrier */ +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") + +/* Data Memory Barrier */ +#define dmb() __asm__ __volatile__ ("dmb" : : : "memory") + + +/* Memory Operations */ +#define ldr(adr) ({unsigned long rval; \ + __asm__ __volatile__(\ + "ldr %0,[%1]"\ + : "=r" (rval) : "r" (adr)\ + );\ + rval;\ + }) + +#define ldrb(adr) ({unsigned char rval; \ + __asm__ __volatile__(\ + "ldrb %0,[%1]"\ + : "=r" (rval) : "r" (adr)\ + );\ + rval;\ + }) + +#define str(adr, val) __asm__ __volatile__(\ + "str %0,[%1]\n"\ + : : "r" (val), "r" (adr)\ + ) + +#define strb(adr, val) __asm__ __volatile__(\ + "strb %0,[%1]\n"\ + : : "r" (val), "r" (adr)\ + ) + +/* Count leading zeroes (clz) */ +#define clz(arg) ({unsigned char rval; \ + __asm__ __volatile__(\ + "clz %0,%1"\ + : "=r" (rval) : "r" (arg)\ + );\ + rval;\ + }) + +/* CP15 operations */ +#define mtcp(rn, v) __asm__ __volatile__(\ + "mcr " rn "\n"\ + : : "r" (v)\ + ); + +#define mfcp(rn) ({unsigned int rval; \ + __asm__ __volatile__(\ + "mrc " rn "\n"\ + : "=r" (rval)\ + );\ + rval;\ + }) + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XPSEUDO_ASM_GCC_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xqspips.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xqspips.h new file mode 100755 index 000000000..3114f5b57 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xqspips.h @@ -0,0 +1,790 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips.h +* +* This file contains the implementation of the XQspiPs driver. It supports only +* master mode. User documentation for the driver functions is contained in this +* file in the form of comment blocks at the front of each function. +* +* A QSPI device connects to an QSPI bus through a 4-wire serial interface. +* The QSPI bus is a full-duplex, synchronous bus that facilitates communication +* between one master and one slave. The device is always full-duplex, +* which means that for every byte sent, one is received, and vice-versa. +* The master controls the clock, so it can regulate when it wants to +* send or receive data. The slave is under control of the master, it must +* respond quickly since it has no control of the clock and must send/receive +* data as fast or as slow as the master does. +* +* <b> Linear Mode </b> +* The Linear Quad-SPI Controller extends the existing Quad-SPI Controller’s +* functionality by adding a linear addressing scheme that allows the SPI flash +* memory subsystem to behave like a typical ROM device. The new feature hides +* the normal SPI protocol from a master reading from the SPI flash memory. The +* feature improves both the user friendliness and the overall read memory +* throughput over that of the current Quad-SPI Controller by lessening the +* amount of software overheads required and by the use of the faster AXI +* interface. +* +* <b>Initialization & Configuration</b> +* +* The XQspiPs_Config structure is used by the driver to configure itself. This +* configuration structure is typically created by the tool-chain based on HW +* build properties. +* +* To support multiple runtime loading and initialization strategies employed by +* various operating systems, the driver instance can be initialized in the +* following way: +* - XQspiPs_LookupConfig(DeviceId) - Use the device identifier to find +* static configuration structure defined in xqspips_g.c. This is setup +* by the tools. For some operating systems the config structure will be +* initialized by the software and this call is not needed. +* - XQspiPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a +* configuration structure provided by the caller. If running in a system +* with address translation, the provided virtual memory base address +* replaces the physical address present in the configuration structure. +* +* <b>Multiple Masters</b> +* +* More than one master can exist, but arbitration is the responsibility of +* the higher layer software. The device driver does not perform any type of +* arbitration. +* +* <b>Modes of Operation</b> +* +* There are four modes to perform a data transfer and the selection of a mode +* is based on Chip Select(CS) and Start. These two options individually, can +* be controlled either by software(Manual) or hardware(Auto). +* - Auto CS: Chip select is automatically asserted as soon as the first word +* is written into the TXFIFO and de asserted when the TXFIFO becomes +* empty +* - Manual CS: Software must assert and de assert CS. +* - Auto Start: Data transmission starts as soon as there is data in the +* TXFIFO and stalls when the TXFIFO is empty +* - Manual Start: Software must start data transmission at the beginning of +* the transaction or whenever the TXFIFO has become empty +* +* The preferred combination is Manual CS and Auto Start. +* In this combination, the software asserts CS before loading any data into +* TXFIFO. In Auto Start mode, whenever data is in TXFIFO, controller sends it +* out until TXFIFO becomes empty. The software reads the RXFIFO whenever the +* data is available. If no further data, software disables CS. +* +* Risks/challenges of other combinations: +* - Manual CS and Manual Start: Manual Start bit should be set after each +* TXFIFO write otherwise there could be a race condition where the TXFIFO +* becomes empty before the new word is written. In that case the +* transmission stops. +* - Auto CS with Manual or Auto Start: It is very difficult for software to +* keep the TXFIFO filled. Whenever the TXFIFO runs empty, CS is de asserted. +* This results in a single transaction to be split into multiple pieces each +* with its own chip select. This will result in garbage data to be sent. +* +* <b>Interrupts</b> +* +* The user must connect the interrupt handler of the driver, +* XQspiPs_InterruptHandler, to an interrupt system such that it will be +* called when an interrupt occurs. This function does not save and restore +* the processor context such that the user must provide this processing. +* +* The driver handles the following interrupts: +* - Data Transmit Register/FIFO Underflow +* - Data Receive Register/FIFO Not Empty +* - Data Transmit Register/FIFO Overwater +* - Data Receive Register/FIFO Overrun +* +* The Data Transmit Register/FIFO Overwater interrupt -- indicates that the +* QSPI device has transmitted the data available to transmit, and now its data +* register and FIFO is ready to accept more data. The driver uses this +* interrupt to indicate progress while sending data. The driver may have +* more data to send, in which case the data transmit register and FIFO is +* filled for subsequent transmission. When this interrupt arrives and all +* the data has been sent, the driver invokes the status callback with a +* value of XST_SPI_TRANSFER_DONE to inform the upper layer software that +* all data has been sent. +* +* The Data Transmit Register/FIFO Underflow interrupt -- indicates that, +* as slave, the QSPI device was required to transmit but there was no data +* available to transmit in the transmit register (or FIFO). This may not +* be an error if the master is not expecting data. But in the case where +* the master is expecting data, this serves as a notification of such a +* condition. The driver reports this condition to the upper layer +* software through the status handler. +* +* The Data Receive Register/FIFO Overrun interrupt -- indicates that the QSPI +* device received data and subsequently dropped the data because the data +* receive register and FIFO was full. The driver reports this condition to the +* upper layer software through the status handler. This likely indicates a +* problem with the higher layer protocol, or a problem with the slave +* performance. +* +* +* <b>Polled Operation</b> +* +* Transfer in polled mode is supported through a separate interface function +* XQspiPs_PolledTransfer(). Unlike the transfer function in the interrupt mode, +* this function blocks until all data has been sent/received. +* +* <b>Device Busy</b> +* +* Some operations are disallowed when the device is busy. The driver tracks +* whether a device is busy. The device is considered busy when a data transfer +* request is outstanding, and is considered not busy only when that transfer +* completes (or is aborted with a mode fault error). +* +* <b>Device Configuration</b> +* +* The device can be configured in various ways during the FPGA implementation +* process. Configuration parameters are stored in the xqspips_g.c file or +* passed in via XQspiPs_CfgInitialize(). A table is defined where each entry +* contains configuration information for an QSPI device, including the base +* address for the device. +* +* <b>RTOS Independence</b> +* +* This driver is intended to be RTOS and processor independent. It works with +* physical addresses only. Any needs for dynamic memory management, threads or +* thread mutual exclusion, virtual memory, or cache control must be satisfied +* by the layer above this driver. +* +* NOTE: This driver was always tested with endianess set to little-endian. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 1.00a sdm 11/25/10 First release, based on the PS SPI driver. +* 1.01a sdm 11/22/11 Added TCL file for generating QSPI parameters +* in xparameters.h +* 2.00a kka 07/25/12 Added a few register defines for CR 670297 +* Removed code related to mode fault for CR 671468 +* The XQspiPs_SetSlaveSelect has been modified to remove +* the argument of the slave select as the QSPI controller +* only supports one slave. +* XQspiPs_GetSlaveSelect API has been removed +* Added a flag ShiftReadData to the instance structure +*. and is used in the XQspiPs_GetReadData API. +* The ShiftReadData Flag indicates whether the data +* read from the Rx FIFO needs to be shifted +* in cases where the data is less than 4 bytes +* Removed the selection for the following options: +* Master mode (XQSPIPS_MASTER_OPTION) and +* Flash interface mode (XQSPIPS_FLASH_MODE_OPTION) option +* as the QSPI driver supports the Master mode +* and Flash Interface mode and doesnot support +* Slave mode or the legacy mode. +* Modified the XQspiPs_PolledTransfer and XQspiPs_Transfer +* APIs so that the last argument (IsInst) specifying whether +* it is instruction or data has been removed. The first byte +* in the SendBufPtr argument of these APIs specify the +* instruction to be sent to the Flash Device. +* This version of the driver fixes CRs 670197/663787/ +* 670297/671468. +* Added the option for setting the Holdb_dr bit in the +* configuration options, XQSPIPS_HOLD_B_DRIVE_OPTION +* is the option to be used for setting this bit in the +* configuration register. +* The XQspiPs_PolledTransfer function has been updated +* to fill the data to fifo depth. +* 2.01a sg 02/03/13 Added flash opcodes for DUAL_IO_READ,QUAD_IO_READ. +* Added macros for Set/Get Rx Watermark. Changed QSPI +* Enable/Disable macro argument from BaseAddress to +* Instance Pointer. Added DelayNss argument to SetDelays +* and GetDelays API's. +* Created macros XQspiPs_IsManualStart and +* XQspiPs_IsManualChipSelect. +* Changed QSPI transfer logic for polled and interrupt +* modes to be based on filled tx fifo count and receive +* based on it. RXNEMPTY interrupt is not used. +* Added assertions to XQspiPs_LqspiRead function. +* SetDelays and GetDelays API's include DelayNss parameter. +* Added defines for DelayNss,Rx Watermark,Interrupts +* which need write to clear. Removed Read zeros mask from +* LQSPI Config register. Renamed Fixed burst error to +* data FSM error in LQSPI Status register. +* +* 2.02a hk 05/07/13 Added ConnectionMode to config structure. +* Corresponds to C_QSPI_MODE - 0:Single, 1:Stacked, 2:Parallel +* Added enable and disable to the XQspiPs_LqspiRead() function +* Removed XQspi_Reset() in Set_Options() function when +* LQSPI_MODE_OPTION is set. +* Added instructions for bank selection, die erase and +* flag status register to the flash instruction table +* Handling for instructions not in flash instruction +* table added. Checking for Tx FIFO empty when switching from +* TXD1/2/3 to TXD0 added. If WRSR instruction is sent with +* byte count 3 (spansion), instruction size and TXD register +* changed accordingly. CR# 712502 and 703869. +* Added prefix to constant definitions for ConnectionMode +* Added (#ifdef linear base address) in the Linear read function. +* Changed XPAR_XQSPIPS_0_LINEAR_BASEADDR to +* XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR in +* XQspiPs_LqspiRead function. Fix for CR#718141. +* +* 2.03a hk 09/17/13 Modified polled and interrupt transfers to make use of +* thresholds. This is to improve performance. +* Added API's for QSPI reset and +* linear mode initialization for boot. +* Added RX and TX threshold reset to one in XQspiPs_Abort. +* Added RX threshold reset(1) after transfer in polled and +* interrupt transfers. Made changes to make sure threshold +* change is done only when no transfer is in progress. +* Updated linear init API for parallel and stacked modes. +* CR#737760. +* +* </pre> +* +******************************************************************************/ +#ifndef XQSPIPS_H /* prevent circular inclusions */ +#define XQSPIPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xqspips_hw.h" +#include <string.h> + +/************************** Constant Definitions *****************************/ + +/** @name Configuration options + * + * The following options are supported to enable/disable certain features of + * an QSPI device. Each of the options is a bit mask, so more than one may be + * specified. + * + * + * The <b>Active Low Clock option</b> configures the device's clock polarity. + * Setting this option means the clock is active low and the SCK signal idles + * high. By default, the clock is active high and SCK idles low. + * + * The <b>Clock Phase option</b> configures the QSPI device for one of two + * transfer formats. A clock phase of 0, the default, means data is valid on + * the first SCK edge (rising or falling) after the slave select (SS) signal + * has been asserted. A clock phase of 1 means data is valid on the second SCK + * edge (rising or falling) after SS has been asserted. + * + * + * The <b>QSPI Force Slave Select option</b> is used to enable manual control of + * the slave select signal. + * 0: The SPI_SS signal is controlled by the QSPI controller during + * transfers. (Default) + * 1: The SPI_SS signal is forced active (driven low) regardless of any + * transfers in progress. + * + * NOTE: The driver will handle setting and clearing the Slave Select when + * the user sets the "FORCE_SSELECT_OPTION". Using this option will allow the + * QSPI clock to be set to a faster speed. If the QSPI clock is too fast, the + * processor cannot empty and refill the FIFOs before the TX FIFO is empty + * When the QSPI hardware is controlling the Slave Select signals, this + * will cause slave to be de-selected and terminate the transfer. + * + * The <b>Manual Start option</b> is used to enable manual control of + * the Start command to perform data transfer. + * 0: The Start command is controlled by the QSPI controller during + * transfers(Default). Data transmission starts as soon as there is data in + * the TXFIFO and stalls when the TXFIFO is empty + * 1: The Start command must be issued by software to perform data transfer. + * Bit 15 of Configuration register is used to issue Start command. This bit + * must be set whenever TXFIFO is filled with new data. + * + * NOTE: The driver will set the Manual Start Enable bit in Configuration + * Register, if Manual Start option is selected. Software will issue + * Manual Start command whenever TXFIFO is filled with data. When there is + * no further data, driver will clear the Manual Start Enable bit. + * + * @{ + */ +#define XQSPIPS_CLK_ACTIVE_LOW_OPTION 0x2 /**< Active Low Clock option */ +#define XQSPIPS_CLK_PHASE_1_OPTION 0x4 /**< Clock Phase one option */ +#define XQSPIPS_FORCE_SSELECT_OPTION 0x10 /**< Force Slave Select */ +#define XQSPIPS_MANUAL_START_OPTION 0x20 /**< Manual Start enable */ +#define XQSPIPS_LQSPI_MODE_OPTION 0x80 /**< Linear QPSI mode */ +#define XQSPIPS_HOLD_B_DRIVE_OPTION 0x100 /**< Drive HOLD_B Pin */ +/*@}*/ + + +/** @name QSPI Clock Prescaler options + * The QSPI Clock Prescaler Configuration bits are used to program master mode + * bit rate. The bit rate can be programmed in divide-by-two decrements from + * pclk/2 to pclk/256. + * + * @{ + */ +#define XQSPIPS_CLK_PRESCALE_2 0x00 /**< PCLK/2 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_4 0x01 /**< PCLK/4 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_8 0x02 /**< PCLK/8 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_16 0x03 /**< PCLK/16 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_32 0x04 /**< PCLK/32 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_64 0x05 /**< PCLK/64 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_128 0x06 /**< PCLK/128 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_256 0x07 /**< PCLK/256 Prescaler */ + +/*@}*/ + + +/** @name Callback events + * + * These constants specify the handler events that are passed to + * a handler from the driver. These constants are not bit masks such that + * only one will be passed at a time to the handler. + * + * @{ + */ +#define XQSPIPS_EVENT_TRANSFER_DONE 2 /**< Transfer done */ +#define XQSPIPS_EVENT_TRANSMIT_UNDERRUN 3 /**< TX FIFO empty */ +#define XQSPIPS_EVENT_RECEIVE_OVERRUN 4 /**< Receive data loss because + RX FIFO full */ +/*@}*/ + +/** @name Flash commands + * + * The following constants define most of the commands supported by flash + * devices. Users can add more commands supported by the flash devices + * + * @{ + */ +#define XQSPIPS_FLASH_OPCODE_WRSR 0x01 /* Write status register */ +#define XQSPIPS_FLASH_OPCODE_PP 0x02 /* Page program */ +#define XQSPIPS_FLASH_OPCODE_NORM_READ 0x03 /* Normal read data bytes */ +#define XQSPIPS_FLASH_OPCODE_WRDS 0x04 /* Write disable */ +#define XQSPIPS_FLASH_OPCODE_RDSR1 0x05 /* Read status register 1 */ +#define XQSPIPS_FLASH_OPCODE_WREN 0x06 /* Write enable */ +#define XQSPIPS_FLASH_OPCODE_FAST_READ 0x0B /* Fast read data bytes */ +#define XQSPIPS_FLASH_OPCODE_BE_4K 0x20 /* Erase 4KiB block */ +#define XQSPIPS_FLASH_OPCODE_RDSR2 0x35 /* Read status register 2 */ +#define XQSPIPS_FLASH_OPCODE_DUAL_READ 0x3B /* Dual read data bytes */ +#define XQSPIPS_FLASH_OPCODE_BE_32K 0x52 /* Erase 32KiB block */ +#define XQSPIPS_FLASH_OPCODE_QUAD_READ 0x6B /* Quad read data bytes */ +#define XQSPIPS_FLASH_OPCODE_ERASE_SUS 0x75 /* Erase suspend */ +#define XQSPIPS_FLASH_OPCODE_ERASE_RES 0x7A /* Erase resume */ +#define XQSPIPS_FLASH_OPCODE_RDID 0x9F /* Read JEDEC ID */ +#define XQSPIPS_FLASH_OPCODE_BE 0xC7 /* Erase whole flash block */ +#define XQSPIPS_FLASH_OPCODE_SE 0xD8 /* Sector erase (usually 64KB)*/ +#define XQSPIPS_FLASH_OPCODE_DUAL_IO_READ 0xBB /* Read data using Dual I/O */ +#define XQSPIPS_FLASH_OPCODE_QUAD_IO_READ 0xEB /* Read data using Quad I/O */ +#define XQSPIPS_FLASH_OPCODE_BRWR 0x17 /* Bank Register Write */ +#define XQSPIPS_FLASH_OPCODE_BRRD 0x16 /* Bank Register Read */ +/* Extende Address Register Write - Micron's equivalent of Bank Register */ +#define XQSPIPS_FLASH_OPCODE_EARWR 0xC5 +/* Extende Address Register Read - Micron's equivalent of Bank Register */ +#define XQSPIPS_FLASH_OPCODE_EARRD 0xC8 +#define XQSPIPS_FLASH_OPCODE_DIE_ERASE 0xC4 +#define XQSPIPS_FLASH_OPCODE_READ_FLAG_SR 0x70 +#define XQSPIPS_FLASH_OPCODE_CLEAR_FLAG_SR 0x50 +#define XQSPIPS_FLASH_OPCODE_READ_LOCK_REG 0xE8 /* Lock register Read */ +#define XQSPIPS_FLASH_OPCODE_WRITE_LOCK_REG 0xE5 /* Lock Register Write */ + +/*@}*/ + +/** @name Instruction size + * + * The following constants define numbers 1 to 4. + * Used to identify whether TXD0,1,2 or 3 is to be used. + * + * @{ + */ +#define XQSPIPS_SIZE_ONE 1 +#define XQSPIPS_SIZE_TWO 2 +#define XQSPIPS_SIZE_THREE 3 +#define XQSPIPS_SIZE_FOUR 4 + +/*@}*/ + +/** @name ConnectionMode + * + * The following constants are the possible values of ConnectionMode in + * Config structure. + * + * @{ + */ +#define XQSPIPS_CONNECTION_MODE_SINGLE 0 +#define XQSPIPS_CONNECTION_MODE_STACKED 1 +#define XQSPIPS_CONNECTION_MODE_PARALLEL 2 + +/*@}*/ + +/** @name FIFO threshold value + * + * This is the Rx FIFO threshold (in words) that was found to be most + * optimal in terms of performance + * + * @{ + */ +#define XQSPIPS_RXFIFO_THRESHOLD_OPT 32 + +/*@}*/ + +/**************************** Type Definitions *******************************/ +/** + * The handler data type allows the user to define a callback function to + * handle the asynchronous processing for the QSPI device. The application + * using this driver is expected to define a handler of this type to support + * interrupt driven mode. The handler executes in an interrupt context, so + * only minimal processing should be performed. + * + * @param CallBackRef is the callback reference passed in by the upper + * layer when setting the callback functions, and passed back to + * the upper layer when the callback is invoked. Its type is + * not important to the driver, so it is a void pointer. + * @param StatusEvent holds one or more status events that have occurred. + * See the XQspiPs_SetStatusHandler() for details on the status + * events that can be passed in the callback. + * @param ByteCount indicates how many bytes of data were successfully + * transferred. This may be less than the number of bytes + * requested if the status event indicates an error. + */ +typedef void (*XQspiPs_StatusHandler) (void *CallBackRef, u32 StatusEvent, + unsigned ByteCount); + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Base address of the device */ + u32 InputClockHz; /**< Input clock frequency */ + u8 ConnectionMode; /**< Single, Stacked and Parallel mode */ +} XQspiPs_Config; + +/** + * The XQspiPs driver instance data. The user is required to allocate a + * variable of this type for every QSPI device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XQspiPs_Config Config; /**< Configuration structure */ + u32 IsReady; /**< Device is initialized and ready */ + + u8 *SendBufferPtr; /**< Buffer to send (state) */ + u8 *RecvBufferPtr; /**< Buffer to receive (state) */ + int RequestedBytes; /**< Number of bytes to transfer (state) */ + int RemainingBytes; /**< Number of bytes left to transfer(state) */ + u32 IsBusy; /**< A transfer is in progress (state) */ + XQspiPs_StatusHandler StatusHandler; + void *StatusRef; /**< Callback reference for status handler */ + u32 ShiftReadData; /**< Flag to indicate whether the data + * read from the Rx FIFO needs to be shifted + * in cases where the data is less than 4 + * bytes + */ +} XQspiPs; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/* +* +* Check in OptionsTable if Manual Start Option is enabled or disabled. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return +* - TRUE if option is set +* - FALSE if option is not set +* +* @note C-Style signature: +* u8 XQspiPs_IsManualStart(XQspiPs *InstancePtr); +* +*****************************************************************************/ +#define XQspiPs_IsManualStart(InstancePtr) \ + ((XQspiPs_GetOptions(InstancePtr) & \ + XQSPIPS_MANUAL_START_OPTION) ? TRUE : FALSE) + +/****************************************************************************/ +/* +* +* Check in OptionsTable if Manual Chip Select Option is enabled or disabled. +* +* @param InstancePtr is a pointer to the XSpiPs instance. +* +* @return +* - TRUE if option is set +* - FALSE if option is not set +* +* @note C-Style signature: +* u8 XQspiPs_IsManualChipSelect(XQspiPs *InstancePtr); +* +*****************************************************************************/ +#define XQspiPs_IsManualChipSelect(InstancePtr) \ + ((XQspiPs_GetOptions(InstancePtr) & \ + XQSPIPS_FORCE_SSELECT_OPTION) ? TRUE : FALSE) + +/****************************************************************************/ +/** +* +* Set the contents of the slave idle count register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RegisterValue is the value to be written, valid values are +* 0-255. +* +* @return None +* +* @note +* C-Style signature: +* void XQspiPs_SetSlaveIdle(XQspiPs *InstancePtr, u32 RegisterValue) +* +*****************************************************************************/ +#define XQspiPs_SetSlaveIdle(InstancePtr, RegisterValue) \ + XQspiPs_Out32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_SICR_OFFSET, (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the contents of the slave idle count register. Use the XQSPIPS_SICR_* +* constants defined in xqspips_hw.h to interpret the bit-mask returned. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return An 8-bit value representing Slave Idle Count. +* +* @note C-Style signature: +* u32 XQspiPs_GetSlaveIdle(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_GetSlaveIdle(InstancePtr) \ + XQspiPs_In32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_SICR_OFFSET) + +/****************************************************************************/ +/** +* +* Set the contents of the transmit FIFO watermark register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RegisterValue is the value to be written, valid values are 1-63. +* +* @return None. +* +* @note +* C-Style signature: +* void XQspiPs_SetTXWatermark(XQspiPs *InstancePtr, u32 RegisterValue) +* +*****************************************************************************/ +#define XQspiPs_SetTXWatermark(InstancePtr, RegisterValue) \ + XQspiPs_Out32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_TXWR_OFFSET, (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the contents of the transmit FIFO watermark register. +* Valid values are in the range 1-63. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return A 6-bit value representing Tx Watermark level. +* +* @note C-Style signature: +* u32 XQspiPs_GetTXWatermark(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_GetTXWatermark(InstancePtr) \ + XQspiPs_In32((InstancePtr->Config.BaseAddress) + XQSPIPS_TXWR_OFFSET) + +/****************************************************************************/ +/** +* +* Set the contents of the receive FIFO watermark register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RegisterValue is the value to be written, valid values are 1-63. +* +* @return None. +* +* @note +* C-Style signature: +* void XQspiPs_SetRXWatermark(XQspiPs *InstancePtr, u32 RegisterValue) +* +*****************************************************************************/ +#define XQspiPs_SetRXWatermark(InstancePtr, RegisterValue) \ + XQspiPs_Out32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_RXWR_OFFSET, (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the contents of the receive FIFO watermark register. +* Valid values are in the range 1-63. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return A 6-bit value representing Rx Watermark level. +* +* @note C-Style signature: +* u32 XQspiPs_GetRXWatermark(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_GetRXWatermark(InstancePtr) \ + XQspiPs_In32((InstancePtr->Config.BaseAddress) + XQSPIPS_RXWR_OFFSET) + +/****************************************************************************/ +/** +* +* Enable the device and uninhibit master transactions. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XQspiPs_Enable(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_Enable(InstancePtr) \ + XQspiPs_Out32((InstancePtr->Config.BaseAddress) + XQSPIPS_ER_OFFSET, \ + XQSPIPS_ER_ENABLE_MASK) + +/****************************************************************************/ +/** +* +* Disable the device. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XQspiPs_Disable(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_Disable(InstancePtr) \ + XQspiPs_Out32((InstancePtr->Config.BaseAddress) + XQSPIPS_ER_OFFSET, 0) + +/****************************************************************************/ +/** +* +* Set the contents of the Linear QSPI Configuration register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RegisterValue is the value to be written to the Linear QSPI +* configuration register. +* +* @return None. +* +* @note +* C-Style signature: +* void XQspiPs_SetLqspiConfigReg(XQspiPs *InstancePtr, +* u32 RegisterValue) +* +*****************************************************************************/ +#define XQspiPs_SetLqspiConfigReg(InstancePtr, RegisterValue) \ + XQspiPs_Out32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_LQSPI_CR_OFFSET, (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the contents of the Linear QSPI Configuration register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return A 32-bit value representing the contents of the LQSPI Config +* register. +* +* @note C-Style signature: +* u32 XQspiPs_GetLqspiConfigReg(u32 *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_GetLqspiConfigReg(InstancePtr) \ + XQspiPs_In32((InstancePtr->Config.BaseAddress) + \ + XQSPIPS_LQSPI_CR_OFFSET) + +/************************** Function Prototypes ******************************/ + +/* + * Initialization function, implemented in xqspips_sinit.c + */ +XQspiPs_Config *XQspiPs_LookupConfig(u16 DeviceId); + +/* + * Functions implemented in xqspips.c + */ +int XQspiPs_CfgInitialize(XQspiPs *InstancePtr, XQspiPs_Config * Config, + u32 EffectiveAddr); +void XQspiPs_Reset(XQspiPs *InstancePtr); +void XQspiPs_Abort(XQspiPs *InstancePtr); + +int XQspiPs_Transfer(XQspiPs *InstancePtr, u8 *SendBufPtr, u8 *RecvBufPtr, + unsigned ByteCount); +int XQspiPs_PolledTransfer(XQspiPs *InstancePtr, u8 *SendBufPtr, + u8 *RecvBufPtr, unsigned ByteCount); +int XQspiPs_LqspiRead(XQspiPs *InstancePtr, u8 *RecvBufPtr, + u32 Address, unsigned ByteCount); + +int XQspiPs_SetSlaveSelect(XQspiPs *InstancePtr); + +void XQspiPs_SetStatusHandler(XQspiPs *InstancePtr, void *CallBackRef, + XQspiPs_StatusHandler FuncPtr); +void XQspiPs_InterruptHandler(void *InstancePtr); + +/* + * Functions for selftest, in xqspips_selftest.c + */ +int XQspiPs_SelfTest(XQspiPs *InstancePtr); + +/* + * Functions for options, in xqspips_options.c + */ +int XQspiPs_SetOptions(XQspiPs *InstancePtr, u32 Options); +u32 XQspiPs_GetOptions(XQspiPs *InstancePtr); + +int XQspiPs_SetClkPrescaler(XQspiPs *InstancePtr, u8 Prescaler); +u8 XQspiPs_GetClkPrescaler(XQspiPs *InstancePtr); + +int XQspiPs_SetDelays(XQspiPs *InstancePtr, u8 DelayNss, u8 DelayBtwn, + u8 DelayAfter, u8 DelayInit); +void XQspiPs_GetDelays(XQspiPs *InstancePtr, u8 *DelayNss, u8 *DelayBtwn, + u8 *DelayAfter, u8 *DelayInit); +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xqspips_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xqspips_hw.h new file mode 100755 index 000000000..8e77c75ab --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xqspips_hw.h @@ -0,0 +1,381 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_hw.h +* +* This header file contains the identifiers and basic HW access driver +* functions (or macros) that can be used to access the device. Other driver +* functions are defined in xqspips.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 1.00 sdm 11/25/10 First release +* 2.00a ka 07/25/12 Added a few register defines for CR 670297 +* and removed some defines of reserved fields for +* CR 671468 +* Added define XQSPIPS_CR_HOLD_B_MASK for Holdb_dr +* bit in Configuration register. +* 2.01a sg 02/03/13 Added defines for DelayNss,Rx Watermark,Interrupts +* which need write to clear. Removed Read zeros mask from +* LQSPI Config register. +* 2.03a hk 08/22/13 Added prototypes of API's for QSPI reset and +* linear mode initialization for boot. Added related +* constant definitions. +* +* </pre> +* +******************************************************************************/ +#ifndef XQSPIPS_HW_H /* prevent circular inclusions */ +#define XQSPIPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * + * Register offsets from the base address of an QSPI device. + * @{ + */ +#define XQSPIPS_CR_OFFSET 0x00 /**< Configuration Register */ +#define XQSPIPS_SR_OFFSET 0x04 /**< Interrupt Status */ +#define XQSPIPS_IER_OFFSET 0x08 /**< Interrupt Enable */ +#define XQSPIPS_IDR_OFFSET 0x0c /**< Interrupt Disable */ +#define XQSPIPS_IMR_OFFSET 0x10 /**< Interrupt Enabled Mask */ +#define XQSPIPS_ER_OFFSET 0x14 /**< Enable/Disable Register */ +#define XQSPIPS_DR_OFFSET 0x18 /**< Delay Register */ +#define XQSPIPS_TXD_00_OFFSET 0x1C /**< Transmit 4-byte inst/data */ +#define XQSPIPS_RXD_OFFSET 0x20 /**< Data Receive Register */ +#define XQSPIPS_SICR_OFFSET 0x24 /**< Slave Idle Count */ +#define XQSPIPS_TXWR_OFFSET 0x28 /**< Transmit FIFO Watermark */ +#define XQSPIPS_RXWR_OFFSET 0x2C /**< Receive FIFO Watermark */ +#define XQSPIPS_GPIO_OFFSET 0x30 /**< GPIO Register */ +#define XQSPIPS_LPBK_DLY_ADJ_OFFSET 0x38 /**< Loopback Delay Adjust Reg */ +#define XQSPIPS_TXD_01_OFFSET 0x80 /**< Transmit 1-byte inst */ +#define XQSPIPS_TXD_10_OFFSET 0x84 /**< Transmit 2-byte inst */ +#define XQSPIPS_TXD_11_OFFSET 0x88 /**< Transmit 3-byte inst */ +#define XQSPIPS_LQSPI_CR_OFFSET 0xA0 /**< Linear QSPI config register */ +#define XQSPIPS_LQSPI_SR_OFFSET 0xA4 /**< Linear QSPI status register */ +#define XQSPIPS_MOD_ID_OFFSET 0xFC /**< Module ID register */ + +/* @} */ + +/** @name Configuration Register + * + * This register contains various control bits that + * affect the operation of the QSPI device. Read/Write. + * @{ + */ + +#define XQSPIPS_CR_IFMODE_MASK 0x80000000 /**< Flash mem interface mode */ +#define XQSPIPS_CR_ENDIAN_MASK 0x04000000 /**< Tx/Rx FIFO endianness */ +#define XQSPIPS_CR_MANSTRT_MASK 0x00010000 /**< Manual Transmission Start */ +#define XQSPIPS_CR_MANSTRTEN_MASK 0x00008000 /**< Manual Transmission Start + Enable */ +#define XQSPIPS_CR_SSFORCE_MASK 0x00004000 /**< Force Slave Select */ +#define XQSPIPS_CR_SSCTRL_MASK 0x00000400 /**< Slave Select Decode */ +#define XQSPIPS_CR_SSCTRL_SHIFT 10 /**< Slave Select Decode shift */ +#define XQSPIPS_CR_DATA_SZ_MASK 0x000000C0 /**< Size of word to be + transferred */ +#define XQSPIPS_CR_PRESC_MASK 0x00000038 /**< Prescaler Setting */ +#define XQSPIPS_CR_PRESC_SHIFT 3 /**< Prescaler shift */ +#define XQSPIPS_CR_PRESC_MAXIMUM 0x07 /**< Prescaler maximum value */ + +#define XQSPIPS_CR_CPHA_MASK 0x00000004 /**< Phase Configuration */ +#define XQSPIPS_CR_CPOL_MASK 0x00000002 /**< Polarity Configuration */ + +#define XQSPIPS_CR_MSTREN_MASK 0x00000001 /**< Master Mode Enable */ + +#define XQSPIPS_CR_HOLD_B_MASK 0x00080000 /**< HOLD_B Pin Drive Enable */ + +/* Deselect the Slave select line and set the transfer size to 32 at reset */ +#define XQSPIPS_CR_RESET_STATE (XQSPIPS_CR_IFMODE_MASK | \ + XQSPIPS_CR_SSCTRL_MASK | \ + XQSPIPS_CR_DATA_SZ_MASK | \ + XQSPIPS_CR_MSTREN_MASK) +/* @} */ + + +/** @name QSPI Interrupt Registers + * + * <b>QSPI Status Register</b> + * + * This register holds the interrupt status flags for an QSPI device. Some + * of the flags are level triggered, which means that they are set as long + * as the interrupt condition exists. Other flags are edge triggered, + * which means they are set once the interrupt condition occurs and remain + * set until they are cleared by software. The interrupts are cleared by + * writing a '1' to the interrupt bit position in the Status Register. + * Read/Write. + * + * <b>QSPI Interrupt Enable Register</b> + * + * This register is used to enable chosen interrupts for an QSPI device. + * Writing a '1' to a bit in this register sets the corresponding bit in the + * QSPI Interrupt Mask register. Write only. + * + * <b>QSPI Interrupt Disable Register </b> + * + * This register is used to disable chosen interrupts for an QSPI device. + * Writing a '1' to a bit in this register clears the corresponding bit in the + * QSPI Interrupt Mask register. Write only. + * + * <b>QSPI Interrupt Mask Register</b> + * + * This register shows the enabled/disabled interrupts of an QSPI device. + * Read only. + * + * All four registers have the same bit definitions. They are only defined once + * for each of the Interrupt Enable Register, Interrupt Disable Register, + * Interrupt Mask Register, and Channel Interrupt Status Register + * @{ + */ + +#define XQSPIPS_IXR_TXUF_MASK 0x00000040 /**< QSPI Tx FIFO Underflow */ +#define XQSPIPS_IXR_RXFULL_MASK 0x00000020 /**< QSPI Rx FIFO Full */ +#define XQSPIPS_IXR_RXNEMPTY_MASK 0x00000010 /**< QSPI Rx FIFO Not Empty */ +#define XQSPIPS_IXR_TXFULL_MASK 0x00000008 /**< QSPI Tx FIFO Full */ +#define XQSPIPS_IXR_TXOW_MASK 0x00000004 /**< QSPI Tx FIFO Overwater */ +#define XQSPIPS_IXR_RXOVR_MASK 0x00000001 /**< QSPI Rx FIFO Overrun */ +#define XQSPIPS_IXR_DFLT_MASK 0x00000025 /**< QSPI default interrupts + mask */ +#define XQSPIPS_IXR_WR_TO_CLR_MASK 0x00000041 /**< Interrupts which + need write to clear */ +#define XQSPIPS_ISR_RESET_STATE 0x00000004 /**< Default to tx/rx empty */ +#define XQSPIPS_IXR_DISABLE_ALL 0x0000007D /**< Disable all interrupts */ +/* @} */ + + +/** @name Enable Register + * + * This register is used to enable or disable an QSPI device. + * Read/Write + * @{ + */ +#define XQSPIPS_ER_ENABLE_MASK 0x00000001 /**< QSPI Enable Bit Mask */ +/* @} */ + + +/** @name Delay Register + * + * This register is used to program timing delays in + * slave mode. Read/Write + * @{ + */ +#define XQSPIPS_DR_NSS_MASK 0xFF000000 /**< Delay to de-assert slave select + between two words mask */ +#define XQSPIPS_DR_NSS_SHIFT 24 /**< Delay to de-assert slave select + between two words shift */ +#define XQSPIPS_DR_BTWN_MASK 0x00FF0000 /**< Delay Between Transfers + mask */ +#define XQSPIPS_DR_BTWN_SHIFT 16 /**< Delay Between Transfers shift */ +#define XQSPIPS_DR_AFTER_MASK 0x0000FF00 /**< Delay After Transfers mask */ +#define XQSPIPS_DR_AFTER_SHIFT 8 /**< Delay After Transfers shift */ +#define XQSPIPS_DR_INIT_MASK 0x000000FF /**< Delay Initially mask */ +/* @} */ + +/** @name Slave Idle Count Registers + * + * This register defines the number of pclk cycles the slave waits for a the + * QSPI clock to become stable in quiescent state before it can detect the start + * of the next transfer in CPHA = 1 mode. + * Read/Write + * + * @{ + */ +#define XQSPIPS_SICR_MASK 0x000000FF /**< Slave Idle Count Mask */ +/* @} */ + + +/** @name Transmit FIFO Watermark Register + * + * This register defines the watermark setting for the Transmit FIFO. + * + * @{ + */ +#define XQSPIPS_TXWR_MASK 0x0000003F /**< Transmit Watermark Mask */ +#define XQSPIPS_TXWR_RESET_VALUE 0x00000001 /**< Transmit Watermark + * register reset value */ + +/* @} */ + +/** @name Receive FIFO Watermark Register + * + * This register defines the watermark setting for the Receive FIFO. + * + * @{ + */ +#define XQSPIPS_RXWR_MASK 0x0000003F /**< Receive Watermark Mask */ +#define XQSPIPS_RXWR_RESET_VALUE 0x00000001 /**< Receive Watermark + * register reset value */ + +/* @} */ + +/** @name FIFO Depth + * + * This macro provides the depth of transmit FIFO and receive FIFO. + * + * @{ + */ +#define XQSPIPS_FIFO_DEPTH 63 /**< FIFO depth (words) */ +/* @} */ + + +/** @name Linear QSPI Configuration Register + * + * This register contains various control bits that + * affect the operation of the Linear QSPI controller. Read/Write. + * + * @{ + */ +#define XQSPIPS_LQSPI_CR_LINEAR_MASK 0x80000000 /**< LQSPI mode enable */ +#define XQSPIPS_LQSPI_CR_TWO_MEM_MASK 0x40000000 /**< Both memories or one */ +#define XQSPIPS_LQSPI_CR_SEP_BUS_MASK 0x20000000 /**< Seperate memory bus */ +#define XQSPIPS_LQSPI_CR_U_PAGE_MASK 0x10000000 /**< Upper memory page */ +#define XQSPIPS_LQSPI_CR_MODE_EN_MASK 0x02000000 /**< Enable mode bits */ +#define XQSPIPS_LQSPI_CR_MODE_ON_MASK 0x01000000 /**< Mode on */ +#define XQSPIPS_LQSPI_CR_MODE_BITS_MASK 0x00FF0000 /**< Mode value for dual I/O + or quad I/O */ +#define XQSPIPS_LQSPI_CR_DUMMY_MASK 0x00000700 /**< Number of dummy bytes + between addr and return + read data */ +#define XQSPIPS_LQSPI_CR_INST_MASK 0x000000FF /**< Read instr code */ +#define XQSPIPS_LQSPI_CR_RST_STATE 0x8000016B /**< Default CR value */ +/* @} */ + +/** @name Linear QSPI Status Register + * + * This register contains various status bits of the Linear QSPI controller. + * Read/Write. + * + * @{ + */ +#define XQSPIPS_LQSPI_SR_D_FSM_ERR_MASK 0x00000004 /**< AXI Data FSM Error + received */ +#define XQSPIPS_LQSPI_SR_WR_RECVD_MASK 0x00000002 /**< AXI write command + received */ +/* @} */ + + +/** @name Loopback Delay Adjust Register + * + * This register contains various bit masks of Loopback Delay Adjust Register. + * + * @{ + */ + +#define XQSPIPS_LPBK_DLY_ADJ_USE_LPBK_MASK 0x00000020 /**< Loopback Bit */ + +/* @} */ + + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +#define XQspiPs_In32 Xil_In32 +#define XQspiPs_Out32 Xil_Out32 + +/****************************************************************************/ +/** +* Read a register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the 1st register of the +* device to the target register. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u32 XQspiPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +#define XQspiPs_ReadReg(BaseAddress, RegOffset) \ + XQspiPs_In32((BaseAddress) + (RegOffset)) + +/***************************************************************************/ +/** +* Write to a register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the 1st register of the +* device to target register. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XQspiPs_WriteReg(u32 BaseAddress, int RegOffset, +* u32 RegisterValue) +* +******************************************************************************/ +#define XQspiPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + XQspiPs_Out32((BaseAddress) + (RegOffset), (RegisterValue)) + +/************************** Function Prototypes ******************************/ + +/* + * Functions implemented in xqspips_hw.c + */ +void XQspiPs_ResetHw(u32 BaseAddress); +void XQspiPs_LinearInit(u32 BaseAddress); + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h new file mode 100755 index 000000000..65e648f54 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xreg_cortexa9.h @@ -0,0 +1,599 @@ +/******************************************************************************* +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xreg_cortexa9.h +* +* This header file contains definitions for using inline assembler code. It is +* written specifically for the GNU, IAR, ARMCC compiler. +* +* All of the ARM Cortex A9 GPRs, SPRs, and Debug Registers are defined along +* with the positions of the bits within the registers. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 10/20/09 First release +* </pre> +* +******************************************************************************/ +#ifndef XREG_CORTEXA9_H +#define XREG_CORTEXA9_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* GPRs */ +#define XREG_GPR0 r0 +#define XREG_GPR1 r1 +#define XREG_GPR2 r2 +#define XREG_GPR3 r3 +#define XREG_GPR4 r4 +#define XREG_GPR5 r5 +#define XREG_GPR6 r6 +#define XREG_GPR7 r7 +#define XREG_GPR8 r8 +#define XREG_GPR9 r9 +#define XREG_GPR10 r10 +#define XREG_GPR11 r11 +#define XREG_GPR12 r12 +#define XREG_GPR13 r13 +#define XREG_GPR14 r14 +#define XREG_GPR15 r15 +#define XREG_CPSR cpsr + +/* Coprocessor number defines */ +#define XREG_CP0 0 +#define XREG_CP1 1 +#define XREG_CP2 2 +#define XREG_CP3 3 +#define XREG_CP4 4 +#define XREG_CP5 5 +#define XREG_CP6 6 +#define XREG_CP7 7 +#define XREG_CP8 8 +#define XREG_CP9 9 +#define XREG_CP10 10 +#define XREG_CP11 11 +#define XREG_CP12 12 +#define XREG_CP13 13 +#define XREG_CP14 14 +#define XREG_CP15 15 + +/* Coprocessor control register defines */ +#define XREG_CR0 cr0 +#define XREG_CR1 cr1 +#define XREG_CR2 cr2 +#define XREG_CR3 cr3 +#define XREG_CR4 cr4 +#define XREG_CR5 cr5 +#define XREG_CR6 cr6 +#define XREG_CR7 cr7 +#define XREG_CR8 cr8 +#define XREG_CR9 cr9 +#define XREG_CR10 cr10 +#define XREG_CR11 cr11 +#define XREG_CR12 cr12 +#define XREG_CR13 cr13 +#define XREG_CR14 cr14 +#define XREG_CR15 cr15 + +/* Current Processor Status Register (CPSR) Bits */ +#define XREG_CPSR_THUMB_MODE 0x20 +#define XREG_CPSR_MODE_BITS 0x1F +#define XREG_CPSR_SYSTEM_MODE 0x1F +#define XREG_CPSR_UNDEFINED_MODE 0x1B +#define XREG_CPSR_DATA_ABORT_MODE 0x17 +#define XREG_CPSR_SVC_MODE 0x13 +#define XREG_CPSR_IRQ_MODE 0x12 +#define XREG_CPSR_FIQ_MODE 0x11 +#define XREG_CPSR_USER_MODE 0x10 + +#define XREG_CPSR_IRQ_ENABLE 0x80 +#define XREG_CPSR_FIQ_ENABLE 0x40 + +#define XREG_CPSR_N_BIT 0x80000000 +#define XREG_CPSR_Z_BIT 0x40000000 +#define XREG_CPSR_C_BIT 0x20000000 +#define XREG_CPSR_V_BIT 0x10000000 + + +/* CP15 defines */ +#if defined (__GNUC__) || defined (__ICCARM__) +/* C0 Register defines */ +#define XREG_CP15_MAIN_ID "p15, 0, %0, c0, c0, 0" +#define XREG_CP15_CACHE_TYPE "p15, 0, %0, c0, c0, 1" +#define XREG_CP15_TCM_TYPE "p15, 0, %0, c0, c0, 2" +#define XREG_CP15_TLB_TYPE "p15, 0, %0, c0, c0, 3" +#define XREG_CP15_MULTI_PROC_AFFINITY "p15, 0, %0, c0, c0, 5" + +#define XREG_CP15_PROC_FEATURE_0 "p15, 0, %0, c0, c1, 0" +#define XREG_CP15_PROC_FEATURE_1 "p15, 0, %0, c0, c1, 1" +#define XREG_CP15_DEBUG_FEATURE_0 "p15, 0, %0, c0, c1, 2" +#define XREG_CP15_MEMORY_FEATURE_0 "p15, 0, %0, c0, c1, 4" +#define XREG_CP15_MEMORY_FEATURE_1 "p15, 0, %0, c0, c1, 5" +#define XREG_CP15_MEMORY_FEATURE_2 "p15, 0, %0, c0, c1, 6" +#define XREG_CP15_MEMORY_FEATURE_3 "p15, 0, %0, c0, c1, 7" + +#define XREG_CP15_INST_FEATURE_0 "p15, 0, %0, c0, c2, 0" +#define XREG_CP15_INST_FEATURE_1 "p15, 0, %0, c0, c2, 1" +#define XREG_CP15_INST_FEATURE_2 "p15, 0, %0, c0, c2, 2" +#define XREG_CP15_INST_FEATURE_3 "p15, 0, %0, c0, c2, 3" +#define XREG_CP15_INST_FEATURE_4 "p15, 0, %0, c0, c2, 4" + +#define XREG_CP15_CACHE_SIZE_ID "p15, 1, %0, c0, c0, 0" +#define XREG_CP15_CACHE_LEVEL_ID "p15, 1, %0, c0, c0, 1" +#define XREG_CP15_AUXILARY_ID "p15, 1, %0, c0, c0, 7" + +#define XREG_CP15_CACHE_SIZE_SEL "p15, 2, %0, c0, c0, 0" + +/* C1 Register Defines */ +#define XREG_CP15_SYS_CONTROL "p15, 0, %0, c1, c0, 0" +#define XREG_CP15_AUX_CONTROL "p15, 0, %0, c1, c0, 1" +#define XREG_CP15_CP_ACCESS_CONTROL "p15, 0, %0, c1, c0, 2" + +#define XREG_CP15_SECURE_CONFIG "p15, 0, %0, c1, c1, 0" +#define XREG_CP15_SECURE_DEBUG_ENABLE "p15, 0, %0, c1, c1, 1" +#define XREG_CP15_NS_ACCESS_CONTROL "p15, 0, %0, c1, c1, 2" +#define XREG_CP15_VIRTUAL_CONTROL "p15, 0, %0, c1, c1, 3" + +#else /* RVCT */ +/* C0 Register defines */ +#define XREG_CP15_MAIN_ID "cp15:0:c0:c0:0" +#define XREG_CP15_CACHE_TYPE "cp15:0:c0:c0:1" +#define XREG_CP15_TCM_TYPE "cp15:0:c0:c0:2" +#define XREG_CP15_TLB_TYPE "cp15:0:c0:c0:3" +#define XREG_CP15_MULTI_PROC_AFFINITY "cp15:0:c0:c0:5" + +#define XREG_CP15_PROC_FEATURE_0 "cp15:0:c0:c1:0" +#define XREG_CP15_PROC_FEATURE_1 "cp15:0:c0:c1:1" +#define XREG_CP15_DEBUG_FEATURE_0 "cp15:0:c0:c1:2" +#define XREG_CP15_MEMORY_FEATURE_0 "cp15:0:c0:c1:4" +#define XREG_CP15_MEMORY_FEATURE_1 "cp15:0:c0:c1:5" +#define XREG_CP15_MEMORY_FEATURE_2 "cp15:0:c0:c1:6" +#define XREG_CP15_MEMORY_FEATURE_3 "cp15:0:c0:c1:7" + +#define XREG_CP15_INST_FEATURE_0 "cp15:0:c0:c2:0" +#define XREG_CP15_INST_FEATURE_1 "cp15:0:c0:c2:1" +#define XREG_CP15_INST_FEATURE_2 "cp15:0:c0:c2:2" +#define XREG_CP15_INST_FEATURE_3 "cp15:0:c0:c2:3" +#define XREG_CP15_INST_FEATURE_4 "cp15:0:c0:c2:4" + +#define XREG_CP15_CACHE_SIZE_ID "cp15:1:c0:c0:0" +#define XREG_CP15_CACHE_LEVEL_ID "cp15:1:c0:c0:1" +#define XREG_CP15_AUXILARY_ID "cp15:1:c0:c0:7" + +#define XREG_CP15_CACHE_SIZE_SEL "cp15:2:c0:c0:0" + +/* C1 Register Defines */ +#define XREG_CP15_SYS_CONTROL "cp15:0:c1:c0:0" +#define XREG_CP15_AUX_CONTROL "cp15:0:c1:c0:1" +#define XREG_CP15_CP_ACCESS_CONTROL "cp15:0:c1:c0:2" + +#define XREG_CP15_SECURE_CONFIG "cp15:0:c1:c1:0" +#define XREG_CP15_SECURE_DEBUG_ENABLE "cp15:0:c1:c1:1" +#define XREG_CP15_NS_ACCESS_CONTROL "cp15:0:c1:c1:2" +#define XREG_CP15_VIRTUAL_CONTROL "cp15:0:c1:c1:3" +#endif + +/* XREG_CP15_CONTROL bit defines */ +#define XREG_CP15_CONTROL_TE_BIT 0x40000000 +#define XREG_CP15_CONTROL_AFE_BIT 0x20000000 +#define XREG_CP15_CONTROL_TRE_BIT 0x10000000 +#define XREG_CP15_CONTROL_NMFI_BIT 0x08000000 +#define XREG_CP15_CONTROL_EE_BIT 0x02000000 +#define XREG_CP15_CONTROL_HA_BIT 0x00020000 +#define XREG_CP15_CONTROL_RR_BIT 0x00004000 +#define XREG_CP15_CONTROL_V_BIT 0x00002000 +#define XREG_CP15_CONTROL_I_BIT 0x00001000 +#define XREG_CP15_CONTROL_Z_BIT 0x00000800 +#define XREG_CP15_CONTROL_SW_BIT 0x00000400 +#define XREG_CP15_CONTROL_B_BIT 0x00000080 +#define XREG_CP15_CONTROL_C_BIT 0x00000004 +#define XREG_CP15_CONTROL_A_BIT 0x00000002 +#define XREG_CP15_CONTROL_M_BIT 0x00000001 + +#if defined (__GNUC__) || defined (__ICCARM__) +/* C2 Register Defines */ +#define XREG_CP15_TTBR0 "p15, 0, %0, c2, c0, 0" +#define XREG_CP15_TTBR1 "p15, 0, %0, c2, c0, 1" +#define XREG_CP15_TTB_CONTROL "p15, 0, %0, c2, c0, 2" + +/* C3 Register Defines */ +#define XREG_CP15_DOMAIN_ACCESS_CTRL "p15, 0, %0, c3, c0, 0" + +/* C4 Register Defines */ +/* Not Used */ + +/* C5 Register Defines */ +#define XREG_CP15_DATA_FAULT_STATUS "p15, 0, %0, c5, c0, 0" +#define XREG_CP15_INST_FAULT_STATUS "p15, 0, %0, c5, c0, 1" + +#define XREG_CP15_AUX_DATA_FAULT_STATUS "p15, 0, %0, c5, c1, 0" +#define XREG_CP15_AUX_INST_FAULT_STATUS "p15, 0, %0, c5, c1, 1" + +/* C6 Register Defines */ +#define XREG_CP15_DATA_FAULT_ADDRESS "p15, 0, %0, c6, c0, 0" +#define XREG_CP15_INST_FAULT_ADDRESS "p15, 0, %0, c6, c0, 2" + +/* C7 Register Defines */ +#define XREG_CP15_NOP "p15, 0, %0, c7, c0, 4" + +#define XREG_CP15_INVAL_IC_POU_IS "p15, 0, %0, c7, c1, 0" +#define XREG_CP15_INVAL_BRANCH_ARRAY_IS "p15, 0, %0, c7, c1, 6" + +#define XREG_CP15_PHYS_ADDR "p15, 0, %0, c7, c4, 0" + +#define XREG_CP15_INVAL_IC_POU "p15, 0, %0, c7, c5, 0" +#define XREG_CP15_INVAL_IC_LINE_MVA_POU "p15, 0, %0, c7, c5, 1" + +/* The CP15 register access below has been deprecated in favor of the new + * isb instruction in Cortex A9. + */ +#define XREG_CP15_INST_SYNC_BARRIER "p15, 0, %0, c7, c5, 4" +#define XREG_CP15_INVAL_BRANCH_ARRAY "p15, 0, %0, c7, c5, 6" + +#define XREG_CP15_INVAL_DC_LINE_MVA_POC "p15, 0, %0, c7, c6, 1" +#define XREG_CP15_INVAL_DC_LINE_SW "p15, 0, %0, c7, c6, 2" + +#define XREG_CP15_VA_TO_PA_CURRENT_0 "p15, 0, %0, c7, c8, 0" +#define XREG_CP15_VA_TO_PA_CURRENT_1 "p15, 0, %0, c7, c8, 1" +#define XREG_CP15_VA_TO_PA_CURRENT_2 "p15, 0, %0, c7, c8, 2" +#define XREG_CP15_VA_TO_PA_CURRENT_3 "p15, 0, %0, c7, c8, 3" + +#define XREG_CP15_VA_TO_PA_OTHER_0 "p15, 0, %0, c7, c8, 4" +#define XREG_CP15_VA_TO_PA_OTHER_1 "p15, 0, %0, c7, c8, 5" +#define XREG_CP15_VA_TO_PA_OTHER_2 "p15, 0, %0, c7, c8, 6" +#define XREG_CP15_VA_TO_PA_OTHER_3 "p15, 0, %0, c7, c8, 7" + +#define XREG_CP15_CLEAN_DC_LINE_MVA_POC "p15, 0, %0, c7, c10, 1" +#define XREG_CP15_CLEAN_DC_LINE_SW "p15, 0, %0, c7, c10, 2" + +/* The next two CP15 register accesses below have been deprecated in favor + * of the new dsb and dmb instructions in Cortex A9. + */ +#define XREG_CP15_DATA_SYNC_BARRIER "p15, 0, %0, c7, c10, 4" +#define XREG_CP15_DATA_MEMORY_BARRIER "p15, 0, %0, c7, c10, 5" + +#define XREG_CP15_CLEAN_DC_LINE_MVA_POU "p15, 0, %0, c7, c11, 1" + +#define XREG_CP15_NOP2 "p15, 0, %0, c7, c13, 1" + +#define XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC "p15, 0, %0, c7, c14, 1" +#define XREG_CP15_CLEAN_INVAL_DC_LINE_SW "p15, 0, %0, c7, c14, 2" + +/* C8 Register Defines */ +#define XREG_CP15_INVAL_TLB_IS "p15, 0, %0, c8, c3, 0" +#define XREG_CP15_INVAL_TLB_MVA_IS "p15, 0, %0, c8, c3, 1" +#define XREG_CP15_INVAL_TLB_ASID_IS "p15, 0, %0, c8, c3, 2" +#define XREG_CP15_INVAL_TLB_MVA_ASID_IS "p15, 0, %0, c8, c3, 3" + +#define XREG_CP15_INVAL_ITLB_UNLOCKED "p15, 0, %0, c8, c5, 0" +#define XREG_CP15_INVAL_ITLB_MVA "p15, 0, %0, c8, c5, 1" +#define XREG_CP15_INVAL_ITLB_ASID "p15, 0, %0, c8, c5, 2" + +#define XREG_CP15_INVAL_DTLB_UNLOCKED "p15, 0, %0, c8, c6, 0" +#define XREG_CP15_INVAL_DTLB_MVA "p15, 0, %0, c8, c6, 1" +#define XREG_CP15_INVAL_DTLB_ASID "p15, 0, %0, c8, c6, 2" + +#define XREG_CP15_INVAL_UTLB_UNLOCKED "p15, 0, %0, c8, c7, 0" +#define XREG_CP15_INVAL_UTLB_MVA "p15, 0, %0, c8, c7, 1" +#define XREG_CP15_INVAL_UTLB_ASID "p15, 0, %0, c8, c7, 2" +#define XREG_CP15_INVAL_UTLB_MVA_ASID "p15, 0, %0, c8, c7, 3" + +/* C9 Register Defines */ +#define XREG_CP15_PERF_MONITOR_CTRL "p15, 0, %0, c9, c12, 0" +#define XREG_CP15_COUNT_ENABLE_SET "p15, 0, %0, c9, c12, 1" +#define XREG_CP15_COUNT_ENABLE_CLR "p15, 0, %0, c9, c12, 2" +#define XREG_CP15_V_FLAG_STATUS "p15, 0, %0, c9, c12, 3" +#define XREG_CP15_SW_INC "p15, 0, %0, c9, c12, 4" +#define XREG_CP15_EVENT_CNTR_SEL "p15, 0, %0, c9, c12, 5" + +#define XREG_CP15_PERF_CYCLE_COUNTER "p15, 0, %0, c9, c13, 0" +#define XREG_CP15_EVENT_TYPE_SEL "p15, 0, %0, c9, c13, 1" +#define XREG_CP15_PERF_MONITOR_COUNT "p15, 0, %0, c9, c13, 2" + +#define XREG_CP15_USER_ENABLE "p15, 0, %0, c9, c14, 0" +#define XREG_CP15_INTR_ENABLE_SET "p15, 0, %0, c9, c14, 1" +#define XREG_CP15_INTR_ENABLE_CLR "p15, 0, %0, c9, c14, 2" + +/* C10 Register Defines */ +#define XREG_CP15_TLB_LOCKDWN "p15, 0, %0, c10, c0, 0" + +#define XREG_CP15_PRI_MEM_REMAP "p15, 0, %0, c10, c2, 0" +#define XREG_CP15_NORM_MEM_REMAP "p15, 0, %0, c10, c2, 1" + +/* C11 Register Defines */ +/* Not used */ + +/* C12 Register Defines */ +#define XREG_CP15_VEC_BASE_ADDR "p15, 0, %0, c12, c0, 0" +#define XREG_CP15_MONITOR_VEC_BASE_ADDR "p15, 0, %0, c12, c0, 1" + +#define XREG_CP15_INTERRUPT_STATUS "p15, 0, %0, c12, c1, 0" +#define XREG_CP15_VIRTUALIZATION_INTR "p15, 0, %0, c12, c1, 1" + +/* C13 Register Defines */ +#define XREG_CP15_CONTEXT_ID "p15, 0, %0, c13, c0, 1" +#define USER_RW_THREAD_PID "p15, 0, %0, c13, c0, 2" +#define USER_RO_THREAD_PID "p15, 0, %0, c13, c0, 3" +#define USER_PRIV_THREAD_PID "p15, 0, %0, c13, c0, 4" + +/* C14 Register Defines */ +/* not used */ + +/* C15 Register Defines */ +#define XREG_CP15_POWER_CTRL "p15, 0, %0, c15, c0, 0" +#define XREG_CP15_CONFIG_BASE_ADDR "p15, 4, %0, c15, c0, 0" + +#define XREG_CP15_READ_TLB_ENTRY "p15, 5, %0, c15, c4, 2" +#define XREG_CP15_WRITE_TLB_ENTRY "p15, 5, %0, c15, c4, 4" + +#define XREG_CP15_MAIN_TLB_VA "p15, 5, %0, c15, c5, 2" + +#define XREG_CP15_MAIN_TLB_PA "p15, 5, %0, c15, c6, 2" + +#define XREG_CP15_MAIN_TLB_ATTR "p15, 5, %0, c15, c7, 2" + +#else +/* C2 Register Defines */ +#define XREG_CP15_TTBR0 "cp15:0:c2:c0:0" +#define XREG_CP15_TTBR1 "cp15:0:c2:c0:1" +#define XREG_CP15_TTB_CONTROL "cp15:0:c2:c0:2" + +/* C3 Register Defines */ +#define XREG_CP15_DOMAIN_ACCESS_CTRL "cp15:0:c3:c0:0" + +/* C4 Register Defines */ +/* Not Used */ + +/* C5 Register Defines */ +#define XREG_CP15_DATA_FAULT_STATUS "cp15:0:c5:c0:0" +#define XREG_CP15_INST_FAULT_STATUS "cp15:0:c5:c0:1" + +#define XREG_CP15_AUX_DATA_FAULT_STATUS "cp15:0:c5:c1:0" +#define XREG_CP15_AUX_INST_FAULT_STATUS "cp15:0:c5:c1:1" + +/* C6 Register Defines */ +#define XREG_CP15_DATA_FAULT_ADDRESS "cp15:0:c6:c0:0" +#define XREG_CP15_INST_FAULT_ADDRESS "cp15:0:c6:c0:2" + +/* C7 Register Defines */ +#define XREG_CP15_NOP "cp15:0:c7:c0:4" + +#define XREG_CP15_INVAL_IC_POU_IS "cp15:0:c7:c1:0" +#define XREG_CP15_INVAL_BRANCH_ARRAY_IS "cp15:0:c7:c1:6" + +#define XREG_CP15_PHYS_ADDR "cp15:0:c7:c4:0" + +#define XREG_CP15_INVAL_IC_POU "cp15:0:c7:c5:0" +#define XREG_CP15_INVAL_IC_LINE_MVA_POU "cp15:0:c7:c5:1" + +/* The CP15 register access below has been deprecated in favor of the new + * isb instruction in Cortex A9. + */ +#define XREG_CP15_INST_SYNC_BARRIER "cp15:0:c7:c5:4" +#define XREG_CP15_INVAL_BRANCH_ARRAY "cp15:0:c7:c5:6" + +#define XREG_CP15_INVAL_DC_LINE_MVA_POC "cp15:0:c7:c6:1" +#define XREG_CP15_INVAL_DC_LINE_SW "cp15:0:c7:c6:2" + +#define XREG_CP15_VA_TO_PA_CURRENT_0 "cp15:0:c7:c8:0" +#define XREG_CP15_VA_TO_PA_CURRENT_1 "cp15:0:c7:c8:1" +#define XREG_CP15_VA_TO_PA_CURRENT_2 "cp15:0:c7:c8:2" +#define XREG_CP15_VA_TO_PA_CURRENT_3 "cp15:0:c7:c8:3" + +#define XREG_CP15_VA_TO_PA_OTHER_0 "cp15:0:c7:c8:4" +#define XREG_CP15_VA_TO_PA_OTHER_1 "cp15:0:c7:c8:5" +#define XREG_CP15_VA_TO_PA_OTHER_2 "cp15:0:c7:c8:6" +#define XREG_CP15_VA_TO_PA_OTHER_3 "cp15:0:c7:c8:7" + +#define XREG_CP15_CLEAN_DC_LINE_MVA_POC "cp15:0:c7:c10:1" +#define XREG_CP15_CLEAN_DC_LINE_SW "cp15:0:c7:c10:2" + +/* The next two CP15 register accesses below have been deprecated in favor + * of the new dsb and dmb instructions in Cortex A9. + */ +#define XREG_CP15_DATA_SYNC_BARRIER "cp15:0:c7:c10:4" +#define XREG_CP15_DATA_MEMORY_BARRIER "cp15:0:c7:c10:5" + +#define XREG_CP15_CLEAN_DC_LINE_MVA_POU "cp15:0:c7:c11:1" + +#define XREG_CP15_NOP2 "cp15:0:c7:c13:1" + +#define XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC "cp15:0:c7:c14:1" +#define XREG_CP15_CLEAN_INVAL_DC_LINE_SW "cp15:0:c7:c14:2" + +/* C8 Register Defines */ +#define XREG_CP15_INVAL_TLB_IS "cp15:0:c8:c3:0" +#define XREG_CP15_INVAL_TLB_MVA_IS "cp15:0:c8:c3:1" +#define XREG_CP15_INVAL_TLB_ASID_IS "cp15:0:c8:c3:2" +#define XREG_CP15_INVAL_TLB_MVA_ASID_IS "cp15:0:c8:c3:3" + +#define XREG_CP15_INVAL_ITLB_UNLOCKED "cp15:0:c8:c5:0" +#define XREG_CP15_INVAL_ITLB_MVA "cp15:0:c8:c5:1" +#define XREG_CP15_INVAL_ITLB_ASID "cp15:0:c8:c5:2" + +#define XREG_CP15_INVAL_DTLB_UNLOCKED "cp15:0:c8:c6:0" +#define XREG_CP15_INVAL_DTLB_MVA "cp15:0:c8:c6:1" +#define XREG_CP15_INVAL_DTLB_ASID "cp15:0:c8:c6:2" + +#define XREG_CP15_INVAL_UTLB_UNLOCKED "cp15:0:c8:c7:0" +#define XREG_CP15_INVAL_UTLB_MVA "cp15:0:c8:c7:1" +#define XREG_CP15_INVAL_UTLB_ASID "cp15:0:c8:c7:2" +#define XREG_CP15_INVAL_UTLB_MVA_ASID "cp15:0:c8:c7:3" + +/* C9 Register Defines */ +#define XREG_CP15_PERF_MONITOR_CTRL "cp15:0:c9:c12:0" +#define XREG_CP15_COUNT_ENABLE_SET "cp15:0:c9:c12:1" +#define XREG_CP15_COUNT_ENABLE_CLR "cp15:0:c9:c12:2" +#define XREG_CP15_V_FLAG_STATUS "cp15:0:c9:c12:3" +#define XREG_CP15_SW_INC "cp15:0:c9:c12:4" +#define XREG_CP15_EVENT_CNTR_SEL "cp15:0:c9:c12:5" + +#define XREG_CP15_PERF_CYCLE_COUNTER "cp15:0:c9:c13:0" +#define XREG_CP15_EVENT_TYPE_SEL "cp15:0:c9:c13:1" +#define XREG_CP15_PERF_MONITOR_COUNT "cp15:0:c9:c13:2" + +#define XREG_CP15_USER_ENABLE "cp15:0:c9:c14:0" +#define XREG_CP15_INTR_ENABLE_SET "cp15:0:c9:c14:1" +#define XREG_CP15_INTR_ENABLE_CLR "cp15:0:c9:c14:2" + +/* C10 Register Defines */ +#define XREG_CP15_TLB_LOCKDWN "cp15:0:c10:c0:0" + +#define XREG_CP15_PRI_MEM_REMAP "cp15:0:c10:c2:0" +#define XREG_CP15_NORM_MEM_REMAP "cp15:0:c10:c2:1" + +/* C11 Register Defines */ +/* Not used */ + +/* C12 Register Defines */ +#define XREG_CP15_VEC_BASE_ADDR "cp15:0:c12:c0:0" +#define XREG_CP15_MONITOR_VEC_BASE_ADDR "cp15:0:c12:c0:1" + +#define XREG_CP15_INTERRUPT_STATUS "cp15:0:c12:c1:0" +#define XREG_CP15_VIRTUALIZATION_INTR "cp15:0:c12:c1:1" + +/* C13 Register Defines */ +#define XREG_CP15_CONTEXT_ID "cp15:0:c13:c0:1" +#define USER_RW_THREAD_PID "cp15:0:c13:c0:2" +#define USER_RO_THREAD_PID "cp15:0:c13:c0:3" +#define USER_PRIV_THREAD_PID "cp15:0:c13:c0:4" + +/* C14 Register Defines */ +/* not used */ + +/* C15 Register Defines */ +#define XREG_CP15_POWER_CTRL "cp15:0:c15:c0:0" +#define XREG_CP15_CONFIG_BASE_ADDR "cp15:4:c15:c0:0" + +#define XREG_CP15_READ_TLB_ENTRY "cp15:5:c15:c4:2" +#define XREG_CP15_WRITE_TLB_ENTRY "cp15:5:c15:c4:4" + +#define XREG_CP15_MAIN_TLB_VA "cp15:5:c15:c5:2" + +#define XREG_CP15_MAIN_TLB_PA "cp15:5:c15:c6:2" + +#define XREG_CP15_MAIN_TLB_ATTR "cp15:5:c15:c7:2" +#endif + + +/* MPE register definitions */ +#define XREG_FPSID c0 +#define XREG_FPSCR c1 +#define XREG_MVFR1 c6 +#define XREG_MVFR0 c7 +#define XREG_FPEXC c8 +#define XREG_FPINST c9 +#define XREG_FPINST2 c10 + +/* FPSID bits */ +#define XREG_FPSID_IMPLEMENTER_BIT (24) +#define XREG_FPSID_IMPLEMENTER_MASK (0xFF << FPSID_IMPLEMENTER_BIT) +#define XREG_FPSID_SOFTWARE (1<<23) +#define XREG_FPSID_ARCH_BIT (16) +#define XREG_FPSID_ARCH_MASK (0xF << FPSID_ARCH_BIT) +#define XREG_FPSID_PART_BIT (8) +#define XREG_FPSID_PART_MASK (0xFF << FPSID_PART_BIT) +#define XREG_FPSID_VARIANT_BIT (4) +#define XREG_FPSID_VARIANT_MASK (0xF << FPSID_VARIANT_BIT) +#define XREG_FPSID_REV_BIT (0) +#define XREG_FPSID_REV_MASK (0xF << FPSID_REV_BIT) + +/* FPSCR bits */ +#define XREG_FPSCR_N_BIT (1 << 31) +#define XREG_FPSCR_Z_BIT (1 << 30) +#define XREG_FPSCR_C_BIT (1 << 29) +#define XREG_FPSCR_V_BIT (1 << 28) +#define XREG_FPSCR_QC (1 << 27) +#define XREG_FPSCR_AHP (1 << 26) +#define XREG_FPSCR_DEFAULT_NAN (1 << 25) +#define XREG_FPSCR_FLUSHTOZERO (1 << 24) +#define XREG_FPSCR_ROUND_NEAREST (0 << 22) +#define XREG_FPSCR_ROUND_PLUSINF (1 << 22) +#define XREG_FPSCR_ROUND_MINUSINF (2 << 22) +#define XREG_FPSCR_ROUND_TOZERO (3 << 22) +#define XREG_FPSCR_RMODE_BIT (22) +#define XREG_FPSCR_RMODE_MASK (3 << FPSCR_RMODE_BIT) +#define XREG_FPSCR_STRIDE_BIT (20) +#define XREG_FPSCR_STRIDE_MASK (3 << FPSCR_STRIDE_BIT) +#define XREG_FPSCR_LENGTH_BIT (16) +#define XREG_FPSCR_LENGTH_MASK (7 << FPSCR_LENGTH_BIT) +#define XREG_FPSCR_IDC (1 << 7) +#define XREG_FPSCR_IXC (1 << 4) +#define XREG_FPSCR_UFC (1 << 3) +#define XREG_FPSCR_OFC (1 << 2) +#define XREG_FPSCR_DZC (1 << 1) +#define XREG_FPSCR_IOC (1 << 0) + +/* MVFR0 bits */ +#define XREG_MVFR0_RMODE_BIT (28) +#define XREG_MVFR0_RMODE_MASK (0xF << XREG_MVFR0_RMODE_BIT) +#define XREG_MVFR0_SHORT_VEC_BIT (24) +#define XREG_MVFR0_SHORT_VEC_MASK (0xF << XREG_MVFR0_SHORT_VEC_BIT) +#define XREG_MVFR0_SQRT_BIT (20) +#define XREG_MVFR0_SQRT_MASK (0xF << XREG_MVFR0_SQRT_BIT) +#define XREG_MVFR0_DIVIDE_BIT (16) +#define XREG_MVFR0_DIVIDE_MASK (0xF << XREG_MVFR0_DIVIDE_BIT) +#define XREG_MVFR0_EXEC_TRAP_BIT (12) +#define XREG_MVFR0_EXEC_TRAP_MASK (0xF << XREG_MVFR0_EXEC_TRAP_BIT) +#define XREG_MVFR0_DP_BIT (8) +#define XREG_MVFR0_DP_MASK (0xF << XREG_MVFR0_DP_BIT) +#define XREG_MVFR0_SP_BIT (4) +#define XREG_MVFR0_SP_MASK (0xF << XREG_MVFR0_SP_BIT) +#define XREG_MVFR0_A_SIMD_BIT (0) +#define XREG_MVFR0_A_SIMD_MASK (0xF << MVFR0_A_SIMD_BIT) + +/* FPEXC bits */ +#define XREG_FPEXC_EX (1 << 31) +#define XREG_FPEXC_EN (1 << 30) +#define XREG_FPEXC_DEX (1 << 29) + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XREG_CORTEXA9_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscugic.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscugic.h new file mode 100755 index 000000000..d119872e9 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscugic.h @@ -0,0 +1,318 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic.h +* +* The generic interrupt controller driver component. +* +* The interrupt controller driver uses the idea of priority for the various +* handlers. Priority is an integer within the range of 1 and 31 inclusive with +* default of 1 being the highest priority interrupt source. The priorities +* of the various sources can be dynamically altered as needed through +* hardware configuration. +* +* The generic interrupt controller supports the following +* features: +* +* - specific individual interrupt enabling/disabling +* - specific individual interrupt acknowledging +* - attaching specific callback function to handle interrupt source +* - assigning desired priority to interrupt source if default is not +* acceptable. +* +* Details about connecting the interrupt handler of the driver are contained +* in the source file specific to interrupt processing, xscugic_intr.c. +* +* This driver is intended to be RTOS and processor independent. It works with +* physical addresses only. Any needs for dynamic memory management, threads +* or thread mutual exclusion, virtual memory, or cache control must be +* satisfied by the layer above this driver. +* +* <b>Interrupt Vector Tables</b> +* +* The device ID of the interrupt controller device is used by the driver as a +* direct index into the configuration data table. The user should populate the +* vector table with handlers and callbacks at run-time using the +* XScuGic_Connect() and XScuGic_Disconnect() functions. +* +* Each vector table entry corresponds to a device that can generate an +* interrupt. Each entry contains an interrupt handler function and an +* argument to be passed to the handler when an interrupt occurs. The +* user must use XScuGic_Connect() when the interrupt handler takes an +* argument other than the base address. +* +* <b>Nested Interrupts Processing</b> +* +* Nested interrupts are not supported by this driver. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------------- +* 1.00a drg 01/19/00 First release +* 1.01a sdm 11/09/11 The XScuGic and XScuGic_Config structures have changed. +* The HandlerTable (of type XScuGic_VectorTableEntry) is +* moved to XScuGic_Config structure from XScuGic structure. +* +* The "Config" entry in XScuGic structure is made as +* pointer for better efficiency. +* +* A new file named as xscugic_hw.c is now added. It is +* to implement low level driver routines without using +* any xscugic instance pointer. They are useful when the +* user wants to use xscugic through device id or +* base address. The driver routines provided are explained +* below. +* XScuGic_DeviceInitialize that takes device id as +* argument and initializes the device (without calling +* XScuGic_CfgInitialize). +* XScuGic_DeviceInterruptHandler that takes device id +* as argument and calls appropriate handlers from the +* HandlerTable. +* XScuGic_RegisterHandler that registers a new handler +* by taking xscugic hardware base address as argument. +* LookupConfigByBaseAddress is used to return the +* corresponding config structure from XScuGic_ConfigTable +* based on the scugic base address passed. +* 1.02a sdm 12/20/11 Removed AckBeforeService from the XScuGic_Config +* structure. +* 1.03a srt 02/27/13 Moved Offset calculation macros from *.c and *_hw.c to +* *_hw.h +* Added APIs +* - XScuGic_SetPriTrigTypeByDistAddr() +* - XScuGic_GetPriTrigTypeByDistAddr() +* (CR 702687) +* Added support to direct interrupts to the appropriate CPU. Earlier +* interrupts were directed to CPU1 (hard coded). Now depending +* upon the CPU selected by the user (xparameters.h), interrupts +* will be directed to the relevant CPU. This fixes CR 699688. +* 1.04a hk 05/04/13 Assigned EffectiveAddr to CpuBaseAddress in +* XScuGic_CfgInitialize. Fix for CR#704400 to remove warnings. +* Moved functions XScuGic_SetPriTrigTypeByDistAddr and +* XScuGic_GetPriTrigTypeByDistAddr to xscugic_hw.c. +* This is fix for CR#705621. +* 1.05a hk 06/26/13 Modified tcl to export external interrupts correctly to +* xparameters.h. Fix for CR's 690505, 708928 & 719359. +* +* </pre> +* +******************************************************************************/ + +#ifndef XSCUGIC_H /* prevent circular inclusions */ +#define XSCUGIC_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xil_io.h" +#include "xscugic_hw.h" +#include "xil_exception.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/* The following data type defines each entry in an interrupt vector table. + * The callback reference is the base address of the interrupting device + * for the low level driver and an instance pointer for the high level driver. + */ +typedef struct +{ + Xil_InterruptHandler Handler; + void *CallBackRef; +} XScuGic_VectorTableEntry; + +/** + * This typedef contains configuration information for the device. + */ +typedef struct +{ + u16 DeviceId; /**< Unique ID of device */ + u32 CpuBaseAddress; /**< CPU Interface Register base address */ + u32 DistBaseAddress; /**< Distributor Register base address */ + XScuGic_VectorTableEntry HandlerTable[XSCUGIC_MAX_NUM_INTR_INPUTS];/**< + Vector table of interrupt handlers */ +} XScuGic_Config; + +/** + * The XScuGic driver instance data. The user is required to allocate a + * variable of this type for every intc device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct +{ + XScuGic_Config *Config; /**< Configuration table entry */ + u32 IsReady; /**< Device is initialized and ready */ + u32 UnhandledInterrupts; /**< Intc Statistics */ +} XScuGic; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Write the given CPU Interface register +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note +* C-style signature: +* void XScuGic_CPUWriteReg(XScuGic *InstancePtr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuGic_CPUWriteReg(InstancePtr, RegOffset, Data) \ +(XScuGic_WriteReg(((InstancePtr)->Config->CpuBaseAddress), (RegOffset), \ + ((u32)Data))) + +/****************************************************************************/ +/** +* +* Read the given CPU Interface register +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note +* C-style signature: +* u32 XScuGic_CPUReadReg(XScuGic *InstancePtr, u32 RegOffset) +* +*****************************************************************************/ +#define XScuGic_CPUReadReg(InstancePtr, RegOffset) \ + (XScuGic_ReadReg(((InstancePtr)->Config->CpuBaseAddress), (RegOffset))) + +/****************************************************************************/ +/** +* +* Write the given Distributor Interface register +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note +* C-style signature: +* void XScuGic_DistWriteReg(XScuGic *InstancePtr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuGic_DistWriteReg(InstancePtr, RegOffset, Data) \ +(XScuGic_WriteReg(((InstancePtr)->Config->DistBaseAddress), (RegOffset), \ + ((u32)Data))) + +/****************************************************************************/ +/** +* +* Read the given Distributor Interface register +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note +* C-style signature: +* u32 XScuGic_DistReadReg(XScuGic *InstancePtr, u32 RegOffset) +* +*****************************************************************************/ +#define XScuGic_DistReadReg(InstancePtr, RegOffset) \ +(XScuGic_ReadReg(((InstancePtr)->Config->DistBaseAddress), (RegOffset))) + +/************************** Function Prototypes ******************************/ + +/* + * Required functions in xscugic.c + */ + +int XScuGic_Connect(XScuGic *InstancePtr, u32 Int_Id, + Xil_InterruptHandler Handler, void *CallBackRef); +void XScuGic_Disconnect(XScuGic *InstancePtr, u32 Int_Id); + +void XScuGic_Enable(XScuGic *InstancePtr, u32 Int_Id); +void XScuGic_Disable(XScuGic *InstancePtr, u32 Int_Id); + +int XScuGic_CfgInitialize(XScuGic *InstancePtr, XScuGic_Config *ConfigPtr, + u32 EffectiveAddr); + +int XScuGic_SoftwareIntr(XScuGic *InstancePtr, u32 Int_Id, u32 Cpu_Id); + +void XScuGic_GetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, + u8 *Priority, u8 *Trigger); +void XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, + u8 Priority, u8 Trigger); + +/* + * Initialization functions in xscugic_sinit.c + */ +XScuGic_Config *XScuGic_LookupConfig(u16 DeviceId); + +/* + * Interrupt functions in xscugic_intr.c + */ +void XScuGic_InterruptHandler(XScuGic *InstancePtr); + +/* + * Self-test functions in xscugic_selftest.c + */ +int XScuGic_SelfTest(XScuGic *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscugic_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscugic_hw.h new file mode 100755 index 000000000..4f8354fe9 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscugic_hw.h @@ -0,0 +1,641 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_hw.h +* +* This header file contains identifiers and HW access functions (or +* macros) that can be used to access the device. The user should refer to the +* hardware device specification for more details of the device operation. +* The driver functions/APIs are defined in xscugic.h. +* +* This GIC device has two parts, a distributor and CPU interface(s). Each part +* has separate register definition sections. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------------- +* 1.00a drg 01/19/10 First release +* 1.01a sdm 11/09/11 "xil_exception.h" added as include. +* Macros XScuGic_EnableIntr and XScuGic_DisableIntr are +* added to enable or disable interrupts based on +* Distributor Register base address. Normally users use +* XScuGic instance and call XScuGic_Enable or +* XScuGic_Disable to enable/disable interrupts. These +* new macros are provided when user does not want to +* use an instance pointer but still wants to enable or +* disable interrupts. +* Function prototypes for functions (present in newly +* added file xscugic_hw.c) are added. +* 1.03a srt 02/27/13 Moved Offset calculation macros from *_hw.c (CR +* 702687). +* 1.04a hk 05/04/13 Fix for CR#705621. Moved function prototypes +* XScuGic_SetPriTrigTypeByDistAddr and +* XScuGic_GetPriTrigTypeByDistAddr here from xscugic.h +* +* </pre> +* +******************************************************************************/ + +#ifndef XSCUGIC_HW_H /* prevent circular inclusions */ +#define XSCUGIC_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" +#include "xil_exception.h" + +/************************** Constant Definitions *****************************/ + +/* + * The maximum number of interrupts supported by the hardware. + */ +#define XSCUGIC_MAX_NUM_INTR_INPUTS 95 + +/* + * The maximum priority value that can be used in the GIC. + */ +#define XSCUGIC_MAX_INTR_PRIO_VAL 248 +#define XSCUGIC_INTR_PRIO_MASK 0xF8 + +/** @name Distributor Interface Register Map + * + * Define the offsets from the base address for all Distributor registers of + * the interrupt controller, some registers may be reserved in the hardware + * device. + * @{ + */ +#define XSCUGIC_DIST_EN_OFFSET 0x00000000 /**< Distributor Enable + Register */ +#define XSCUGIC_IC_TYPE_OFFSET 0x00000004 /**< Interrupt Controller + Type Register */ +#define XSCUGIC_DIST_IDENT_OFFSET 0x00000008 /**< Implementor ID + Register */ +#define XSCUGIC_SECURITY_OFFSET 0x00000080 /**< Interrupt Security + Register */ +#define XSCUGIC_ENABLE_SET_OFFSET 0x00000100 /**< Enable Set + Register */ +#define XSCUGIC_DISABLE_OFFSET 0x00000180 /**< Enable Clear Register */ +#define XSCUGIC_PENDING_SET_OFFSET 0x00000200 /**< Pending Set + Register */ +#define XSCUGIC_PENDING_CLR_OFFSET 0x00000280 /**< Pending Clear + Register */ +#define XSCUGIC_ACTIVE_OFFSET 0x00000300 /**< Active Status Register */ +#define XSCUGIC_PRIORITY_OFFSET 0x00000400 /**< Priority Level Register */ +#define XSCUGIC_SPI_TARGET_OFFSET 0x00000800 /**< SPI Target + Register 0x800-0x8FB */ +#define XSCUGIC_INT_CFG_OFFSET 0x00000C00 /**< Interrupt Configuration + Register 0xC00-0xCFC */ +#define XSCUGIC_PPI_STAT_OFFSET 0x00000D00 /**< PPI Status Register */ +#define XSCUGIC_SPI_STAT_OFFSET 0x00000D04 /**< SPI Status Register + 0xd04-0xd7C */ +#define XSCUGIC_AHB_CONFIG_OFFSET 0x00000D80 /**< AHB Configuration + Register */ +#define XSCUGIC_SFI_TRIG_OFFSET 0x00000F00 /**< Software Triggered + Interrupt Register */ +#define XSCUGIC_PERPHID_OFFSET 0x00000FD0 /**< Peripheral ID Reg */ +#define XSCUGIC_PCELLID_OFFSET 0x00000FF0 /**< Pcell ID Register */ +/* @} */ + +/** @name Distributor Enable Register + * Controls if the distributor response to external interrupt inputs. + * @{ + */ +#define XSCUGIC_EN_INT_MASK 0x00000001 /**< Interrupt In Enable */ +/* @} */ + +/** @name Interrupt Controller Type Register + * @{ + */ +#define XSCUGIC_LSPI_MASK 0x0000F800 /**< Number of Lockable + Shared Peripheral + Interrupts*/ +#define XSCUGIC_DOMAIN_MASK 0x00000400 /**< Number os Security domains*/ +#define XSCUGIC_CPU_NUM_MASK 0x000000E0 /**< Number of CPU Interfaces */ +#define XSCUGIC_NUM_INT_MASK 0x0000001F /**< Number of Interrupt IDs */ +/* @} */ + +/** @name Implementor ID Register + * Implementor and revision information. + * @{ + */ +#define XSCUGIC_REV_MASK 0x00FFF000 /**< Revision Number */ +#define XSCUGIC_IMPL_MASK 0x00000FFF /**< Implementor */ +/* @} */ + +/** @name Interrupt Security Registers + * Each bit controls the security level of an interrupt, either secure or non + * secure. These registers can only be accessed using secure read and write. + * There are registers for each of the CPU interfaces at offset 0x080. A + * register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x084. + * @{ + */ +#define XSCUGIC_INT_NS_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Enable Set Register + * Each bit controls the enabling of an interrupt, a 0 is disabled, a 1 is + * enabled. Writing a 0 has no effect. Use the ENABLE_CLR register to set a + * bit to 0. + * There are registers for each of the CPU interfaces at offset 0x100. With up + * to 8 registers aliased to the same address. A register set for the SPI + * interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x104. + * @{ + */ +#define XSCUGIC_INT_EN_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Enable Clear Register + * Each bit controls the disabling of an interrupt, a 0 is disabled, a 1 is + * enabled. Writing a 0 has no effect. Writing a 1 disables an interrupt and + * sets the corresponding bit to 0. + * There are registers for each of the CPU interfaces at offset 0x180. With up + * to 8 registers aliased to the same address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x184. + * @{ + */ +#define XSCUGIC_INT_CLR_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Pending Set Register + * Each bit controls the Pending or Active and Pending state of an interrupt, a + * 0 is not pending, a 1 is pending. Writing a 0 has no effect. Writing a 1 sets + * an interrupt to the pending state. + * There are registers for each of the CPU interfaces at offset 0x200. With up + * to 8 registers aliased to the same address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x204. + * @{ + */ +#define XSCUGIC_PEND_SET_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Pending Clear Register + * Each bit can clear the Pending or Active and Pending state of an interrupt, a + * 0 is not pending, a 1 is pending. Writing a 0 has no effect. Writing a 1 + * clears the pending state of an interrupt. + * There are registers for each of the CPU interfaces at offset 0x280. With up + * to 8 registers aliased to the same address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x284. + * @{ + */ +#define XSCUGIC_PEND_CLR_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Active Status Register + * Each bit provides the Active status of an interrupt, a + * 0 is not Active, a 1 is Active. This is a read only register. + * There are registers for each of the CPU interfaces at offset 0x300. With up + * to 8 registers aliased to each address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x380. + * @{ + */ +#define XSCUGIC_ACTIVE_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Priority Level Register + * Each byte in a Priority Level Register sets the priority level of an + * interrupt. Reading the register provides the priority level of an interrupt. + * There are registers for each of the CPU interfaces at offset 0x400 through + * 0x41C. With up to 8 registers aliased to each address. + * 0 is highest priority, 0xFF is lowest. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 255 of these registers staring at location 0x420. + * @{ + */ +#define XSCUGIC_PRIORITY_MASK 0x000000FF /**< Each Byte corresponds to an + INT_ID */ +#define XSCUGIC_PRIORITY_MAX 0x000000FF /**< Highest value of a priority + actually the lowest priority*/ +/* @} */ + +/** @name SPI Target Register 0x800-0x8FB + * Each byte references a separate SPI and programs which of the up to 8 CPU + * interfaces are sent a Pending interrupt. + * There are registers for each of the CPU interfaces at offset 0x800 through + * 0x81C. With up to 8 registers aliased to each address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 255 of these registers staring at location 0x820. + * + * This driver does not support multiple CPU interfaces. These are included + * for complete documentation. + * @{ + */ +#define XSCUGIC_SPI_CPU7_MASK 0x00000080 /**< CPU 7 Mask*/ +#define XSCUGIC_SPI_CPU6_MASK 0x00000040 /**< CPU 6 Mask*/ +#define XSCUGIC_SPI_CPU5_MASK 0x00000020 /**< CPU 5 Mask*/ +#define XSCUGIC_SPI_CPU4_MASK 0x00000010 /**< CPU 4 Mask*/ +#define XSCUGIC_SPI_CPU3_MASK 0x00000008 /**< CPU 3 Mask*/ +#define XSCUGIC_SPI_CPU2_MASK 0x00000003 /**< CPU 2 Mask*/ +#define XSCUGIC_SPI_CPU1_MASK 0x00000002 /**< CPU 1 Mask*/ +#define XSCUGIC_SPI_CPU0_MASK 0x00000001 /**< CPU 0 Mask*/ +/* @} */ + +/** @name Interrupt Configuration Register 0xC00-0xCFC + * The interrupt configuration registers program an SFI to be active HIGH level + * sensitive or rising edge sensitive. + * Each bit pair describes the configuration for an INT_ID. + * SFI Read Only b10 always + * PPI Read Only depending on how the PPIs are configured. + * b01 Active HIGH level sensitive + * b11 Rising edge sensitive + * SPI LSB is read only. + * b01 Active HIGH level sensitive + * b11 Rising edge sensitive/ + * There are registers for each of the CPU interfaces at offset 0xC00 through + * 0xC04. With up to 8 registers aliased to each address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 255 of these registers staring at location 0xC08. + * @{ + */ +#define XSCUGIC_INT_CFG_MASK 0x00000003 /**< */ +/* @} */ + +/** @name PPI Status Register + * Enables an external AMBA master to access the status of the PPI inputs. + * A CPU can only read the status of its local PPI signals and cannot read the + * status for other CPUs. + * This register is aliased for each CPU interface. + * @{ + */ +#define XSCUGIC_PPI_C15_MASK 0x00008000 /**< PPI Status */ +#define XSCUGIC_PPI_C14_MASK 0x00004000 /**< PPI Status */ +#define XSCUGIC_PPI_C13_MASK 0x00002000 /**< PPI Status */ +#define XSCUGIC_PPI_C12_MASK 0x00001000 /**< PPI Status */ +#define XSCUGIC_PPI_C11_MASK 0x00000800 /**< PPI Status */ +#define XSCUGIC_PPI_C10_MASK 0x00000400 /**< PPI Status */ +#define XSCUGIC_PPI_C09_MASK 0x00000200 /**< PPI Status */ +#define XSCUGIC_PPI_C08_MASK 0x00000100 /**< PPI Status */ +#define XSCUGIC_PPI_C07_MASK 0x00000080 /**< PPI Status */ +#define XSCUGIC_PPI_C06_MASK 0x00000040 /**< PPI Status */ +#define XSCUGIC_PPI_C05_MASK 0x00000020 /**< PPI Status */ +#define XSCUGIC_PPI_C04_MASK 0x00000010 /**< PPI Status */ +#define XSCUGIC_PPI_C03_MASK 0x00000008 /**< PPI Status */ +#define XSCUGIC_PPI_C02_MASK 0x00000004 /**< PPI Status */ +#define XSCUGIC_PPI_C01_MASK 0x00000002 /**< PPI Status */ +#define XSCUGIC_PPI_C00_MASK 0x00000001 /**< PPI Status */ +/* @} */ + +/** @name SPI Status Register 0xd04-0xd7C + * Enables an external AMBA master to access the status of the SPI inputs. + * There are up to 63 registers if the maximum number of SPI inputs are + * configured. + * @{ + */ +#define XSCUGIC_SPI_N_MASK 0x00000001 /**< Each bit corresponds to an SPI + input */ +/* @} */ + +/** @name AHB Configuration Register + * Provides the status of the CFGBIGEND input signal and allows the endianess + * of the GIC to be set. + * @{ + */ +#define XSCUGIC_AHB_END_MASK 0x00000004 /**< 0-GIC uses little Endian, + 1-GIC uses Big Endian */ +#define XSCUGIC_AHB_ENDOVR_MASK 0x00000002 /**< 0-Uses CFGBIGEND control, + 1-use the AHB_END bit */ +#define XSCUGIC_AHB_TIE_OFF_MASK 0x00000001 /**< State of CFGBIGEND */ + +/* @} */ + +/** @name Software Triggered Interrupt Register + * Controls issueing of software interrupts. + * @{ + */ +#define XSCUGIC_SFI_SELFTRIG_MASK 0x02010000 +#define XSCUGIC_SFI_TRIG_TRGFILT_MASK 0x03000000 /**< Target List filter + b00-Use the target List + b01-All CPUs except requester + b10-To Requester + b11-reserved */ +#define XSCUGIC_SFI_TRIG_CPU_MASK 0x00FF0000 /**< CPU Target list */ +#define XSCUGIC_SFI_TRIG_SATT_MASK 0x00008000 /**< 0= Use a secure interrupt */ +#define XSCUGIC_SFI_TRIG_INTID_MASK 0x0000000F /**< Set to the INTID + signaled to the CPU*/ +/* @} */ + +/** @name CPU Interface Register Map + * + * Define the offsets from the base address for all CPU registers of the + * interrupt controller, some registers may be reserved in the hardware device. + * @{ + */ +#define XSCUGIC_CONTROL_OFFSET 0x00000000 /**< CPU Interface Control + Register */ +#define XSCUGIC_CPU_PRIOR_OFFSET 0x00000004 /**< Priority Mask Reg */ +#define XSCUGIC_BIN_PT_OFFSET 0x00000008 /**< Binary Point Register */ +#define XSCUGIC_INT_ACK_OFFSET 0x0000000C /**< Interrupt ACK Reg */ +#define XSCUGIC_EOI_OFFSET 0x00000010 /**< End of Interrupt Reg */ +#define XSCUGIC_RUN_PRIOR_OFFSET 0x00000014 /**< Running Priority Reg */ +#define XSCUGIC_HI_PEND_OFFSET 0x00000018 /**< Highest Pending Interrupt + Register */ +#define XSCUGIC_ALIAS_BIN_PT_OFFSET 0x0000001C /**< Aliased non-Secure + Binary Point Register */ + +/**< 0x00000020 to 0x00000FBC are reserved and should not be read or written + * to. */ +/* @} */ + + +/** @name Control Register + * CPU Interface Control register definitions + * All bits are defined here although some are not available in the non-secure + * mode. + * @{ + */ +#define XSCUGIC_CNTR_SBPR_MASK 0x00000010 /**< Secure Binary Pointer, + 0=separate registers, + 1=both use bin_pt_s */ +#define XSCUGIC_CNTR_FIQEN_MASK 0x00000008 /**< Use nFIQ_C for secure + interrupts, + 0= use IRQ for both, + 1=Use FIQ for secure, IRQ for non*/ +#define XSCUGIC_CNTR_ACKCTL_MASK 0x00000004 /**< Ack control for secure or non secure */ +#define XSCUGIC_CNTR_EN_NS_MASK 0x00000002 /**< Non Secure enable */ +#define XSCUGIC_CNTR_EN_S_MASK 0x00000001 /**< Secure enable, 0=Disabled, 1=Enabled */ +/* @} */ + +/** @name Priority Mask Register + * Priority Mask register definitions + * The CPU interface does not send interrupt if the level of the interrupt is + * lower than the level of the register. + * @{ + */ +#define XSCUGIC_PRIORITY_MASK 0x000000FF /**< All interrupts */ +/* @} */ + +/** @name Binary Point Register + * Binary Point register definitions + * @{ + */ + +#define XSCUGIC_BIN_PT_MASK 0x00000007 /**< Binary point mask value + Value Secure Non-secure + b000 0xFE 0xFF + b001 0xFC 0xFE + b010 0xF8 0xFC + b011 0xF0 0xF8 + b100 0xE0 0xF0 + b101 0xC0 0xE0 + b110 0x80 0xC0 + b111 0x00 0x80 + */ +/*@}*/ + +/** @name Interrupt Acknowledge Register + * Interrupt Acknowledge register definitions + * Identifies the current Pending interrupt, and the CPU ID for software + * interrupts. + */ +#define XSCUGIC_ACK_INTID_MASK 0x000003FF /**< Interrupt ID */ +#define XSCUGIC_CPUID_MASK 0x00000C00 /**< CPU ID */ +/* @} */ + +/** @name End of Interrupt Register + * End of Interrupt register definitions + * Allows the CPU to signal the GIC when it completes an interrupt service + * routine. + */ +#define XSCUGIC_EOI_INTID_MASK 0x000003FF /**< Interrupt ID */ + +/* @} */ + +/** @name Running Priority Register + * Running Priority register definitions + * Identifies the interrupt priority level of the highest priority active + * interrupt. + */ +#define XSCUGIC_RUN_PRIORITY_MASK 0x00000FF /**< Interrupt Priority */ +/* @} */ + +/* + * Highest Pending Interrupt register definitions + * Identifies the interrupt priority of the highest priority pending interupt + */ +#define XSCUGIC_PEND_INTID_MASK 0x000003FF /**< Pending Interrupt ID */ +#define XSCUGIC_CPUID_MASK 0x00000C00 /**< CPU ID */ +/* @} */ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Read the Interrupt Configuration Register offset for an interrupt id. +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_INT_CFG_OFFSET_CALC(InterruptID) \ + (XSCUGIC_INT_CFG_OFFSET + ((InterruptID/16) * 4)) + +/****************************************************************************/ +/** +* +* Read the Interrupt Priority Register offset for an interrupt id. +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_PRIORITY_OFFSET_CALC(InterruptID) \ + (XSCUGIC_PRIORITY_OFFSET + ((InterruptID/4) * 4)) + +/****************************************************************************/ +/** +* +* Read the SPI Target Register offset for an interrupt id. +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_SPI_TARGET_OFFSET_CALC(InterruptID) \ + (XSCUGIC_SPI_TARGET_OFFSET + ((InterruptID/4) * 4)) + +/****************************************************************************/ +/** +* +* Read the Interrupt Clear-Enable Register offset for an interrupt ID +* +* @param Register is the register offset for the clear/enable bank. +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_ENABLE_DISABLE_OFFSET_CALC(Register, InterruptID) \ + (Register + ((InterruptID/32) * 4)) + +/****************************************************************************/ +/** +* +* Read the given Intc register. +* +* @param BaseAddress is the base address of the device. +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note +* C-style signature: +* u32 XScuGic_ReadReg(u32 BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XScuGic_ReadReg(BaseAddress, RegOffset) \ + (Xil_In32((BaseAddress) + (RegOffset))) + + +/****************************************************************************/ +/** +* +* Write the given Intc register. +* +* @param BaseAddress is the base address of the device. +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note +* C-style signature: +* void XScuGic_WriteReg(u32 BaseAddress, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuGic_WriteReg(BaseAddress, RegOffset, Data) \ + (Xil_Out32(((BaseAddress) + (RegOffset)), ((u32)Data))) + + +/****************************************************************************/ +/** +* +* Enable specific interrupt(s) in the interrupt controller. +* +* @param DistBaseAddress is the Distributor Register base address of the +* device +* @param Int_Id is the ID of the interrupt source and should be in the +* range of 0 to XSCUGIC_MAX_NUM_INTR_INPUTS - 1 +* +* @return None. +* +* @note C-style signature: +* void XScuGic_EnableIntr(u32 DistBaseAddress, u32 Int_Id); +* +*****************************************************************************/ +#define XScuGic_EnableIntr(DistBaseAddress, Int_Id) \ + XScuGic_WriteReg((DistBaseAddress), \ + XSCUGIC_ENABLE_SET_OFFSET + ((Int_Id / 32) * 4), \ + (1 << (Int_Id % 32))) + +/****************************************************************************/ +/** +* +* Disable specific interrupt(s) in the interrupt controller. +* +* @param DistBaseAddress is the Distributor Register base address of the +* device +* @param Int_Id is the ID of the interrupt source and should be in the +* range of 0 to XSCUGIC_MAX_NUM_INTR_INPUTS - 1 +* +* +* @return None. +* +* @note C-style signature: +* void XScuGic_DisableIntr(u32 DistBaseAddress, u32 Int_Id); +* +*****************************************************************************/ +#define XScuGic_DisableIntr(DistBaseAddress, Int_Id) \ + XScuGic_WriteReg((DistBaseAddress), \ + XSCUGIC_DISABLE_OFFSET + ((Int_Id / 32) * 4), \ + (1 << (Int_Id % 32))) + + +/************************** Function Prototypes ******************************/ + +void XScuGic_DeviceInterruptHandler(void *DeviceId); +int XScuGic_DeviceInitialize(u32 DeviceId); +void XScuGic_RegisterHandler(u32 BaseAddress, int InterruptId, + Xil_InterruptHandler Handler, void *CallBackRef); +void XScuGic_SetPriTrigTypeByDistAddr(u32 DistBaseAddress, u32 Int_Id, + u8 Priority, u8 Trigger); +void XScuGic_GetPriTrigTypeByDistAddr(u32 DistBaseAddress, u32 Int_Id, + u8 *Priority, u8 *Trigger); +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscutimer.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscutimer.h new file mode 100755 index 000000000..464cf22a1 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscutimer.h @@ -0,0 +1,365 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer.h +* +* The timer driver supports the Cortex A9 private timer. +* +* The timer driver supports the following features: +* - Normal mode and Auto reload mode +* - Interrupts (Interrupt handler is not provided in this driver. Application +* has to register it's own handler) +* +* <b> Initialization and Configuration </b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate with the Timer. +* +* XScuTimer_CfgInitialize() API is used to initialize the Timer. The +* user needs to first call the XScuTimer_LookupConfig() API which returns +* the Configuration structure pointer which is passed as a parameter to +* the XScuTimer_CfgInitialize() API. +* +* <b> Interrupts </b> +* +* The Timer hardware supports interrupts. +* +* This driver does not provide a Interrupt Service Routine (ISR) for the device. +* It is the responsibility of the application to provide one if needed. Refer to +* the interrupt example provided with this driver for details on using the +* Timer in interrupt mode. +* +* <b> Virtual Memory </b> +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* <b> Threads </b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* <b> Asserts </b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* <b> Building the driver </b> +* +* The XScuTimer driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* +* <br><br> +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a nm 03/10/10 First release +* 1.02a sg 07/17/12 Included xil_assert.h for CR 667947. This is an issue +* when the xstatus.h in the common driver overwrites +* the xstatus.h of the standalone BSP during the +* libgen. +* </pre> +* +******************************************************************************/ +#ifndef XSCUTIMER_H /* prevent circular inclusions */ +#define XSCUTIMER_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xscutimer_hw.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Base address of the device */ +} XScuTimer_Config; + +/** + * The XScuTimer driver instance data. The user is required to allocate a + * variable of this type for every timer device in the system. + * A pointer to a variable of this type is then passed to the driver API + * functions. + */ +typedef struct { + XScuTimer_Config Config; /**< Hardware Configuration */ + u32 IsReady; /**< Device is initialized and ready */ + u32 IsStarted; /**< Device timer is running */ +} XScuTimer; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Check if the timer has expired. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return +* - TRUE if the timer has expired. +* - FALSE if the timer has not expired. +* +* @note C-style signature: +* int XScuTimer_IsExpired(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_IsExpired(InstancePtr) \ + ((XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_ISR_OFFSET) & \ + XSCUTIMER_ISR_EVENT_FLAG_MASK) == \ + XSCUTIMER_ISR_EVENT_FLAG_MASK) + +/****************************************************************************/ +/** +* +* Re-start the timer. This macro will read the timer load register +* and writes the same value to load register to update the counter register. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_RestartTimer(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_RestartTimer(InstancePtr) \ + XScuTimer_LoadTimer(InstancePtr, \ + XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_LOAD_OFFSET)) + +/****************************************************************************/ +/** +* +* Write to the timer load register. This will also update the +* timer counter register with the new value. This macro can be used to +* change the time-out value. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* @param Value is the count to be loaded in to the load register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_LoadTimer(XScuTimer *InstancePtr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_LoadTimer(InstancePtr, Value) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_LOAD_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer counter register value. It can be called at any +* time. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return Contents of the timer counter register. +* +* @note C-style signature: + u32 XScuTimer_GetCounterValue(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_GetCounterValue(InstancePtr) \ + XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_COUNTER_OFFSET) + +/****************************************************************************/ +/** +* +* Enable auto-reload mode. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_EnableAutoReload(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_EnableAutoReload(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET, \ + (XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET) | \ + XSCUTIMER_CONTROL_AUTO_RELOAD_MASK)) + +/****************************************************************************/ +/** +* +* Disable auto-reload mode. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_DisableAutoReload(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_DisableAutoReload(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET, \ + (XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET) & \ + ~(XSCUTIMER_CONTROL_AUTO_RELOAD_MASK))) + +/****************************************************************************/ +/** +* +* Enable the Timer interrupt. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_EnableInterrupt(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_EnableInterrupt(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET, \ + (XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET) | \ + XSCUTIMER_CONTROL_IRQ_ENABLE_MASK)) + +/****************************************************************************/ +/** +* +* Disable the Timer interrupt. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_DisableInterrupt(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_DisableInterrupt(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET, \ + (XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET) & \ + ~(XSCUTIMER_CONTROL_IRQ_ENABLE_MASK))) + +/*****************************************************************************/ +/** +* +* This function reads the interrupt status. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_GetInterruptStatus(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_GetInterruptStatus(InstancePtr) \ + XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_ISR_OFFSET) + +/*****************************************************************************/ +/** +* +* This function clears the interrupt status. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_ClearInterruptStatus(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_ClearInterruptStatus(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_ISR_OFFSET, XSCUTIMER_ISR_EVENT_FLAG_MASK) + +/************************** Function Prototypes ******************************/ + +/* + * Lookup configuration in xscutimer_sinit.c + */ +XScuTimer_Config *XScuTimer_LookupConfig(u16 DeviceId); + +/* + * Selftest function in xscutimer_selftest.c + */ +int XScuTimer_SelfTest(XScuTimer *InstancePtr); + +/* + * Interface functions in xscutimer.c + */ +int XScuTimer_CfgInitialize(XScuTimer *InstancePtr, + XScuTimer_Config *ConfigPtr, u32 EffectiveAddress); +void XScuTimer_Start(XScuTimer *InstancePtr); +void XScuTimer_Stop(XScuTimer *InstancePtr); +void XScuTimer_SetPrescaler(XScuTimer *InstancePtr, u8 PrescalerValue); +u8 XScuTimer_GetPrescaler(XScuTimer *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscutimer_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscutimer_hw.h new file mode 100755 index 000000000..d18cf6366 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscutimer_hw.h @@ -0,0 +1,292 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer_hw.h +* +* This file contains the hardware interface to the Timer. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a nm 03/10/10 First release +* 1.01a sdm 02/02/12 Added low level macros to read/write load, counter, control +* and interrupt registers +* 1.02a sg 07/17/12 Included xil_assert.h for CR 667947. This is an issue +* when the xstatus.h in the common driver overwrites +* the xstatus.h of the standalone BSP during the +* libgen. +* </pre> +* +******************************************************************************/ +#ifndef XSCUTIMER_HW_H /* prevent circular inclusions */ +#define XSCUTIMER_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xil_types.h" +#include "xil_io.h" +#include "xil_assert.h" +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * Offsets of registers from the start of the device + * @{ + */ + +#define XSCUTIMER_LOAD_OFFSET 0x00 /**< Timer Load Register */ +#define XSCUTIMER_COUNTER_OFFSET 0x04 /**< Timer Counter Register */ +#define XSCUTIMER_CONTROL_OFFSET 0x08 /**< Timer Control Register */ +#define XSCUTIMER_ISR_OFFSET 0x0C /**< Timer Interrupt + Status Register */ +/* @} */ + +/** @name Timer Control register + * This register bits control the prescaler, Intr enable, + * auto-reload and timer enable. + * @{ + */ + +#define XSCUTIMER_CONTROL_PRESCALER_MASK 0x0000FF00 /**< Prescaler */ +#define XSCUTIMER_CONTROL_PRESCALER_SHIFT 8 +#define XSCUTIMER_CONTROL_IRQ_ENABLE_MASK 0x00000004 /**< Intr enable */ +#define XSCUTIMER_CONTROL_AUTO_RELOAD_MASK 0x00000002 /**< Auto-reload */ +#define XSCUTIMER_CONTROL_ENABLE_MASK 0x00000001 /**< Timer enable */ +/* @} */ + +/** @name Interrupt Status register + * This register indicates the Timer counter register has reached zero. + * @{ + */ + +#define XSCUTIMER_ISR_EVENT_FLAG_MASK 0x00000001 /**< Event flag */ +/*@}*/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Write to the timer load register. This will also update the +* timer counter register with the new value. This macro can be used to +* change the time-out value. +* +* @param BaseAddr is the base address of the scu timer. +* @param Value is the count to be loaded in to the load register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_SetLoadReg(u32 BaseAddr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_SetLoadReg(BaseAddr, Value) \ + XScuTimer_WriteReg(BaseAddr, XSCUTIMER_LOAD_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer load register value. +* +* @param BaseAddr is the base address of the scu timer. +* +* @return Contents of the timer load register. +* +* @note C-style signature: +* u32 XScuTimer_GetLoadReg(u32 BaseAddr) +* +******************************************************************************/ +#define XScuTimer_GetLoadReg(BaseAddr) \ + XScuTimer_ReadReg(BaseAddr, XSCUTIMER_LOAD_OFFSET) + +/****************************************************************************/ +/** +* +* Write to the timer counter register. +* +* @param BaseAddr is the base address of the scu timer. +* @param Value is the count to be loaded in to the counter register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_SetCounterReg(u32 BaseAddr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_SetCounterReg(BaseAddr, Value) \ + XScuTimer_WriteReg(BaseAddr, XSCUTIMER_COUNTER_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer counter register value. +* +* @param BaseAddr is the base address of the scu timer. +* +* @return Contents of the timer counter register. +* +* @note C-style signature: + u32 XScuTimer_GetCounterReg(u32 BaseAddr) +* +******************************************************************************/ +#define XScuTimer_GetCounterReg(BaseAddr) \ + XScuTimer_ReadReg(BaseAddr, XSCUTIMER_COUNTER_OFFSET) + +/****************************************************************************/ +/** +* +* Write to the timer load register. This will also update the +* timer counter register with the new value. This macro can be used to +* change the time-out value. +* +* @param BaseAddr is the base address of the scu timer. +* @param Value is the count to be loaded in to the load register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_SetControlReg(u32 BaseAddr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_SetControlReg(BaseAddr, Value) \ + XScuTimer_WriteReg(BaseAddr, XSCUTIMER_CONTROL_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer load register value. +* +* @param BaseAddr is the base address of the scu timer. +* +* @return Contents of the timer load register. +* +* @note C-style signature: + u32 XScuTimer_GetControlReg(u32 BaseAddr) +* +******************************************************************************/ +#define XScuTimer_GetControlReg(BaseAddr) \ + XScuTimer_ReadReg(BaseAddr, XSCUTIMER_CONTROL_OFFSET) + +/****************************************************************************/ +/** +* +* Write to the timer counter register. +* +* @param BaseAddr is the base address of the scu timer. +* @param Value is the count to be loaded in to the counter register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_SetIntrReg(u32 BaseAddr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_SetIntrReg(BaseAddr, Value) \ + XScuTimer_WriteReg(BaseAddr, XSCUTIMER_ISR_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer counter register value. +* +* @param BaseAddr is the base address of the scu timer. +* +* @return Contents of the timer counter register. +* +* @note C-style signature: + u32 XScuTimer_GetIntrReg(u32 BaseAddr) +* +******************************************************************************/ +#define XScuTimer_GetIntrReg(BaseAddr) \ + XScuTimer_ReadReg(BaseAddr, XSCUTIMER_ISR_OFFSET) + +/****************************************************************************/ +/** +* +* Read from the given Timer register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note C-style signature: +* u32 XScuTimer_ReadReg(u32 BaseAddr, u32 RegOffset) +* +*****************************************************************************/ +#define XScuTimer_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (RegOffset)) + +/****************************************************************************/ +/** +* +* Write to the given Timer register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_WriteReg(u32 BaseAddr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuTimer_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (RegOffset), (Data)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscuwdt.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscuwdt.h new file mode 100755 index 000000000..39ecd7d18 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscuwdt.h @@ -0,0 +1,384 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt.h +* +* The Xilinx SCU watchdog timer driver (XScuWdt) supports the Xilinx SCU private +* watchdog timer hardware. +* +* The XScuWdt driver supports the following features: +* - Watchdog mode +* - Timer mode +* - Auto reload (timer mode only) +* +* The watchdog counter register is a down counter and starts decrementing when +* the watchdog is started. +* In watchdog mode, when the counter reaches 0, the Reset flag is set in the +* Reset status register and the WDRESETREQ pin is asserted, causing a system +* reset. The Reset flag is not reset by normal processor reset and is cleared +* when written with a value of 1. This enables the user to differentiate a +* normal reset and a reset caused by watchdog time-out. The user needs to call +* XScuWdt_RestartWdt() periodically, to avoid the watchdog from being timed-out. +* +* The IsWdtExpired function can be used to check if the watchdog was the cause +* of the last reset. In this situation, call Initialize then call IsWdtExpired. +* If the result is true, watchdog timeout caused the last system reset. The +* application then needs to clear the Reset flag. +* +* In timer mode, when the counter reaches 0, the Event flag is set in the +* Interrupt status register and if interrupts are enabled, interrupt ID 30 is +* set as pending in the interrupt distributor. The IsTimerExpired function +* is used to check if the watchdog counter has decremented to 0 in timer mode. +* If auto-reload mode is enabled, the Counter register is automatically reloaded +* from the Load register. +* +* <b> Initialization and Configuration </b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate with the Watchdog Timer. +* +* XScuWdt_CfgInitialize() API is used to initialize the Watchdog Timer. The +* user needs to first call the XScuWdt_LookupConfig() API which returns +* the Configuration structure pointer which is passed as a parameter to +* the XScuWdt_CfgInitialize() API. +* +* <b>Interrupts</b> +* +* The SCU Watchdog Timer supports interrupts in Timer mode. +* +* This driver does not provide a Interrupt Service Routine (ISR) for the device. +* It is the responsibility of the application to provide one if needed. Refer to +* the interrupt example provided with this driver for details on using the +* Timer in interrupt mode. +* +* <b> Virtual Memory </b> +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* <b> Threads </b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* <b> Asserts </b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* <b> Building the driver </b> +* +* The XScuWdt driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* +* <br><br> +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a sdm 01/15/10 First release +* 1.02a sg 07/17/12 Included xil_assert.h for CR 667947. This is an issue +* when the xstatus.h in the common driver overwrites +* the xstatus.h of the standalone BSP during the +* libgen. +* </pre> +* +******************************************************************************/ +#ifndef XSCUWDT_H /* prevent circular inclusions */ +#define XSCUWDT_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xscuwdt_hw.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Base address of the device */ +} XScuWdt_Config; + +/** + * The XScuWdt driver instance data. The user is required to allocate a + * variable of this type for every watchdog/timer device in the system. + * A pointer to a variable of this type is then passed to the driver API + * functions. + */ +typedef struct { + XScuWdt_Config Config;/**< Hardware Configuration */ + u32 IsReady; /**< Device is initialized and ready */ + u32 IsStarted; /**< Device watchdog timer is running */ +} XScuWdt; + +/***************** Macros (Inline Functions) Definitions *********************/ +/****************************************************************************/ +/** +* +* This function is used to check if the watchdog has timed-out and the last +* reset was caused by the watchdog reset. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return +* - TRUE if the watchdog has expired. +* - FALSE if the watchdog has not expired. +* +* @note C-style signature: +* int XScuWdt_IsWdtExpired(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_IsWdtExpired(InstancePtr) \ + ((XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_RST_STS_OFFSET) & \ + XSCUWDT_RST_STS_RESET_FLAG_MASK) == XSCUWDT_RST_STS_RESET_FLAG_MASK) + +/****************************************************************************/ +/** +* +* This function is used to check if the watchdog counter has reached 0 in timer +* mode. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return +* - TRUE if the watchdog has expired. +* - FALSE if the watchdog has not expired. +* +* @note C-style signature: +* int XScuWdt_IsTimerExpired(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_IsTimerExpired(InstancePtr) \ + ((XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_ISR_OFFSET) & \ + XSCUWDT_ISR_EVENT_FLAG_MASK) == XSCUWDT_ISR_EVENT_FLAG_MASK) + +/****************************************************************************/ +/** +* +* Re-start the watchdog timer. This macro will read the watchdog load register +* and write the same value to load register to update the counter register. +* An application needs to call this function periodically to keep the watchdog +* from asserting the WDRESETREQ reset request output pin. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_RestartWdt(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_RestartWdt(InstancePtr) \ + XScuWdt_LoadWdt(InstancePtr, \ + (XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_LOAD_OFFSET))) + +/****************************************************************************/ +/** +* +* Write to the watchdog timer load register. This will also update the +* watchdog counter register with the new value. This macro can be used to +* change the time-out value. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* @param Value is the value to be written to the Watchdog Load register. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_LoadWdt(XScuWdt *InstancePtr, u32 Value) +* +******************************************************************************/ +#define XScuWdt_LoadWdt(InstancePtr, Value) \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_LOAD_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Put the watchdog timer in Watchdog mode by setting the WD mode bit of the +* Watchdog control register. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_SetWdMode(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_SetWdMode(InstancePtr) \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_CONTROL_OFFSET, \ + (XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_CONTROL_OFFSET) | \ + XSCUWDT_CONTROL_WD_MODE_MASK)) + +/****************************************************************************/ +/** +* +* Put the watchdog timer in Timer mode by writing 0x12345678 and 0x87654321 +* successively to the Watchdog Disable Register. +* The software must write 0x12345678 and 0x87654321 successively to the +* Watchdog Disable Register so that the watchdog mode bit in the Watchdog +* Control Register is set to zero. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_SetTimerMode(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_SetTimerMode(InstancePtr) \ +{ \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_DISABLE_OFFSET, \ + XSCUWDT_DISABLE_VALUE1); \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_DISABLE_OFFSET, \ + XSCUWDT_DISABLE_VALUE2); \ +} + +/****************************************************************************/ +/** +* +* Get the contents of the watchdog control register. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return Contents of the watchdog control register. +* +* @note C-style signature: + u32 XScuWdt_GetControlReg(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_GetControlReg(InstancePtr) \ + XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_CONTROL_OFFSET) + +/****************************************************************************/ +/** +* +* Write to the watchdog control register. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* @param ControlReg is the value to be written to the watchdog control +* register. +* +* @return None. +* +* @note C-style signature: + void XScuWdt_SetControlReg(XScuWdt *InstancePtr, u32 ControlReg) +* +******************************************************************************/ +#define XScuWdt_SetControlReg(InstancePtr, ControlReg) \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_CONTROL_OFFSET, ControlReg) + +/****************************************************************************/ +/** +* +* Enable auto-reload mode. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_EnableAutoReload(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_EnableAutoReload(InstancePtr) \ + XScuWdt_SetControlReg((InstancePtr), \ + (XScuWdt_GetControlReg(InstancePtr) | \ + XSCUWDT_CONTROL_AUTO_RELOAD_MASK)) + +/************************** Function Prototypes ******************************/ + +/* + * Lookup configuration in xscuwdt_sinit.c. + */ +XScuWdt_Config *XScuWdt_LookupConfig(u16 DeviceId); + +/* + * Selftest function in xscuwdt_selftest.c + */ +int XScuWdt_SelfTest(XScuWdt *InstancePtr); + +/* + * Interface functions in xscuwdt.c + */ +int XScuWdt_CfgInitialize(XScuWdt *InstancePtr, + XScuWdt_Config *ConfigPtr, u32 EffectiveAddress); + +void XScuWdt_Start(XScuWdt *InstancePtr); + +void XScuWdt_Stop(XScuWdt *InstancePtr); + +/* + * Self-test function in xwdttb_selftest.c. + */ +int XScuWdt_SelfTest(XScuWdt *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscuwdt_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscuwdt_hw.h new file mode 100755 index 000000000..9bf23046d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xscuwdt_hw.h @@ -0,0 +1,187 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt_hw.h +* +* This file contains the hardware interface to the Xilinx SCU private Watch Dog +* Timer (XSCUWDT). +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a sdm 01/15/10 First release +* 1.01a bss 02/27/12 Updated the register offsets to start at 0x0 instead +* of 0x20 as the base address obtained from the tools +* starts at 0x20. +* 1.02a sg 07/17/12 Included xil_assert.h for CR 667947. This is an issue +* when the xstatus.h in the common driver overwrites +* the xstatus.h of the standalone BSP during the +* libgen. +* </pre> +* +******************************************************************************/ +#ifndef XSCUWDT_HW_H /* prevent circular inclusions */ +#define XSCUWDT_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_io.h" +#include "xil_assert.h" +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * Offsets of registers from the start of the device. The WDT registers start at + * an offset 0x20 + * @{ + */ + +#define XSCUWDT_LOAD_OFFSET 0x00 /**< Watchdog Load Register */ +#define XSCUWDT_COUNTER_OFFSET 0x04 /**< Watchdog Counter Register */ +#define XSCUWDT_CONTROL_OFFSET 0x08 /**< Watchdog Control Register */ +#define XSCUWDT_ISR_OFFSET 0x0C /**< Watchdog Interrupt Status Register */ +#define XSCUWDT_RST_STS_OFFSET 0x10 /**< Watchdog Reset Status Register */ +#define XSCUWDT_DISABLE_OFFSET 0x14 /**< Watchdog Disable Register */ +/* @} */ + +/** @name Watchdog Control register + * This register bits control the prescaler, WD/Timer mode, Intr enable, + * auto-reload, watchdog enable. + * @{ + */ + +#define XSCUWDT_CONTROL_PRESCALER_MASK 0x0000FF00 /**< Prescaler */ +#define XSCUWDT_CONTROL_PRESCALER_SHIFT 8 +#define XSCUWDT_CONTROL_WD_MODE_MASK 0x00000008 /**< Watchdog/Timer mode */ +#define XSCUWDT_CONTROL_IT_ENABLE_MASK 0x00000004 /**< Intr enable (in + timer mode) */ +#define XSCUWDT_CONTROL_AUTO_RELOAD_MASK 0x00000002 /**< Auto-reload (in + timer mode) */ +#define XSCUWDT_CONTROL_WD_ENABLE_MASK 0x00000001 /**< Watchdog enable */ +/* @} */ + +/** @name Interrupt Status register + * This register indicates the Counter register has reached zero in Counter + * mode. + * @{ + */ + +#define XSCUWDT_ISR_EVENT_FLAG_MASK 0x00000001 /**< Event flag */ +/*@}*/ + +/** @name Reset Status register + * This register indicates the Counter register has reached zero in Watchdog + * mode and a reset request is sent. + * @{ + */ + +#define XSCUWDT_RST_STS_RESET_FLAG_MASK 0x00000001 /**< Time out occured */ +/*@}*/ + +/** @name Disable register + * This register is used to switch from watchdog mode to timer mode. + * The software must write 0x12345678 and 0x87654321 successively to the + * Watchdog Disable Register so that the watchdog mode bit in the Watchdog + * Control Register is set to zero. + * @{ + */ +#define XSCUWDT_DISABLE_VALUE1 0x12345678 /**< Watchdog mode disable + value 1 */ +#define XSCUWDT_DISABLE_VALUE2 0x87654321 /**< Watchdog mode disable + value 2 */ +/*@}*/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Read the given register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note C-style signature: +* u32 XScuWdt_ReadReg(u32 BaseAddr, u32 RegOffset) +* +*****************************************************************************/ +#define XScuWdt_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (RegOffset)) + +/****************************************************************************/ +/** +* +* Write the given register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_WriteReg(u32 BaseAddr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuWdt_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (RegOffset), (Data)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xstatus.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xstatus.h new file mode 100755 index 000000000..76d2a94c7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xstatus.h @@ -0,0 +1,439 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xstatus.h +* +* This file contains Xilinx software status codes. Status codes have their +* own data type called int. These codes are used throughout the Xilinx +* device drivers. +* +******************************************************************************/ + +#ifndef XSTATUS_H /* prevent circular inclusions */ +#define XSTATUS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" + +/************************** Constant Definitions *****************************/ + +/*********************** Common statuses 0 - 500 *****************************/ + +#define XST_SUCCESS 0L +#define XST_FAILURE 1L +#define XST_DEVICE_NOT_FOUND 2L +#define XST_DEVICE_BLOCK_NOT_FOUND 3L +#define XST_INVALID_VERSION 4L +#define XST_DEVICE_IS_STARTED 5L +#define XST_DEVICE_IS_STOPPED 6L +#define XST_FIFO_ERROR 7L /* an error occurred during an + operation with a FIFO such as + an underrun or overrun, this + error requires the device to + be reset */ +#define XST_RESET_ERROR 8L /* an error occurred which requires + the device to be reset */ +#define XST_DMA_ERROR 9L /* a DMA error occurred, this error + typically requires the device + using the DMA to be reset */ +#define XST_NOT_POLLED 10L /* the device is not configured for + polled mode operation */ +#define XST_FIFO_NO_ROOM 11L /* a FIFO did not have room to put + the specified data into */ +#define XST_BUFFER_TOO_SMALL 12L /* the buffer is not large enough + to hold the expected data */ +#define XST_NO_DATA 13L /* there was no data available */ +#define XST_REGISTER_ERROR 14L /* a register did not contain the + expected value */ +#define XST_INVALID_PARAM 15L /* an invalid parameter was passed + into the function */ +#define XST_NOT_SGDMA 16L /* the device is not configured for + scatter-gather DMA operation */ +#define XST_LOOPBACK_ERROR 17L /* a loopback test failed */ +#define XST_NO_CALLBACK 18L /* a callback has not yet been + registered */ +#define XST_NO_FEATURE 19L /* device is not configured with + the requested feature */ +#define XST_NOT_INTERRUPT 20L /* device is not configured for + interrupt mode operation */ +#define XST_DEVICE_BUSY 21L /* device is busy */ +#define XST_ERROR_COUNT_MAX 22L /* the error counters of a device + have maxed out */ +#define XST_IS_STARTED 23L /* used when part of device is + already started i.e. + sub channel */ +#define XST_IS_STOPPED 24L /* used when part of device is + already stopped i.e. + sub channel */ +#define XST_DATA_LOST 26L /* driver defined error */ +#define XST_RECV_ERROR 27L /* generic receive error */ +#define XST_SEND_ERROR 28L /* generic transmit error */ +#define XST_NOT_ENABLED 29L /* a requested service is not + available because it has not + been enabled */ + +/***************** Utility Component statuses 401 - 500 *********************/ + +#define XST_MEMTEST_FAILED 401L /* memory test failed */ + + +/***************** Common Components statuses 501 - 1000 *********************/ + +/********************* Packet Fifo statuses 501 - 510 ************************/ + +#define XST_PFIFO_LACK_OF_DATA 501L /* not enough data in FIFO */ +#define XST_PFIFO_NO_ROOM 502L /* not enough room in FIFO */ +#define XST_PFIFO_BAD_REG_VALUE 503L /* self test, a register value + was invalid after reset */ +#define XST_PFIFO_ERROR 504L /* generic packet FIFO error */ +#define XST_PFIFO_DEADLOCK 505L /* packet FIFO is reporting + * empty and full simultaneously + */ + +/************************** DMA statuses 511 - 530 ***************************/ + +#define XST_DMA_TRANSFER_ERROR 511L /* self test, DMA transfer + failed */ +#define XST_DMA_RESET_REGISTER_ERROR 512L /* self test, a register value + was invalid after reset */ +#define XST_DMA_SG_LIST_EMPTY 513L /* scatter gather list contains + no buffer descriptors ready + to be processed */ +#define XST_DMA_SG_IS_STARTED 514L /* scatter gather not stopped */ +#define XST_DMA_SG_IS_STOPPED 515L /* scatter gather not running */ +#define XST_DMA_SG_LIST_FULL 517L /* all the buffer desciptors of + the scatter gather list are + being used */ +#define XST_DMA_SG_BD_LOCKED 518L /* the scatter gather buffer + descriptor which is to be + copied over in the scatter + list is locked */ +#define XST_DMA_SG_NOTHING_TO_COMMIT 519L /* no buffer descriptors have been + put into the scatter gather + list to be commited */ +#define XST_DMA_SG_COUNT_EXCEEDED 521L /* the packet count threshold + specified was larger than the + total # of buffer descriptors + in the scatter gather list */ +#define XST_DMA_SG_LIST_EXISTS 522L /* the scatter gather list has + already been created */ +#define XST_DMA_SG_NO_LIST 523L /* no scatter gather list has + been created */ +#define XST_DMA_SG_BD_NOT_COMMITTED 524L /* the buffer descriptor which was + being started was not committed + to the list */ +#define XST_DMA_SG_NO_DATA 525L /* the buffer descriptor to start + has already been used by the + hardware so it can't be reused + */ +#define XST_DMA_SG_LIST_ERROR 526L /* general purpose list access + error */ +#define XST_DMA_BD_ERROR 527L /* general buffer descriptor + error */ + +/************************** IPIF statuses 531 - 550 ***************************/ + +#define XST_IPIF_REG_WIDTH_ERROR 531L /* an invalid register width + was passed into the function */ +#define XST_IPIF_RESET_REGISTER_ERROR 532L /* the value of a register at + reset was not valid */ +#define XST_IPIF_DEVICE_STATUS_ERROR 533L /* a write to the device interrupt + status register did not read + back correctly */ +#define XST_IPIF_DEVICE_ACK_ERROR 534L /* the device interrupt status + register did not reset when + acked */ +#define XST_IPIF_DEVICE_ENABLE_ERROR 535L /* the device interrupt enable + register was not updated when + other registers changed */ +#define XST_IPIF_IP_STATUS_ERROR 536L /* a write to the IP interrupt + status register did not read + back correctly */ +#define XST_IPIF_IP_ACK_ERROR 537L /* the IP interrupt status register + did not reset when acked */ +#define XST_IPIF_IP_ENABLE_ERROR 538L /* IP interrupt enable register was + not updated correctly when other + registers changed */ +#define XST_IPIF_DEVICE_PENDING_ERROR 539L /* The device interrupt pending + register did not indicate the + expected value */ +#define XST_IPIF_DEVICE_ID_ERROR 540L /* The device interrupt ID register + did not indicate the expected + value */ +#define XST_IPIF_ERROR 541L /* generic ipif error */ + +/****************** Device specific statuses 1001 - 4095 *********************/ + +/********************* Ethernet statuses 1001 - 1050 *************************/ + +#define XST_EMAC_MEMORY_SIZE_ERROR 1001L /* Memory space is not big enough + * to hold the minimum number of + * buffers or descriptors */ +#define XST_EMAC_MEMORY_ALLOC_ERROR 1002L /* Memory allocation failed */ +#define XST_EMAC_MII_READ_ERROR 1003L /* MII read error */ +#define XST_EMAC_MII_BUSY 1004L /* An MII operation is in progress */ +#define XST_EMAC_OUT_OF_BUFFERS 1005L /* Driver is out of buffers */ +#define XST_EMAC_PARSE_ERROR 1006L /* Invalid driver init string */ +#define XST_EMAC_COLLISION_ERROR 1007L /* Excess deferral or late + * collision on polled send */ + +/*********************** UART statuses 1051 - 1075 ***************************/ +#define XST_UART + +#define XST_UART_INIT_ERROR 1051L +#define XST_UART_START_ERROR 1052L +#define XST_UART_CONFIG_ERROR 1053L +#define XST_UART_TEST_FAIL 1054L +#define XST_UART_BAUD_ERROR 1055L +#define XST_UART_BAUD_RANGE 1056L + + +/************************ IIC statuses 1076 - 1100 ***************************/ + +#define XST_IIC_SELFTEST_FAILED 1076 /* self test failed */ +#define XST_IIC_BUS_BUSY 1077 /* bus found busy */ +#define XST_IIC_GENERAL_CALL_ADDRESS 1078 /* mastersend attempted with */ + /* general call address */ +#define XST_IIC_STAND_REG_RESET_ERROR 1079 /* A non parameterizable reg */ + /* value after reset not valid */ +#define XST_IIC_TX_FIFO_REG_RESET_ERROR 1080 /* Tx fifo included in design */ + /* value after reset not valid */ +#define XST_IIC_RX_FIFO_REG_RESET_ERROR 1081 /* Rx fifo included in design */ + /* value after reset not valid */ +#define XST_IIC_TBA_REG_RESET_ERROR 1082 /* 10 bit addr incl in design */ + /* value after reset not valid */ +#define XST_IIC_CR_READBACK_ERROR 1083 /* Read of the control register */ + /* didn't return value written */ +#define XST_IIC_DTR_READBACK_ERROR 1084 /* Read of the data Tx reg */ + /* didn't return value written */ +#define XST_IIC_DRR_READBACK_ERROR 1085 /* Read of the data Receive reg */ + /* didn't return value written */ +#define XST_IIC_ADR_READBACK_ERROR 1086 /* Read of the data Tx reg */ + /* didn't return value written */ +#define XST_IIC_TBA_READBACK_ERROR 1087 /* Read of the 10 bit addr reg */ + /* didn't return written value */ +#define XST_IIC_NOT_SLAVE 1088 /* The device isn't a slave */ + +/*********************** ATMC statuses 1101 - 1125 ***************************/ + +#define XST_ATMC_ERROR_COUNT_MAX 1101L /* the error counters in the ATM + controller hit the max value + which requires the statistics + to be cleared */ + +/*********************** Flash statuses 1126 - 1150 **************************/ + +#define XST_FLASH_BUSY 1126L /* Flash is erasing or programming + */ +#define XST_FLASH_READY 1127L /* Flash is ready for commands */ +#define XST_FLASH_ERROR 1128L /* Flash had detected an internal + error. Use XFlash_DeviceControl + to retrieve device specific codes + */ +#define XST_FLASH_ERASE_SUSPENDED 1129L /* Flash is in suspended erase state + */ +#define XST_FLASH_WRITE_SUSPENDED 1130L /* Flash is in suspended write state + */ +#define XST_FLASH_PART_NOT_SUPPORTED 1131L /* Flash type not supported by + driver */ +#define XST_FLASH_NOT_SUPPORTED 1132L /* Operation not supported */ +#define XST_FLASH_TOO_MANY_REGIONS 1133L /* Too many erase regions */ +#define XST_FLASH_TIMEOUT_ERROR 1134L /* Programming or erase operation + aborted due to a timeout */ +#define XST_FLASH_ADDRESS_ERROR 1135L /* Accessed flash outside its + addressible range */ +#define XST_FLASH_ALIGNMENT_ERROR 1136L /* Write alignment error */ +#define XST_FLASH_BLOCKING_CALL_ERROR 1137L /* Couldn't return immediately from + write/erase function with + XFL_NON_BLOCKING_WRITE/ERASE + option cleared */ +#define XST_FLASH_CFI_QUERY_ERROR 1138L /* Failed to query the device */ + +/*********************** SPI statuses 1151 - 1175 ****************************/ + +#define XST_SPI_MODE_FAULT 1151 /* master was selected as slave */ +#define XST_SPI_TRANSFER_DONE 1152 /* data transfer is complete */ +#define XST_SPI_TRANSMIT_UNDERRUN 1153 /* slave underruns transmit register */ +#define XST_SPI_RECEIVE_OVERRUN 1154 /* device overruns receive register */ +#define XST_SPI_NO_SLAVE 1155 /* no slave has been selected yet */ +#define XST_SPI_TOO_MANY_SLAVES 1156 /* more than one slave is being + * selected */ +#define XST_SPI_NOT_MASTER 1157 /* operation is valid only as master */ +#define XST_SPI_SLAVE_ONLY 1158 /* device is configured as slave-only + */ +#define XST_SPI_SLAVE_MODE_FAULT 1159 /* slave was selected while disabled */ +#define XST_SPI_SLAVE_MODE 1160 /* device has been addressed as slave */ +#define XST_SPI_RECEIVE_NOT_EMPTY 1161 /* device received data in slave mode */ + +#define XST_SPI_COMMAND_ERROR 1162 /* unrecognised command - qspi only */ + +/********************** OPB Arbiter statuses 1176 - 1200 *********************/ + +#define XST_OPBARB_INVALID_PRIORITY 1176 /* the priority registers have either + * one master assigned to two or more + * priorities, or one master not + * assigned to any priority + */ +#define XST_OPBARB_NOT_SUSPENDED 1177 /* an attempt was made to modify the + * priority levels without first + * suspending the use of priority + * levels + */ +#define XST_OPBARB_PARK_NOT_ENABLED 1178 /* bus parking by id was enabled but + * bus parking was not enabled + */ +#define XST_OPBARB_NOT_FIXED_PRIORITY 1179 /* the arbiter must be in fixed + * priority mode to allow the + * priorities to be changed + */ + +/************************ Intc statuses 1201 - 1225 **************************/ + +#define XST_INTC_FAIL_SELFTEST 1201 /* self test failed */ +#define XST_INTC_CONNECT_ERROR 1202 /* interrupt already in use */ + +/********************** TmrCtr statuses 1226 - 1250 **************************/ + +#define XST_TMRCTR_TIMER_FAILED 1226 /* self test failed */ + +/********************** WdtTb statuses 1251 - 1275 ***************************/ + +#define XST_WDTTB_TIMER_FAILED 1251L + +/********************** PlbArb statuses 1276 - 1300 **************************/ + +#define XST_PLBARB_FAIL_SELFTEST 1276L + +/********************** Plb2Opb statuses 1301 - 1325 *************************/ + +#define XST_PLB2OPB_FAIL_SELFTEST 1301L + +/********************** Opb2Plb statuses 1326 - 1350 *************************/ + +#define XST_OPB2PLB_FAIL_SELFTEST 1326L + +/********************** SysAce statuses 1351 - 1360 **************************/ + +#define XST_SYSACE_NO_LOCK 1351L /* No MPU lock has been granted */ + +/********************** PCI Bridge statuses 1361 - 1375 **********************/ + +#define XST_PCI_INVALID_ADDRESS 1361L + +/********************** FlexRay constants 1400 - 1409 *************************/ + +#define XST_FR_TX_ERROR 1400 +#define XST_FR_TX_BUSY 1401 +#define XST_FR_BUF_LOCKED 1402 +#define XST_FR_NO_BUF 1403 + +/****************** USB constants 1410 - 1420 *******************************/ + +#define XST_USB_ALREADY_CONFIGURED 1410 +#define XST_USB_BUF_ALIGN_ERROR 1411 +#define XST_USB_NO_DESC_AVAILABLE 1412 +#define XST_USB_BUF_TOO_BIG 1413 +#define XST_USB_NO_BUF 1414 + +/****************** HWICAP constants 1421 - 1429 *****************************/ + +#define XST_HWICAP_WRITE_DONE 1421 + + +/****************** AXI VDMA constants 1430 - 1440 *****************************/ + +#define XST_VDMA_MISMATCH_ERROR 1430 + +/*********************** NAND Flash statuses 1441 - 1459 *********************/ + +#define XST_NAND_BUSY 1441L /* Flash is erasing or + * programming + */ +#define XST_NAND_READY 1442L /* Flash is ready for commands + */ +#define XST_NAND_ERROR 1443L /* Flash had detected an + * internal error. + */ +#define XST_NAND_PART_NOT_SUPPORTED 1444L /* Flash type not supported by + * driver + */ +#define XST_NAND_OPT_NOT_SUPPORTED 1445L /* Operation not supported + */ +#define XST_NAND_TIMEOUT_ERROR 1446L /* Programming or erase + * operation aborted due to a + * timeout + */ +#define XST_NAND_ADDRESS_ERROR 1447L /* Accessed flash outside its + * addressible range + */ +#define XST_NAND_ALIGNMENT_ERROR 1448L /* Write alignment error + */ +#define XST_NAND_PARAM_PAGE_ERROR 1449L /* Failed to read parameter + * page of the device + */ +#define XST_NAND_CACHE_ERROR 1450L /* Flash page buffer error + */ + +#define XST_NAND_WRITE_PROTECTED 1451L /* Flash is write protected + */ + +/**************************** Type Definitions *******************************/ + +typedef int XStatus; + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtime_l.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtime_l.h new file mode 100755 index 000000000..e6550d3ce --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtime_l.h @@ -0,0 +1,96 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xtime_l.h +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- --------------------------------------------------- +* 1.00a rp/sdm 11/03/09 Initial release. +* 3.06a sgd 05/15/12 Upadted get/set time functions to make use Global Timer +* 3.06a asa 06/17/12 Reverted back the changes to make use Global Timer. +* 3.07a sgd 07/05/12 Upadted get/set time functions to make use Global Timer +* </pre> +* +* @note None. +* +******************************************************************************/ + +#ifndef XTIME_H /* prevent circular inclusions */ +#define XTIME_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xparameters.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +typedef unsigned long long XTime; + +/************************** Constant Definitions *****************************/ +#define GLOBAL_TMR_BASEADDR XPAR_GLOBAL_TMR_BASEADDR +#define GTIMER_COUNTER_LOWER_OFFSET 0x00 +#define GTIMER_COUNTER_UPPER_OFFSET 0x04 +#define GTIMER_CONTROL_OFFSET 0x08 + + +/* Global Timer is always clocked at half of the CPU frequency */ +#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ /2) +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void XTime_SetTime(XTime Xtime); +void XTime_GetTime(XTime *Xtime); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XTIME_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr.h new file mode 100755 index 000000000..3ae480077 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr.h @@ -0,0 +1,309 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr.h +* +* The Xilinx timer/counter component. This component supports the Xilinx +* timer/counter. More detailed description of the driver operation can +* be found in the xtmrctr.c file. +* +* The Xilinx timer/counter supports the following features: +* - Polled mode. +* - Interrupt driven mode +* - enabling and disabling specific timers +* - PWM operation +* - Cascade Operation (This is to be used for getting a 64 bit timer and this +* feature is present in the latest versions of the axi_timer IP) +* +* The driver does not currently support the PWM operation of the device. +* +* The timer counter operates in 2 primary modes, compare and capture. In +* either mode, the timer counter may count up or down, with up being the +* default. +* +* Compare mode is typically used for creating a single time period or multiple +* repeating time periods in the auto reload mode, such as a periodic interrupt. +* When started, the timer counter loads an initial value, referred to as the +* compare value, into the timer counter and starts counting down or up. The +* timer counter expires when it rolls over/under depending upon the mode of +* counting. An external compare output signal may be configured such that a +* pulse is generated with this signal when it hits the compare value. +* +* Capture mode is typically used for measuring the time period between +* external events. This mode uses an external capture input signal to cause +* the value of the timer counter to be captured. When started, the timer +* counter loads an initial value, referred to as the compare value, + +* The timer can be configured to either cause an interrupt when the count +* reaches the compare value in compare mode or latch the current count +* value in the capture register when an external input is asserted +* in capture mode. The external capture input can be enabled/disabled using the +* XTmrCtr_SetOptions function. While in compare mode, it is also possible to +* drive an external output when the compare value is reached in the count +* register The external compare output can be enabled/disabled using the +* XTmrCtr_SetOptions function. +* +* <b>Interrupts</b> +* +* It is the responsibility of the application to connect the interrupt +* handler of the timer/counter to the interrupt source. The interrupt +* handler function, XTmrCtr_InterruptHandler, is visible such that the user +* can connect it to the interrupt source. Note that this interrupt handler +* does not provide interrupt context save and restore processing, the user +* must perform this processing. +* +* The driver services interrupts and passes timeouts to the upper layer +* software through callback functions. The upper layer software must register +* its callback functions during initialization. The driver requires callback +* functions for timers. +* +* @note +* The default settings for the timers are: +* - Interrupt generation disabled +* - Count up mode +* - Compare mode +* - Hold counter (will not reload the timer) +* - External compare output disabled +* - External capture input disabled +* - Pulse width modulation disabled +* - Timer disabled, waits for Start function to be called +* <br><br> +* A timer counter device may contain multiple timer counters. The symbol +* XTC_DEVICE_TIMER_COUNT defines the number of timer counters in the device. +* The device currently contains 2 timer counters. +* <br><br> +* This driver is intended to be RTOS and processor independent. It works with +* physical addresses only. Any needs for dynamic memory management, threads +* or thread mutual exclusion, virtual memory, or cache control must be +* satisfied by the layer above this driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 08/16/01 First release +* 1.00b jhl 02/21/02 Repartitioned the driver for smaller files +* 1.10b mta 03/21/07 Updated to new coding style. +* 1.11a sdm 08/22/08 Removed support for static interrupt handlers from the MDD +* file +* 2.00a ktn 10/30/09 Updated to use HAL API's. _m is removed from all the macro +* definitions. +* 2.01a ktn 07/12/10 Renamed the macro XTimerCtr_ReadReg as XTmrCtr_ReadReg +* for naming consistency (CR 559142). +* 2.02a sdm 09/28/10 Updated the driver tcl to generate the xparameters +* for the timer clock frequency (CR 572679). +* 2.03a rvo 11/30/10 Added check to see if interrupt is enabled before further +* processing for CR 584557. +* 2.04a sdm 07/12/11 Added support for cascade mode operation. +* The cascade mode of operation is present in the latest +* versions of the axi_timer IP. Please check the HW +* Datasheet to see whether this feature is present in the +* version of the IP that you are using. +* 2.05a adk 15/05/13 Fixed the CR:693066 +* Added the IsStartedTmrCtr0/IsStartedTmrCtr1 members to the +* XTmrCtr instance structure. +* The IsStartedTmrCtrX will be assigned XIL_COMPONENT_IS_STARTED in +* the XTmrCtr_Start function. +* The IsStartedTmrCtrX will be cleared in the XTmrCtr_Stop function. +* There will be no Initialization done in the +* XTmrCtr_Initialize if both the timers have already started and +* the XST_DEVICE_IS_STARTED Status is returned. +* Removed the logic in the XTmrCtr_Initialize function +* which was checking the Register Value to know whether +* a timer has started or not. +* </pre> +* +******************************************************************************/ + +#ifndef XTMRCTR_H /* prevent circular inclusions */ +#define XTMRCTR_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xtmrctr_l.h" + +/************************** Constant Definitions *****************************/ + +/** + * @name Configuration options + * These options are used in XTmrCtr_SetOptions() and XTmrCtr_GetOptions() + * @{ + */ +/** + * Used to configure the timer counter device. + * <pre> + * XTC_CASCADE_MODE_OPTION Enables the Cascade Mode only valid for TCSRO. + * XTC_ENABLE_ALL_OPTION Enables all timer counters at once. + * XTC_DOWN_COUNT_OPTION Configures the timer counter to count down from + * start value, the default is to count up. + * XTC_CAPTURE_MODE_OPTION Configures the timer to capture the timer + * counter value when the external capture line is + * asserted. The default mode is compare mode. + * XTC_INT_MODE_OPTION Enables the timer counter interrupt output. + * XTC_AUTO_RELOAD_OPTION In compare mode, configures the timer counter to + * reload from the compare value. The default mode + * causes the timer counter to hold when the + * compare value is hit. + * In capture mode, configures the timer counter to + * not hold the previous capture value if a new + * event occurs. The default mode cause the timer + * counter to hold the capture value until + * recognized. + * XTC_EXT_COMPARE_OPTION Enables the external compare output signal. + * </pre> + */ +#define XTC_CASCADE_MODE_OPTION 0x00000080UL +#define XTC_ENABLE_ALL_OPTION 0x00000040UL +#define XTC_DOWN_COUNT_OPTION 0x00000020UL +#define XTC_CAPTURE_MODE_OPTION 0x00000010UL +#define XTC_INT_MODE_OPTION 0x00000008UL +#define XTC_AUTO_RELOAD_OPTION 0x00000004UL +#define XTC_EXT_COMPARE_OPTION 0x00000002UL +/*@}*/ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress;/**< Register base address */ +} XTmrCtr_Config; + +/** + * Signature for the callback function. + * + * @param CallBackRef is a callback reference passed in by the upper layer + * when setting the callback functions, and passed back to the + * upper layer when the callback is invoked. Its type is + * unimportant to the driver, so it is a void pointer. + * @param TmrCtrNumber is the number of the timer/counter within the + * device. The device typically contains at least two + * timer/counters. The timer number is a zero based number with a + * range of 0 to (XTC_DEVICE_TIMER_COUNT - 1). + */ +typedef void (*XTmrCtr_Handler) (void *CallBackRef, u8 TmrCtrNumber); + + +/** + * Timer/Counter statistics + */ +typedef struct { + u32 Interrupts; /**< The number of interrupts that have occurred */ +} XTmrCtrStats; + +/** + * The XTmrCtr driver instance data. The user is required to allocate a + * variable of this type for every timer/counter device in the system. A + * pointer to a variable of this type is then passed to the driver API + * functions. + */ +typedef struct { + XTmrCtrStats Stats; /**< Component Statistics */ + u32 BaseAddress; /**< Base address of registers */ + u32 IsReady; /**< Device is initialized and ready */ + u32 IsStartedTmrCtr0; /**< Is Timer Counter 0 started */ + u32 IsStartedTmrCtr1; /**< Is Timer Counter 1 started */ + + XTmrCtr_Handler Handler; /**< Callback function */ + void *CallBackRef; /**< Callback reference for handler */ +} XTmrCtr; + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/* + * Required functions, in file xtmrctr.c + */ +int XTmrCtr_Initialize(XTmrCtr * InstancePtr, u16 DeviceId); +void XTmrCtr_Start(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +void XTmrCtr_Stop(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +u32 XTmrCtr_GetValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +void XTmrCtr_SetResetValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber, + u32 ResetValue); +u32 XTmrCtr_GetCaptureValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +int XTmrCtr_IsExpired(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +void XTmrCtr_Reset(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +XTmrCtr_Config *XTmrCtr_LookupConfig(u16 DeviceId); + +/* + * Functions for options, in file xtmrctr_options.c + */ +void XTmrCtr_SetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber, u32 Options); +u32 XTmrCtr_GetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber); + +/* + * Functions for statistics, in file xtmrctr_stats.c + */ +void XTmrCtr_GetStats(XTmrCtr * InstancePtr, XTmrCtrStats * StatsPtr); +void XTmrCtr_ClearStats(XTmrCtr * InstancePtr); + +/* + * Functions for self-test, in file xtmrctr_selftest.c + */ +int XTmrCtr_SelfTest(XTmrCtr * InstancePtr, u8 TmrCtrNumber); + +/* + * Functions for interrupts, in file xtmrctr_intr.c + */ +void XTmrCtr_SetHandler(XTmrCtr * InstancePtr, XTmrCtr_Handler FuncPtr, + void *CallBackRef); +void XTmrCtr_InterruptHandler(void *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr_i.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr_i.h new file mode 100755 index 000000000..bcdb900d3 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr_i.h @@ -0,0 +1,88 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_i.h +* +* This file contains data which is shared between files internal to the +* XTmrCtr component. It is intended for internal use only. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 02/06/02 First release +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 _m is removed from all the macro definitions. +* </pre> +* +******************************************************************************/ + +#ifndef XTMRCTR_I_H /* prevent circular inclusions */ +#define XTMRCTR_I_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + +extern XTmrCtr_Config XTmrCtr_ConfigTable[]; + +extern u8 XTmrCtr_Offsets[]; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr_l.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr_l.h new file mode 100755 index 000000000..f92652035 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xtmrctr_l.h @@ -0,0 +1,435 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_l.h +* +* This header file contains identifiers and low-level driver functions (or +* macros) that can be used to access the device. The user should refer to the +* hardware device specification for more details of the device operation. +* High-level driver functions are defined in xtmrctr.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 04/24/02 First release +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 Updated to use HAL API's. _m is removed from all the macro +* definitions. +* 2.01a ktn 07/12/10 Renamed the macro XTimerCtr_ReadReg as XTmrCtr_ReadReg +* for naming consistency (CR 559142). +* 2.04a sdm 07/12/11 Added the CASC mode bit in the TCSRO register for the +* cascade mode operation. +* The cascade mode of operation is present in the latest +* versions of the axi_timer IP. Please check the HW +* Datasheet to see whether this feature is present in the +* version of the IP that you are using. +* </pre> +* +******************************************************************************/ + +#ifndef XTMRCTR_L_H /* prevent circular inclusions */ +#define XTMRCTR_L_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** + * Defines the number of timer counters within a single hardware device. This + * number is not currently parameterized in the hardware but may be in the + * future. + */ +#define XTC_DEVICE_TIMER_COUNT 2 + +/* Each timer counter consumes 16 bytes of address space */ + +#define XTC_TIMER_COUNTER_OFFSET 16 + +/** @name Register Offset Definitions + * Register offsets within a timer counter, there are multiple + * timer counters within a single device + * @{ + */ + +#define XTC_TCSR_OFFSET 0 /**< Control/Status register */ +#define XTC_TLR_OFFSET 4 /**< Load register */ +#define XTC_TCR_OFFSET 8 /**< Timer counter register */ + +/* @} */ + +/** @name Control Status Register Bit Definitions + * Control Status Register bit masks + * Used to configure the timer counter device. + * @{ + */ + +#define XTC_CSR_CASC_MASK 0x00000800 /**< Cascade Mode */ +#define XTC_CSR_ENABLE_ALL_MASK 0x00000400 /**< Enables all timer + counters */ +#define XTC_CSR_ENABLE_PWM_MASK 0x00000200 /**< Enables the Pulse Width + Modulation */ +#define XTC_CSR_INT_OCCURED_MASK 0x00000100 /**< If bit is set, an + interrupt has occured. + If set and '1' is + written to this bit + position, bit is + cleared. */ +#define XTC_CSR_ENABLE_TMR_MASK 0x00000080 /**< Enables only the + specific timer */ +#define XTC_CSR_ENABLE_INT_MASK 0x00000040 /**< Enables the interrupt + output. */ +#define XTC_CSR_LOAD_MASK 0x00000020 /**< Loads the timer using + the load value provided + earlier in the Load + Register, + XTC_TLR_OFFSET. */ +#define XTC_CSR_AUTO_RELOAD_MASK 0x00000010 /**< In compare mode, + configures + the timer counter to + reload from the + Load Register. The + default mode + causes the timer counter + to hold when the compare + value is hit. In capture + mode, configures the + timer counter to not + hold the previous + capture value if a new + event occurs. The + default mode cause the + timer counter to hold + the capture value until + recognized. */ +#define XTC_CSR_EXT_CAPTURE_MASK 0x00000008 /**< Enables the + external input + to the timer counter. */ +#define XTC_CSR_EXT_GENERATE_MASK 0x00000004 /**< Enables the + external generate output + for the timer. */ +#define XTC_CSR_DOWN_COUNT_MASK 0x00000002 /**< Configures the timer + counter to count down + from start value, the + default is to count + up.*/ +#define XTC_CSR_CAPTURE_MODE_MASK 0x00000001 /**< Enables the timer to + capture the timer + counter value when the + external capture line is + asserted. The default + mode is compare mode.*/ +/* @} */ + +/**************************** Type Definitions *******************************/ + +extern u8 XTmrCtr_Offsets[]; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** +* Read one of the timer counter registers. +* +* @param BaseAddress contains the base address of the timer counter +* device. +* @param TmrCtrNumber contains the specific timer counter within the +* device, a zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param RegOffset contains the offset from the 1st register of the timer +* counter to select the specific register of the timer counter. +* +* @return The value read from the register, a 32 bit value. +* +* @note C-Style signature: +* u32 XTmrCtr_ReadReg(u32 BaseAddress, u8 TimerNumber, + unsigned RegOffset); +******************************************************************************/ +#define XTmrCtr_ReadReg(BaseAddress, TmrCtrNumber, RegOffset) \ + Xil_In32((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + \ + (RegOffset)) + +#ifndef XTimerCtr_ReadReg +#define XTimerCtr_ReadReg XTmrCtr_ReadReg +#endif + +/*****************************************************************************/ +/** +* Write a specified value to a register of a timer counter. +* +* @param BaseAddress is the base address of the timer counter device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param RegOffset contain the offset from the 1st register of the timer +* counter to select the specific register of the timer counter. +* @param ValueToWrite is the 32 bit value to be written to the register. +* +* @note C-Style signature: +* void XTmrCtr_WriteReg(u32 BaseAddress, u8 TimerNumber, +* unsigned RegOffset, u32 ValueToWrite); +******************************************************************************/ +#define XTmrCtr_WriteReg(BaseAddress, TmrCtrNumber, RegOffset, ValueToWrite)\ + Xil_Out32(((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + \ + (RegOffset)), (ValueToWrite)) + +/****************************************************************************/ +/** +* +* Set the Control Status Register of a timer counter to the specified value. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param RegisterValue is the 32 bit value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_SetControlStatusReg(u32 BaseAddress, +* u8 TmrCtrNumber,u32 RegisterValue); +*****************************************************************************/ +#define XTmrCtr_SetControlStatusReg(BaseAddress, TmrCtrNumber, RegisterValue)\ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the Control Status Register of a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, +* a zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return The value read from the register, a 32 bit value. +* +* @note C-Style signature: +* u32 XTmrCtr_GetControlStatusReg(u32 BaseAddress, +* u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_GetControlStatusReg(BaseAddress, TmrCtrNumber) \ + XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET) + +/****************************************************************************/ +/** +* +* Get the Timer Counter Register of a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, +* a zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return The value read from the register, a 32 bit value. +* +* @note C-Style signature: +* u32 XTmrCtr_GetTimerCounterReg(u32 BaseAddress, +* u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_GetTimerCounterReg(BaseAddress, TmrCtrNumber) \ + XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), XTC_TCR_OFFSET) \ + +/****************************************************************************/ +/** +* +* Set the Load Register of a timer counter to the specified value. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param RegisterValue is the 32 bit value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_SetLoadReg(u32 BaseAddress, u8 TmrCtrNumber, +* u32 RegisterValue); +*****************************************************************************/ +#define XTmrCtr_SetLoadReg(BaseAddress, TmrCtrNumber, RegisterValue) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TLR_OFFSET, \ + (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the Load Register of a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return The value read from the register, a 32 bit value. +* +* @note C-Style signature: +* u32 XTmrCtr_GetLoadReg(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_GetLoadReg(BaseAddress, TmrCtrNumber) \ +XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), XTC_TLR_OFFSET) + +/****************************************************************************/ +/** +* +* Enable a timer counter such that it starts running. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_Enable(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_Enable(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), ( TmrCtrNumber), \ + XTC_TCSR_OFFSET) | XTC_CSR_ENABLE_TMR_MASK)) + +/****************************************************************************/ +/** +* +* Disable a timer counter such that it stops running. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, +* a zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_Disable(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_Disable(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber),\ + XTC_TCSR_OFFSET) & ~ XTC_CSR_ENABLE_TMR_MASK)) + +/****************************************************************************/ +/** +* +* Enable the interrupt for a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_EnableIntr(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_EnableIntr(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), \ + XTC_TCSR_OFFSET) | XTC_CSR_ENABLE_INT_MASK)) + +/****************************************************************************/ +/** +* +* Disable the interrupt for a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_DisableIntr(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_DisableIntr(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), \ + XTC_TCSR_OFFSET) & ~ XTC_CSR_ENABLE_INT_MASK)) + +/****************************************************************************/ +/** +* +* Cause the timer counter to load it's Timer Counter Register with the value +* in the Load Register. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_LoadTimerCounterReg(u32 BaseAddress, + u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_LoadTimerCounterReg(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber),\ + XTC_TCSR_OFFSET) | XTC_CSR_LOAD_MASK)) + +/****************************************************************************/ +/** +* +* Determine if a timer counter event has occurred. Events are defined to be +* when a capture has occurred or the counter has roller over. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @note C-Style signature: +* int XTmrCtr_HasEventOccurred(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_HasEventOccurred(BaseAddress, TmrCtrNumber) \ + ((XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), \ + XTC_TCSR_OFFSET) & XTC_CSR_INT_OCCURED_MASK) == \ + XTC_CSR_INT_OCCURED_MASK) + +/************************** Function Prototypes ******************************/ +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xuartps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xuartps.h new file mode 100755 index 000000000..4a538044c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xuartps.h @@ -0,0 +1,511 @@ +/***************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps.h +* +* This driver supports the following features: +* +* - Dynamic data format (baud rate, data bits, stop bits, parity) +* - Polled mode +* - Interrupt driven mode +* - Transmit and receive FIFOs (32 byte FIFO depth) +* - Access to the external modem control lines +* +* <b>Initialization & Configuration</b> +* +* The XUartPs_Config structure is used by the driver to configure itself. +* Fields inside this structure are properties of XUartPs based on its hardware +* build. +* +* To support multiple runtime loading and initialization strategies employed +* by various operating systems, the driver instance can be initialized in the +* following way: +* +* - XUartPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a +* configuration structure provided by the caller. If running in a system +* with address translation, the parameter EffectiveAddr should be the +* virtual address. +* +* <b>Baud Rate</b> +* +* The UART has an internal baud rate generator, which furnishes the baud rate +* clock for both the receiver and the transmitter. Ther input clock frequency +* can be either the master clock or the master clock divided by 8, configured +* through the mode register. +* +* Accompanied with the baud rate divider register, the baud rate is determined +* by: +* <pre> +* baud_rate = input_clock / (bgen * (bdiv + 1) +* </pre> +* where bgen is the value of the baud rate generator, and bdiv is the value of +* baud rate divider. +* +* <b>Interrupts</b> +* +* The FIFOs are not flushed when the driver is initialized, but a function is +* provided to allow the user to reset the FIFOs if desired. +* +* The driver defaults to no interrupts at initialization such that interrupts +* must be enabled if desired. An interrupt is generated for one of the +* following conditions. +* +* - A change in the modem signals +* - Data in the receive FIFO for a configuable time without receiver activity +* - A parity error +* - A framing error +* - An overrun error +* - Transmit FIFO is full +* - Transmit FIFO is empty +* - Receive FIFO is full +* - Receive FIFO is empty +* - Data in the receive FIFO equal to the receive threshold +* +* The application can control which interrupts are enabled using the +* XUartPs_SetInterruptMask() function. +* +* In order to use interrupts, it is necessary for the user to connect the +* driver interrupt handler, XUartPs_InterruptHandler(), to the interrupt +* system of the application. A separate handler should be provided by the +* application to communicate with the interrupt system, and conduct +* application specific interrupt handling. An application registers its own +* handler through the XUartPs_SetHandler() function. +* +* <b>Data Transfer</b> +* +* The functions, XUartPs_Send() and XUartPs_Recv(), are provided in the +* driver to allow data to be sent and received. They can be used in either +* polled or interrupt mode. +* +* @note +* +* The default configuration for the UART after initialization is: +* +* - 9,600 bps or XPAR_DFT_BAUDRATE if defined +* - 8 data bits +* - 1 stop bit +* - no parity +* - FIFO's are enabled with a receive threshold of 8 bytes +* - The RX timeout is enabled with a timeout of 1 (4 char times) +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00a drg/jz 01/12/10 First Release +* 1.00a sdm 09/27/11 Fixed compiler warnings and also a bug +* in XUartPs_SetFlowDelay where the value was not +* being written to the register. +* 1.01a sdm 12/20/11 Removed the InputClockHz parameter from the XUartPs +* instance structure and the driver is updated to use +* InputClockHz parameter from the XUartPs_Config config +* structure. +* Added a parameter to XUartPs_Config structure which +* specifies whether the user has selected Modem pins +* to be connected to MIO or FMIO. +* Added the tcl file to generate the xparameters.h +* 1.02a sg 05/16/12 Changed XUARTPS_RXWM_MASK to 0x3F for CR 652540 fix. +* 1.03a sg 07/16/12 Updated XUARTPS_FORMAT_7_BITS and XUARTPS_FORMAT_6_BITS +* with the correct values for CR 666724 +* Added defines for XUARTPS_IXR_TOVR, XUARTPS_IXR_TNFUL +* and XUARTPS_IXR_TTRIG. +* Modified the name of these defines +* XUARTPS_MEDEMSR_DCDX to XUARTPS_MODEMSR_DDCD +* XUARTPS_MEDEMSR_RIX to XUARTPS_MODEMSR_TERI +* XUARTPS_MEDEMSR_DSRX to XUARTPS_MODEMSR_DDSR +* XUARTPS_MEDEMSR_CTSX to XUARTPS_MODEMSR_DCTS +* 1.05a hk 08/22/13 Added API for uart reset and related +* constant definitions. +* +* </pre> +* +*****************************************************************************/ + +#ifndef XUARTPS_H /* prevent circular inclusions */ +#define XUARTPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xuartps_hw.h" + +/************************** Constant Definitions ****************************/ + +/* + * The following constants indicate the max and min baud rates and these + * numbers are based only on the testing that has been done. The hardware + * is capable of other baud rates. + */ +#define XUARTPS_MAX_RATE 921600 +#define XUARTPS_MIN_RATE 110 + +#define XUARTPS_DFT_BAUDRATE 115200 /* Default baud rate */ + +/** @name Configuration options + * @{ + */ +/** + * These constants specify the options that may be set or retrieved + * with the driver, each is a unique bit mask such that multiple options + * may be specified. These constants indicate the available options + * in active state. + * + */ + +#define XUARTPS_OPTION_SET_BREAK 0x0080 /**< Starts break transmission */ +#define XUARTPS_OPTION_STOP_BREAK 0x0040 /**< Stops break transmission */ +#define XUARTPS_OPTION_RESET_TMOUT 0x0020 /**< Reset the receive timeout */ +#define XUARTPS_OPTION_RESET_TX 0x0010 /**< Reset the transmitter */ +#define XUARTPS_OPTION_RESET_RX 0x0008 /**< Reset the receiver */ +#define XUARTPS_OPTION_ASSERT_RTS 0x0004 /**< Assert the RTS bit */ +#define XUARTPS_OPTION_ASSERT_DTR 0x0002 /**< Assert the DTR bit */ +#define XUARTPS_OPTION_SET_FCM 0x0001 /**< Turn on flow control mode */ +/*@}*/ + + +/** @name Channel Operational Mode + * + * The UART can operate in one of four modes: Normal, Local Loopback, Remote + * Loopback, or automatic echo. + * + * @{ + */ + +#define XUARTPS_OPER_MODE_NORMAL 0x00 /**< Normal Mode */ +#define XUARTPS_OPER_MODE_AUTO_ECHO 0x01 /**< Auto Echo Mode */ +#define XUARTPS_OPER_MODE_LOCAL_LOOP 0x02 /**< Local Loopback Mode */ +#define XUARTPS_OPER_MODE_REMOTE_LOOP 0x03 /**< Remote Loopback Mode */ + +/* @} */ + +/** @name Data format values + * + * These constants specify the data format that the driver supports. + * The data format includes the number of data bits, the number of stop + * bits and parity. + * + * @{ + */ +#define XUARTPS_FORMAT_8_BITS 0 /**< 8 data bits */ +#define XUARTPS_FORMAT_7_BITS 2 /**< 7 data bits */ +#define XUARTPS_FORMAT_6_BITS 3 /**< 6 data bits */ + +#define XUARTPS_FORMAT_NO_PARITY 4 /**< No parity */ +#define XUARTPS_FORMAT_MARK_PARITY 3 /**< Mark parity */ +#define XUARTPS_FORMAT_SPACE_PARITY 2 /**< parity */ +#define XUARTPS_FORMAT_ODD_PARITY 1 /**< Odd parity */ +#define XUARTPS_FORMAT_EVEN_PARITY 0 /**< Even parity */ + +#define XUARTPS_FORMAT_2_STOP_BIT 2 /**< 2 stop bits */ +#define XUARTPS_FORMAT_1_5_STOP_BIT 1 /**< 1.5 stop bits */ +#define XUARTPS_FORMAT_1_STOP_BIT 0 /**< 1 stop bit */ +/*@}*/ + +/** @name Callback events + * + * These constants specify the handler events that an application can handle + * using its specific handler function. Note that these constants are not bit + * mask, so only one event can be passed to an application at a time. + * + * @{ + */ +#define XUARTPS_EVENT_RECV_DATA 1 /**< Data receiving done */ +#define XUARTPS_EVENT_RECV_TOUT 2 /**< A receive timeout occurred */ +#define XUARTPS_EVENT_SENT_DATA 3 /**< Data transmission done */ +#define XUARTPS_EVENT_RECV_ERROR 4 /**< A receive error detected */ +#define XUARTPS_EVENT_MODEM 5 /**< Modem status changed */ +/*@}*/ + + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Base address of device (IPIF) */ + u32 InputClockHz;/**< Input clock frequency */ + int ModemPinsConnected; /** Specifies whether modem pins are connected + * to MIO or FMIO */ +} XUartPs_Config; + +/* + * Keep track of state information about a data buffer in the interrupt mode. + */ +typedef struct { + u8 *NextBytePtr; + unsigned int RequestedBytes; + unsigned int RemainingBytes; +} XUartPsBuffer; + +/** + * Keep track of data format setting of a device. + */ +typedef struct { + u32 BaudRate; /**< In bps, ie 1200 */ + u32 DataBits; /**< Number of data bits */ + u32 Parity; /**< Parity */ + u8 StopBits; /**< Number of stop bits */ +} XUartPsFormat; + +/******************************************************************************/ +/** + * This data type defines a handler that an application defines to communicate + * with interrupt system to retrieve state information about an application. + * + * @param CallBackRef is a callback reference passed in by the upper layer + * when setting the handler, and is passed back to the upper layer + * when the handler is called. It is used to find the device driver + * instance. + * @param Event contains one of the event constants indicating events that + * have occurred. + * @param EventData contains the number of bytes sent or received at the + * time of the call for send and receive events and contains the + * modem status for modem events. + * + ******************************************************************************/ +typedef void (*XUartPs_Handler) (void *CallBackRef, u32 Event, + unsigned int EventData); + +/** + * The XUartPs driver instance data structure. A pointer to an instance data + * structure is passed around by functions to refer to a specific driver + * instance. + */ +typedef struct { + XUartPs_Config Config; /* Configuration data structure */ + u32 InputClockHz; /* Input clock frequency */ + u32 IsReady; /* Device is initialized and ready */ + u32 BaudRate; /* Current baud rate */ + + XUartPsBuffer SendBuffer; + XUartPsBuffer ReceiveBuffer; + + XUartPs_Handler Handler; + void *CallBackRef; /* Callback reference for event handler */ +} XUartPs; + + +/***************** Macros (Inline Functions) Definitions ********************/ + +/****************************************************************************/ +/** +* Get the UART Channel Status Register. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u16 XUartPs_GetChannelStatus(XUartPs *InstancePtr) +* +******************************************************************************/ +#define XUartPs_GetChannelStatus(InstancePtr) \ + Xil_In32(((InstancePtr)->Config.BaseAddress) + XUARTPS_SR_OFFSET) + +/****************************************************************************/ +/** +* Get the UART Mode Control Register. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u32 XUartPs_GetControl(XUartPs *InstancePtr) +* +******************************************************************************/ +#define XUartPs_GetModeControl(InstancePtr) \ + Xil_In32(((InstancePtr)->Config.BaseAddress) + XUARTPS_CR_OFFSET) + +/****************************************************************************/ +/** +* Set the UART Mode Control Register. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XUartPs_SetModeControl(XUartPs *InstancePtr, u16 RegisterValue) +* +******************************************************************************/ +#define XUartPs_SetModeControl(InstancePtr, RegisterValue) \ + Xil_Out32(((InstancePtr)->Config.BaseAddress) + XUARTPS_CR_OFFSET, \ + (RegisterValue)) + +/****************************************************************************/ +/** +* Enable the transmitter and receiver of the UART. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XUartPs_EnableUart(XUartPs *InstancePtr) +* +******************************************************************************/ +#define XUartPs_EnableUart(InstancePtr) \ + Xil_Out32(((InstancePtr)->Config.BaseAddress + XUARTPS_CR_OFFSET), \ + ((Xil_In32((InstancePtr)->Config.BaseAddress + XUARTPS_CR_OFFSET) & \ + ~XUARTPS_CR_EN_DIS_MASK) | (XUARTPS_CR_RX_EN | XUARTPS_CR_TX_EN))) + +/****************************************************************************/ +/** +* Disable the transmitter and receiver of the UART. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XUartPs_DisableUart(XUartPs *InstancePtr) +* +******************************************************************************/ +#define XUartPs_DisableUart(InstancePtr) \ + Xil_Out32(((InstancePtr)->Config.BaseAddress + XUARTPS_CR_OFFSET), \ + (((Xil_In32((InstancePtr)->Config.BaseAddress + XUARTPS_CR_OFFSET)) & \ + ~XUARTPS_CR_EN_DIS_MASK) | (XUARTPS_CR_RX_DIS | XUARTPS_CR_TX_DIS))) + +/****************************************************************************/ +/** +* Determine if the transmitter FIFO is empty. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return +* - TRUE if a byte can be sent +* - FALSE if the Transmitter Fifo is not empty +* +* @note C-Style signature: +* u32 XUartPs_IsTransmitEmpty(XUartPs InstancePtr) +* +******************************************************************************/ +#define XUartPs_IsTransmitEmpty(InstancePtr) \ + ((Xil_In32(((InstancePtr)->Config.BaseAddress) + XUARTPS_SR_OFFSET) & \ + XUARTPS_SR_TXEMPTY) == XUARTPS_SR_TXEMPTY) + + +/************************** Function Prototypes *****************************/ + +/* + * Static lookup function implemented in xuartps_sinit.c + */ +XUartPs_Config *XUartPs_LookupConfig(u16 DeviceId); + +/* + * Interface functions implemented in xuartps.c + */ +int XUartPs_CfgInitialize(XUartPs *InstancePtr, + XUartPs_Config * Config, u32 EffectiveAddr); + +unsigned int XUartPs_Send(XUartPs *InstancePtr, u8 *BufferPtr, + unsigned int NumBytes); + +unsigned int XUartPs_Recv(XUartPs *InstancePtr, u8 *BufferPtr, + unsigned int NumBytes); + +int XUartPs_SetBaudRate(XUartPs *InstancePtr, u32 BaudRate); + +/* + * Options functions in xuartps_options.c + */ +void XUartPs_SetOptions(XUartPs *InstancePtr, u16 Options); + +u16 XUartPs_GetOptions(XUartPs *InstancePtr); + +void XUartPs_SetFifoThreshold(XUartPs *InstancePtr, u8 TriggerLevel); + +u8 XUartPs_GetFifoThreshold(XUartPs *InstancePtr); + +u16 XUartPs_GetModemStatus(XUartPs *InstancePtr); + +u32 XUartPs_IsSending(XUartPs *InstancePtr); + +u8 XUartPs_GetOperMode(XUartPs *InstancePtr); + +void XUartPs_SetOperMode(XUartPs *InstancePtr, u8 OperationMode); + +u8 XUartPs_GetFlowDelay(XUartPs *InstancePtr); + +void XUartPs_SetFlowDelay(XUartPs *InstancePtr, u8 FlowDelayValue); + +u8 XUartPs_GetRecvTimeout(XUartPs *InstancePtr); + +void XUartPs_SetRecvTimeout(XUartPs *InstancePtr, u8 RecvTimeout); + +int XUartPs_SetDataFormat(XUartPs *InstancePtr, XUartPsFormat * Format); +void XUartPs_GetDataFormat(XUartPs *InstancePtr, XUartPsFormat * Format); + +/* + * interrupt functions in xuartps_intr.c + */ +u32 XUartPs_GetInterruptMask(XUartPs *InstancePtr); + +void XUartPs_SetInterruptMask(XUartPs *InstancePtr, u32 Mask); + +void XUartPs_InterruptHandler(XUartPs *InstancePtr); + +void XUartPs_SetHandler(XUartPs *InstancePtr, XUartPs_Handler FuncPtr, + void *CallBackRef); + +/* + * self-test functions in xuartps_selftest.c + */ +int XUartPs_SelfTest(XUartPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xuartps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xuartps_hw.h new file mode 100755 index 000000000..768e38027 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xuartps_hw.h @@ -0,0 +1,432 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xuartps_hw.h +* +* This header file contains the hardware interface of an XUartPs device. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00 drg/jz 01/12/10 First Release +* 1.03a sg 09/04/12 Added defines for XUARTPS_IXR_TOVR, XUARTPS_IXR_TNFUL +* and XUARTPS_IXR_TTRIG. +* Modified the names of these defines +* XUARTPS_MEDEMSR_DCDX to XUARTPS_MODEMSR_DDCD +* XUARTPS_MEDEMSR_RIX to XUARTPS_MODEMSR_TERI +* XUARTPS_MEDEMSR_DSRX to XUARTPS_MODEMSR_DDSR +* XUARTPS_MEDEMSR_CTSX to XUARTPS_MODEMSR_DCTS +* 1.05a hk 08/22/13 Added prototype for uart reset and related +* constant definitions. +* +* </pre> +* +******************************************************************************/ +#ifndef XUARTPS_HW_H /* prevent circular inclusions */ +#define XUARTPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * + * Register offsets for the UART. + * @{ + */ +#define XUARTPS_CR_OFFSET 0x00 /**< Control Register [8:0] */ +#define XUARTPS_MR_OFFSET 0x04 /**< Mode Register [9:0] */ +#define XUARTPS_IER_OFFSET 0x08 /**< Interrupt Enable [12:0] */ +#define XUARTPS_IDR_OFFSET 0x0C /**< Interrupt Disable [12:0] */ +#define XUARTPS_IMR_OFFSET 0x10 /**< Interrupt Mask [12:0] */ +#define XUARTPS_ISR_OFFSET 0x14 /**< Interrupt Status [12:0]*/ +#define XUARTPS_BAUDGEN_OFFSET 0x18 /**< Baud Rate Generator [15:0] */ +#define XUARTPS_RXTOUT_OFFSET 0x1C /**< RX Timeout [7:0] */ +#define XUARTPS_RXWM_OFFSET 0x20 /**< RX FIFO Trigger Level [5:0] */ +#define XUARTPS_MODEMCR_OFFSET 0x24 /**< Modem Control [5:0] */ +#define XUARTPS_MODEMSR_OFFSET 0x28 /**< Modem Status [8:0] */ +#define XUARTPS_SR_OFFSET 0x2C /**< Channel Status [14:0] */ +#define XUARTPS_FIFO_OFFSET 0x30 /**< FIFO [7:0] */ +#define XUARTPS_BAUDDIV_OFFSET 0x34 /**< Baud Rate Divider [7:0] */ +#define XUARTPS_FLOWDEL_OFFSET 0x38 /**< Flow Delay [5:0] */ +#define XUARTPS_TXWM_OFFSET 0x44 /**< TX FIFO Trigger Level [5:0] */ +/* @} */ + +/** @name Control Register + * + * The Control register (CR) controls the major functions of the device. + * + * Control Register Bit Definition + */ + +#define XUARTPS_CR_STOPBRK 0x00000100 /**< Stop transmission of break */ +#define XUARTPS_CR_STARTBRK 0x00000080 /**< Set break */ +#define XUARTPS_CR_TORST 0x00000040 /**< RX timeout counter restart */ +#define XUARTPS_CR_TX_DIS 0x00000020 /**< TX disabled. */ +#define XUARTPS_CR_TX_EN 0x00000010 /**< TX enabled */ +#define XUARTPS_CR_RX_DIS 0x00000008 /**< RX disabled. */ +#define XUARTPS_CR_RX_EN 0x00000004 /**< RX enabled */ +#define XUARTPS_CR_EN_DIS_MASK 0x0000003C /**< Enable/disable Mask */ +#define XUARTPS_CR_TXRST 0x00000002 /**< TX logic reset */ +#define XUARTPS_CR_RXRST 0x00000001 /**< RX logic reset */ +/* @}*/ + + +/** @name Mode Register + * + * The mode register (MR) defines the mode of transfer as well as the data + * format. If this register is modified during transmission or reception, + * data validity cannot be guaranteed. + * + * Mode Register Bit Definition + * @{ + */ +#define XUARTPS_MR_CCLK 0x00000400 /**< Input clock selection */ +#define XUARTPS_MR_CHMODE_R_LOOP 0x00000300 /**< Remote loopback mode */ +#define XUARTPS_MR_CHMODE_L_LOOP 0x00000200 /**< Local loopback mode */ +#define XUARTPS_MR_CHMODE_ECHO 0x00000100 /**< Auto echo mode */ +#define XUARTPS_MR_CHMODE_NORM 0x00000000 /**< Normal mode */ +#define XUARTPS_MR_CHMODE_SHIFT 8 /**< Mode shift */ +#define XUARTPS_MR_CHMODE_MASK 0x00000300 /**< Mode mask */ +#define XUARTPS_MR_STOPMODE_2_BIT 0x00000080 /**< 2 stop bits */ +#define XUARTPS_MR_STOPMODE_1_5_BIT 0x00000040 /**< 1.5 stop bits */ +#define XUARTPS_MR_STOPMODE_1_BIT 0x00000000 /**< 1 stop bit */ +#define XUARTPS_MR_STOPMODE_SHIFT 6 /**< Stop bits shift */ +#define XUARTPS_MR_STOPMODE_MASK 0x000000A0 /**< Stop bits mask */ +#define XUARTPS_MR_PARITY_NONE 0x00000020 /**< No parity mode */ +#define XUARTPS_MR_PARITY_MARK 0x00000018 /**< Mark parity mode */ +#define XUARTPS_MR_PARITY_SPACE 0x00000010 /**< Space parity mode */ +#define XUARTPS_MR_PARITY_ODD 0x00000008 /**< Odd parity mode */ +#define XUARTPS_MR_PARITY_EVEN 0x00000000 /**< Even parity mode */ +#define XUARTPS_MR_PARITY_SHIFT 3 /**< Parity setting shift */ +#define XUARTPS_MR_PARITY_MASK 0x00000038 /**< Parity mask */ +#define XUARTPS_MR_CHARLEN_6_BIT 0x00000006 /**< 6 bits data */ +#define XUARTPS_MR_CHARLEN_7_BIT 0x00000004 /**< 7 bits data */ +#define XUARTPS_MR_CHARLEN_8_BIT 0x00000000 /**< 8 bits data */ +#define XUARTPS_MR_CHARLEN_SHIFT 1 /**< Data Length shift */ +#define XUARTPS_MR_CHARLEN_MASK 0x00000006 /**< Data length mask */ +#define XUARTPS_MR_CLKSEL 0x00000001 /**< Input clock selection */ +/* @} */ + + +/** @name Interrupt Registers + * + * Interrupt control logic uses the interrupt enable register (IER) and the + * interrupt disable register (IDR) to set the value of the bits in the + * interrupt mask register (IMR). The IMR determines whether to pass an + * interrupt to the interrupt status register (ISR). + * Writing a 1 to IER Enbables an interrupt, writing a 1 to IDR disables an + * interrupt. IMR and ISR are read only, and IER and IDR are write only. + * Reading either IER or IDR returns 0x00. + * + * All four registers have the same bit definitions. + * + * @{ + */ +#define XUARTPS_IXR_TOVR 0x00001000 /**< Tx FIFO Overflow interrupt */ +#define XUARTPS_IXR_TNFUL 0x00000800 /**< Tx FIFO Nearly Full interrupt */ +#define XUARTPS_IXR_TTRIG 0x00000400 /**< Tx Trig interrupt */ +#define XUARTPS_IXR_DMS 0x00000200 /**< Modem status change interrupt */ +#define XUARTPS_IXR_TOUT 0x00000100 /**< Timeout error interrupt */ +#define XUARTPS_IXR_PARITY 0x00000080 /**< Parity error interrupt */ +#define XUARTPS_IXR_FRAMING 0x00000040 /**< Framing error interrupt */ +#define XUARTPS_IXR_OVER 0x00000020 /**< Overrun error interrupt */ +#define XUARTPS_IXR_TXFULL 0x00000010 /**< TX FIFO full interrupt. */ +#define XUARTPS_IXR_TXEMPTY 0x00000008 /**< TX FIFO empty interrupt. */ +#define XUARTPS_IXR_RXFULL 0x00000004 /**< RX FIFO full interrupt. */ +#define XUARTPS_IXR_RXEMPTY 0x00000002 /**< RX FIFO empty interrupt. */ +#define XUARTPS_IXR_RXOVR 0x00000001 /**< RX FIFO trigger interrupt. */ +#define XUARTPS_IXR_MASK 0x00001FFF /**< Valid bit mask */ +/* @} */ + + +/** @name Baud Rate Generator Register + * + * The baud rate generator control register (BRGR) is a 16 bit register that + * controls the receiver bit sample clock and baud rate. + * Valid values are 1 - 65535. + * + * Bit Sample Rate = CCLK / BRGR, where the CCLK is selected by the MR_CCLK bit + * in the MR register. + * @{ + */ +#define XUARTPS_BAUDGEN_DISABLE 0x00000000 /**< Disable clock */ +#define XUARTPS_BAUDGEN_MASK 0x0000FFFF /**< Valid bits mask */ +#define XUARTPS_BAUDGEN_RESET_VAL 0x0000028B /**< Reset value */ + +/** @name Baud Divisor Rate register + * + * The baud rate divider register (BDIV) controls how much the bit sample + * rate is divided by. It sets the baud rate. + * Valid values are 0x04 to 0xFF. Writing a value less than 4 will be ignored. + * + * Baud rate = CCLK / ((BAUDDIV + 1) x BRGR), where the CCLK is selected by + * the MR_CCLK bit in the MR register. + * @{ + */ +#define XUARTPS_BAUDDIV_MASK 0x000000FF /**< 8 bit baud divider mask */ +#define XUARTPS_BAUDDIV_RESET_VAL 0x0000000F /**< Reset value */ +/* @} */ + + +/** @name Receiver Timeout Register + * + * Use the receiver timeout register (RTR) to detect an idle condition on + * the receiver data line. + * + * @{ + */ +#define XUARTPS_RXTOUT_DISABLE 0x00000000 /**< Disable time out */ +#define XUARTPS_RXTOUT_MASK 0x000000FF /**< Valid bits mask */ + +/** @name Receiver FIFO Trigger Level Register + * + * Use the Receiver FIFO Trigger Level Register (RTRIG) to set the value at + * which the RX FIFO triggers an interrupt event. + * @{ + */ + +#define XUARTPS_RXWM_DISABLE 0x00000000 /**< Disable RX trigger interrupt */ +#define XUARTPS_RXWM_MASK 0x0000003F /**< Valid bits mask */ +#define XUARTPS_RXWM_RESET_VAL 0x00000020 /**< Reset value */ +/* @} */ + +/** @name Transmit FIFO Trigger Level Register + * + * Use the Transmit FIFO Trigger Level Register (TTRIG) to set the value at + * which the TX FIFO triggers an interrupt event. + * @{ + */ + +#define XUARTPS_TXWM_MASK 0x0000003F /**< Valid bits mask */ +#define XUARTPS_TXWM_RESET_VAL 0x00000020 /**< Reset value */ +/* @} */ + +/** @name Modem Control Register + * + * This register (MODEMCR) controls the interface with the modem or data set, + * or a peripheral device emulating a modem. + * + * @{ + */ +#define XUARTPS_MODEMCR_FCM 0x00000010 /**< Flow control mode */ +#define XUARTPS_MODEMCR_RTS 0x00000002 /**< Request to send */ +#define XUARTPS_MODEMCR_DTR 0x00000001 /**< Data terminal ready */ +/* @} */ + +/** @name Modem Status Register + * + * This register (MODEMSR) indicates the current state of the control lines + * from a modem, or another peripheral device, to the CPU. In addition, four + * bits of the modem status register provide change information. These bits + * are set to a logic 1 whenever a control input from the modem changes state. + * + * Note: Whenever the DCTS, DDSR, TERI, or DDCD bit is set to logic 1, a modem + * status interrupt is generated and this is reflected in the modem status + * register. + * + * @{ + */ +#define XUARTPS_MODEMSR_FCMS 0x00000100 /**< Flow control mode (FCMS) */ +#define XUARTPS_MODEMSR_DCD 0x00000080 /**< Complement of DCD input */ +#define XUARTPS_MODEMSR_RI 0x00000040 /**< Complement of RI input */ +#define XUARTPS_MODEMSR_DSR 0x00000020 /**< Complement of DSR input */ +#define XUARTPS_MODEMSR_CTS 0x00000010 /**< Complement of CTS input */ +#define XUARTPS_MODEMSR_DDCD 0x00000008 /**< Delta DCD indicator */ +#define XUARTPS_MODEMSR_TERI 0x00000004 /**< Trailing Edge Ring Indicator */ +#define XUARTPS_MODEMSR_DDSR 0x00000002 /**< Change of DSR */ +#define XUARTPS_MODEMSR_DCTS 0x00000001 /**< Change of CTS */ +/* @} */ + +/** @name Channel Status Register + * + * The channel status register (CSR) is provided to enable the control logic + * to monitor the status of bits in the channel interrupt status register, + * even if these are masked out by the interrupt mask register. + * + * @{ + */ +#define XUARTPS_SR_TNFUL 0x00004000 /**< TX FIFO Nearly Full Status */ +#define XUARTPS_SR_TTRIG 0x00002000 /**< TX FIFO Trigger Status */ +#define XUARTPS_SR_FLOWDEL 0x00001000 /**< RX FIFO fill over flow delay */ +#define XUARTPS_SR_TACTIVE 0x00000800 /**< TX active */ +#define XUARTPS_SR_RACTIVE 0x00000400 /**< RX active */ +#define XUARTPS_SR_DMS 0x00000200 /**< Delta modem status change */ +#define XUARTPS_SR_TOUT 0x00000100 /**< RX timeout */ +#define XUARTPS_SR_PARITY 0x00000080 /**< RX parity error */ +#define XUARTPS_SR_FRAME 0x00000040 /**< RX frame error */ +#define XUARTPS_SR_OVER 0x00000020 /**< RX overflow error */ +#define XUARTPS_SR_TXFULL 0x00000010 /**< TX FIFO full */ +#define XUARTPS_SR_TXEMPTY 0x00000008 /**< TX FIFO empty */ +#define XUARTPS_SR_RXFULL 0x00000004 /**< RX FIFO full */ +#define XUARTPS_SR_RXEMPTY 0x00000002 /**< RX FIFO empty */ +#define XUARTPS_SR_RXOVR 0x00000001 /**< RX FIFO fill over trigger */ +/* @} */ + +/** @name Flow Delay Register + * + * Operation of the flow delay register (FLOWDEL) is very similar to the + * receive FIFO trigger register. An internal trigger signal activates when the + * FIFO is filled to the level set by this register. This trigger will not + * cause an interrupt, although it can be read through the channel status + * register. In hardware flow control mode, RTS is deactivated when the trigger + * becomes active. RTS only resets when the FIFO level is four less than the + * level of the flow delay trigger and the flow delay trigger is not activated. + * A value less than 4 disables the flow delay. + * @{ + */ +#define XUARTPS_FLOWDEL_MASK XUARTPS_RXWM_MASK /**< Valid bit mask */ +/* @} */ + + + +/* + * Defines for backwards compatabilty, will be removed + * in the next version of the driver + */ +#define XUARTPS_MEDEMSR_DCDX XUARTPS_MODEMSR_DDCD +#define XUARTPS_MEDEMSR_RIX XUARTPS_MODEMSR_TERI +#define XUARTPS_MEDEMSR_DSRX XUARTPS_MODEMSR_DDSR +#define XUARTPS_MEDEMSR_CTSX XUARTPS_MODEMSR_DCTS + + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* Read a UART register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the base address of the +* device. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u32 XUartPs_ReadReg(u32 BaseAddress, int RegOffset) +* +******************************************************************************/ +#define XUartPs_ReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/***************************************************************************/ +/** +* Write a UART register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the base address of the +* device. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XUartPs_WriteReg(u32 BaseAddress, int RegOffset, +* u16 RegisterValue) +* +******************************************************************************/ +#define XUartPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + Xil_Out32((BaseAddress) + (RegOffset), (RegisterValue)) + +/****************************************************************************/ +/** +* Determine if there is receive data in the receiver and/or FIFO. +* +* @param BaseAddress contains the base address of the device. +* +* @return TRUE if there is receive data, FALSE otherwise. +* +* @note C-Style signature: +* u32 XUartPs_IsReceiveData(u32 BaseAddress) +* +******************************************************************************/ +#define XUartPs_IsReceiveData(BaseAddress) \ + !((Xil_In32((BaseAddress) + XUARTPS_SR_OFFSET) & \ + XUARTPS_SR_RXEMPTY) == XUARTPS_SR_RXEMPTY) + +/****************************************************************************/ +/** +* Determine if a byte of data can be sent with the transmitter. +* +* @param BaseAddress contains the base address of the device. +* +* @return TRUE if the TX FIFO is full, FALSE if a byte can be put in the +* FIFO. +* +* @note C-Style signature: +* u32 XUartPs_IsTransmitFull(u32 BaseAddress) +* +******************************************************************************/ +#define XUartPs_IsTransmitFull(BaseAddress) \ + ((Xil_In32((BaseAddress) + XUARTPS_SR_OFFSET) & \ + XUARTPS_SR_TXFULL) == XUARTPS_SR_TXFULL) + +/************************** Function Prototypes ******************************/ + +void XUartPs_SendByte(u32 BaseAddress, u8 Data); + +u8 XUartPs_RecvByte(u32 BaseAddress); + +void XUartPs_ResetHw(u32 BaseAddress); + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps.h new file mode 100755 index 000000000..a4a552393 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps.h @@ -0,0 +1,1091 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps.h + * + * This file contains the implementation of the XUsbPs driver. It is the + * driver for an USB controller in DEVICE or HOST mode. + * + * <h2>Introduction</h2> + * + * The Spartan-3AF Embedded Peripheral Block contains a USB controller for + * communication with serial peripherals or hosts. The USB controller supports + * Host, Device and On the Go (OTG) applications. + * + * <h2>USB Controller Features</h2> + * + * - Supports Low Speed USB 1.1 (1.5Mbps), Full Speed USB 1.1 (12Mbps), and + * High Speed USB 2.0 (480Mbps) data speeds + * - Supports Device, Host and OTG operational modes + * - ULPI transceiver interface for USB 2.0 operation + * - Integrated USB Full and Low speed serial transceiver interfaces for lowest + * cost connections + * + * <h2>Initialization & Configuration</h2> + * + * The configuration of the USB driver happens in multiple stages: + * + * - (a) Configuration of the basic parameters: + * In this stage the basic parameters for the driver are configured, + * including the base address and the controller ID. + * + * - (b) Configuration of the DEVICE endpoints (if applicable): + * If DEVICE mode is desired, the endpoints of the controller need to be + * configured using the XUsbPs_DeviceConfig data structure. Once the + * endpoint configuration is set up in the data structure, the user needs to + * call XUsbPs_DeviceMemRequired() to obtain the required size of DMAable + * memory that the driver needs for operation with the given configuration. + * The user then needs to allocate the required amount of DMAable memory and + * finalize the configuration of the XUsbPs_DeviceConfig data structure, + * e.g. setting the DMAMemVirt and DMAMemPhys members. + * + * - (c) Configuration of the DEVICE modes: + * In the second stage the parameters for DEVICE are configured. + * The caller only needs to configure the modes that are + * actually used. Configuration is done with the: + * XUsbPs_ConfigureDevice() + * Configuration parameters are defined and passed + * into these functions using the: + * XUsbPs_DeviceConfig data structures. + * + * + * <h2>USB Device Endpoints</h2> + * + * The USB core supports up to 4 endpoints. Each endpoint has two directions, + * an OUT (RX) and an IN (TX) direction. Note that the direction is viewed from + * the host's perspective. Endpoint 0 defaults to be the control endpoint and + * does not need to be set up. Other endpoints need to be configured and set up + * depending on the application. Only endpoints that are actuelly used by the + * application need to be initialized. + * See the example code (xusbps_intr_example.c) for more information. + * + * + * <h2>Interrupt Handling</h2> + * + * The USB core uses one interrupt line to report interrupts to the CPU. + * Interrupts are handled by the driver's interrupt handler function + * XUsbPs_IntrHandler(). + * It has to be registered with the OS's interrupt subsystem. The driver's + * interrupt handler divides incoming interrupts into two categories: + * + * - General device interrupts + * - Endopint related interrupts + * + * The user (typically the adapter layer) can register general interrupt + * handler fucntions and endpoint specific interrupt handler functions with the + * driver to receive those interrupts by calling the + * XUsbPs_IntrSetHandler() + * and + * XUsbPs_EpSetHandler() + * functions respectively. Calling these functions with a NULL pointer as the + * argument for the function pointer will "clear" the handler function. + * + * The user can register one handler function for the generic interrupts and + * two handler functions for each endpoint, one for the RX (OUT) and one for + * the TX (IN) direction. For some applications it may be useful to register a + * single endpoint handler function for muliple endpoints/directions. + * + * When a callback function is called by the driver, parameters identifying the + * type of the interrupt will be passed into the handler functions. For general + * interrupts the interrupt mask will be passed into the handler function. For + * endpoint interrupts the parameters include the number of the endpoint, the + * direction (OUT/IN) and the type of the interrupt. + * + * + * <h2>Data buffer handling</h2> + * + * Data buffers are sent to and received from endpoint using the + * XUsbPs_EpBufferSend() + * and + * XUsbPs_EpBufferReceive() + * functions. + * + * User data buffer size is limited to 16 Kbytes. If the user wants to send a + * data buffer that is bigger than this limit it needs to break down the data + * buffer into multiple fragments and send the fragments individually. + * + * Data buffers can be aligned at any boundary. + * + * + * <h3>Zero copy</h3> + * + * The driver uses a zero copy mechanism which imposes certain restrictions to + * the way the user can handle the data buffers. + * + * One restriction is that the user needs to release a buffer after it is done + * processing the data in the buffer. + * + * Similarly, when the user sends a data buffer it MUST not re-use the buffer + * until it is notified by the driver that the buffer has been transmitted. The + * driver will notify the user via the registered endpoint interrupt handling + * function by sending a XUSBPS_EP_EVENT_DATA_TX event. + * + * + * <h2>DMA</h2> + * + * The driver uses DMA internally to move data from/to memory. This behaviour + * is transparent to the user. Keeping the DMA handling hidden from the user + * has the advantage that the same API can be used with USB cores that do not + * support DMA. + * + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ---------------------------------------------------------- + * 1.00a wgr 10/10/10 First release + * 1.02a wgr 05/16/12 Removed comments as they are showing up in SDK + * Tabs for CR 657898 + * 1.03a nm 09/21/12 Fixed CR#678977. Added proper sequence for setup packet + * handling. + * 1.04a nm 10/23/12 Fixed CR# 679106. + * 11/02/12 Fixed CR# 683931. Mult bits are set properly in dQH. + * </pre> + * + ******************************************************************************/ + +#ifndef XUSBPS_H +#define XUSBPS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xusbps_hw.h" +#include "xil_types.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + +/** + * @name System hang prevention Timeout counter value. + * + * This value is used throughout the code to initialize a Timeout counter that + * is used when hard polling a register. The ides is to initialize the Timeout + * counter to a value that is longer than any expected Timeout but short enough + * so the system will continue to work and report an error while the user is + * still paying attention. A reasonable Timeout time would be about 10 seconds. + * The XUSBPS_TIMEOUT_COUNTER value should be chosen so a polling loop would + * run about 10 seconds before a Timeout is detected. For example: + * + * int Timeout = XUSBPS_TIMEOUT_COUNTER; + * while ((XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + * XUSBPS_CMD_OFFSET) & + * XUSBPS_CMD_RST_MASK) && --Timeout) { + * ; + * } + * if (0 == Timeout) { + * return XST_FAILURE; + * } + * + */ +#define XUSBPS_TIMEOUT_COUNTER 1000000 + + +/** + * @name Endpoint Direction (bitmask) + * Definitions to be used with Endpoint related function that require a + * 'Direction' parameter. + * + * NOTE: + * The direction is always defined from the perspective of the HOST! This + * means that an IN endpoint on the controller is used for sending data while + * the OUT endpoint on the controller is used for receiving data. + * @{ + */ +#define XUSBPS_EP_DIRECTION_IN 0x01 /**< Endpoint direction IN. */ +#define XUSBPS_EP_DIRECTION_OUT 0x02 /**< Endpoint direction OUT. */ +/* @} */ + + +/** + * @name Endpoint Type + * Definitions to be used with Endpoint related functions that require a 'Type' + * parameter. + * @{ + */ +#define XUSBPS_EP_TYPE_NONE 0 /**< Endpoint is not used. */ +#define XUSBPS_EP_TYPE_CONTROL 1 /**< Endpoint for Control Transfers */ +#define XUSBPS_EP_TYPE_ISOCHRONOUS 2 /**< Endpoint for isochronous data */ +#define XUSBPS_EP_TYPE_BULK 3 /**< Endpoint for BULK Transfers. */ +#define XUSBPS_EP_TYPE_INTERRUPT 4 /**< Endpoint for interrupt Transfers */ +/* @} */ + +/** + * Endpoint Max Packet Length in DeviceConfig is a coded value, ch9.6.6. + * + * @{ + */ +#define ENDPOINT_MAXP_LENGTH 0x400 +#define ENDPOINT_MAXP_MULT_MASK 0xC00 +#define ENDPOINT_MAXP_MULT_SHIFT 10 +/* @} */ + +/** + * @name Field names for status retrieval + * Definitions for the XUsbPs_GetStatus() function call 'StatusType' + * parameter. + * @{ + */ +#define XUSBPS_EP_STS_ADDRESS 1 /**< Address of controller. */ +#define XUSBPS_EP_STS_CONTROLLER_STATE 2 /**< Current controller state. */ +/* @} */ + + + +/** + * @name USB Default alternate setting + * + * @{ + */ +#define XUSBPS_DEFAULT_ALT_SETTING 0 /**< The default alternate setting is 0 */ +/* @} */ + +/** + * @name Endpoint event types + * Definitions that are used to identify events that occur on endpoints. Passed + * to the endpoint event handler functions registered with + * XUsbPs_EpSetHandler(). + * @{ + */ +#define XUSBPS_EP_EVENT_SETUP_DATA_RECEIVED 0x01 + /**< Setup data has been received on the enpoint. */ +#define XUSBPS_EP_EVENT_DATA_RX 0x02 + /**< Data frame has been received on the endpoint. */ +#define XUSBPS_EP_EVENT_DATA_TX 0x03 + /**< Data frame has been sent on the endpoint. */ +/* @} */ + + +/* + * Maximum packet size for endpoint, 1024 + * @{ + */ +#define XUSBPS_MAX_PACKET_SIZE 1024 + /**< Maximum value can be put into the queue head */ +/* @} */ +/**************************** Type Definitions *******************************/ + +/****************************************************************************** + * This data type defines the callback function to be used for Endpoint + * handlers. + * + * @param CallBackRef is the Callback reference passed in by the upper + * layer when setting the handler, and is passed back to the upper + * layer when the handler is called. + * @param EpNum is the Number of the endpoint that caused the event. + * @param EventType is the type of the event that occured on the endpoint. + * @param Data is a pointer to user data pointer specified when callback + * was registered. + */ +typedef void (*XUsbPs_EpHandlerFunc)(void *CallBackRef, + u8 EpNum, u8 EventType, void *Data); + + +/****************************************************************************** + * This data type defines the callback function to be used for the general + * interrupt handler. + * + * @param CallBackRef is the Callback reference passed in by the upper + * layer when setting the handler, and is passed back to the upper + * layer when the handler is called. + * @param IrqMask is the Content of the interrupt status register. This + * value can be used by the callback function to distinguish the + * individual interrupt types. + */ +typedef void (*XUsbPs_IntrHandlerFunc)(void *CallBackRef, u32 IrqMask); + + +/******************************************************************************/ + +/* The following type definitions are used for referencing Queue Heads and + * Transfer Descriptors. The structures themselves are not used, however, the + * types are used in the API to avoid using (void *) pointers. + */ +typedef u8 XUsbPs_dQH[XUSBPS_dQH_ALIGN]; +typedef u8 XUsbPs_dTD[XUSBPS_dTD_ALIGN]; + + +/** + * The following data structures are used internally by the L0/L1 driver. + * Their contents MUST NOT be changed by the upper layers. + */ + +/** + * The following data structure represents OUT endpoint. + */ +typedef struct { + XUsbPs_dQH *dQH; + /**< Pointer to the Queue Head structure of the endpoint. */ + + XUsbPs_dTD *dTDs; + /**< Pointer to the first dTD of the dTD list for this + * endpoint. */ + + XUsbPs_dTD *dTDCurr; + /**< Buffer to the currently processed descriptor. */ + + u8 *dTDBufs; + /**< Pointer to the first buffer of the buffer list for this + * endpoint. */ + + XUsbPs_EpHandlerFunc HandlerFunc; + /**< Handler function for this endpoint. */ + void *HandlerRef; + /**< User data reference for the handler. */ +} XUsbPs_EpOut; + + +/** + * The following data structure represents IN endpoint. + */ +typedef struct { + XUsbPs_dQH *dQH; + /**< Pointer to the Queue Head structure of the endpoint. */ + + XUsbPs_dTD *dTDs; + /**< List of pointers to the Transfer Descriptors of the + * endpoint. */ + + XUsbPs_dTD *dTDHead; + /**< Buffer to the next available descriptor in the list. */ + + XUsbPs_dTD *dTDTail; + /**< Buffer to the last unsent descriptor in the list*/ + + XUsbPs_EpHandlerFunc HandlerFunc; + /**< Handler function for this endpoint. */ + void *HandlerRef; + /**< User data reference for the handler. */ +} XUsbPs_EpIn; + + +/** + * The following data structure represents an endpoint used internally + * by the L0/L1 driver. + */ +typedef struct { + /* Each endpoint has an OUT and an IN component. + */ + XUsbPs_EpOut Out; /**< OUT endpoint structure */ + XUsbPs_EpIn In; /**< IN endpoint structure */ +} XUsbPs_Endpoint; + + + +/** + * The following structure is used by the user to receive Setup Data from an + * endpoint. Using this structure simplifies the process of interpreting the + * setup data in the core's data fields. + * + * The naming scheme for the members of this structure is different from the + * naming scheme found elsewhere in the code. The members of this structure are + * defined in the Chapter 9 USB reference guide. Using this naming scheme makes + * it easier for people familiar with the standard to read the code. + */ +typedef struct { + u8 bmRequestType; /**< bmRequestType in setup data */ + u8 bRequest; /**< bRequest in setup data */ + u16 wValue; /**< wValue in setup data */ + u16 wIndex; /**< wIndex in setup data */ + u16 wLength; /**< wLength in setup data */ +} +XUsbPs_SetupData; + + +/** + * Data structures used to configure endpoints. + */ +typedef struct { + u32 Type; + /**< Endpoint type: + - XUSBPS_EP_TYPE_CONTROL + - XUSBPS_EP_TYPE_ISOCHRONOUS + - XUSBPS_EP_TYPE_BULK + - XUSBPS_EP_TYPE_INTERRUPT */ + + u32 NumBufs; + /**< Number of buffers to be handled by this endpoint. */ + u32 BufSize; + /**< Buffer size. Only relevant for OUT (receive) Endpoints. */ + + u16 MaxPacketSize; + /**< Maximum packet size for this endpoint. This number will + * define the maximum number of bytes sent on the wire per + * transaction. Range: 0..1024 */ +} XUsbPs_EpSetup; + + +/** + * Endpoint configuration structure. + */ +typedef struct { + XUsbPs_EpSetup Out; /**< OUT component of endpoint. */ + XUsbPs_EpSetup In; /**< IN component of endpoint. */ +} XUsbPs_EpConfig; + + +/** + * The XUsbPs_DeviceConfig structure contains the configuration information to + * configure the USB controller for DEVICE mode. This data structure is used + * with the XUsbPs_ConfigureDevice() function call. + */ +typedef struct { + u8 NumEndpoints; /**< Number of Endpoints for the controller. + This number depends on the runtime + configuration of driver. The driver may + configure fewer endpoints than are available + in the core. */ + + XUsbPs_EpConfig EpCfg[XUSBPS_MAX_ENDPOINTS]; + /**< List of endpoint configurations. */ + + u32 DMAMemVirt; /**< Virtual base address of DMAable memory + allocated for the driver. */ + + u32 DMAMemPhys; /**< Physical base address of DMAable memory + allocated for the driver. */ + + /* The following members are used internally by the L0/L1 driver. They + * MUST NOT be accesses and/or modified in any way by the upper layers. + * + * The reason for having these members is that we generally try to + * avoid allocating memory in the L0/L1 driver as we want to be OS + * independent. In order to avoid allocating memory for this data + * structure wihin L0/L1 we put it into the XUsbPs_DeviceConfig + * structure which is allocated by the caller. + */ + XUsbPs_Endpoint Ep[XUSBPS_MAX_ENDPOINTS]; + /**< List of endpoint metadata structures. */ + + u32 PhysAligned; /**< 64 byte aligned base address of the DMA + memory block. Will be computed and set by + the L0/L1 driver. */ +} XUsbPs_DeviceConfig; + + +/** + * The XUsbPs_Config structure contains configuration information for the USB + * controller. + * + * This structure only contains the basic configuration for the controller. The + * caller also needs to initialize the controller for the DEVICE mode + * using the XUsbPs_DeviceConfig data structures with the + * XUsbPs_ConfigureDevice() function call + */ +typedef struct { + u16 DeviceID; /**< Unique ID of controller. */ + u32 BaseAddress; /**< Core register base address. */ +} XUsbPs_Config; + + +/** + * The XUsbPs driver instance data. The user is required to allocate a + * variable of this type for every USB controller in the system. A pointer to a + * variable of this type is then passed to the driver API functions. + */ +typedef struct { + XUsbPs_Config Config; /**< Configuration structure */ + + int CurrentAltSetting; /**< Current alternative setting of interface */ + + void *UserDataPtr; /**< Data pointer to be used by upper layers to + store application dependent data structures. + The upper layers are responsible to allocated + and free the memory. The driver will not + mofidy this data pointer. */ + + /** + * The following structures hold the configuration for DEVICE mode + * of the controller. They are initialized using the + * XUsbPs_ConfigureDevice() function call. + */ + XUsbPs_DeviceConfig DeviceConfig; + /**< Configuration for the DEVICE mode. */ + + XUsbPs_IntrHandlerFunc HandlerFunc; + /**< Handler function for the controller. */ + void *HandlerRef; + /**< User data reference for the handler. */ + u32 HandlerMask; + /**< User interrupt mask. Defines which interrupts will cause + * the callback to be called. */ +} XUsbPs; + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************** + * + * USB CONTROLLER RELATED MACROS + * + ******************************************************************************/ +/*****************************************************************************/ +/** + * This macro returns the current frame number. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * + * @return The current frame number. + * + * @note C-style signature: + * u32 XUsbPs_GetFrameNum(const XUsbPs *InstancePtr) + * + ******************************************************************************/ +#define XUsbPs_GetFrameNum(InstancePtr) \ + XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, XUSBPS_FRAME_OFFSET) + + +/*****************************************************************************/ +/** + * This macro starts the USB engine. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * + * @note C-style signature: + * void XUsbPs_Start(XUsbPs *InstancePtr) + * + ******************************************************************************/ +#define XUsbPs_Start(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_CMD_OFFSET, XUSBPS_CMD_RS_MASK) + + +/*****************************************************************************/ +/** + * This macro stops the USB engine. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * + * @note C-style signature: + * void XUsbPs_Stop(XUsbPs *InstancePtr) + * + ******************************************************************************/ +#define XUsbPs_Stop(InstancePtr) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_CMD_OFFSET, XUSBPS_CMD_RS_MASK) + + +/*****************************************************************************/ +/** + * This macro forces the USB engine to be in Full Speed (FS) mode. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * + * @note C-style signature: + * void XUsbPs_ForceFS(XUsbPs *InstancePtr) + * + ******************************************************************************/ +#define XUsbPs_ForceFS(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_PORTSCR1_OFFSET, \ + XUSBPS_PORTSCR_PFSC_MASK) + + +/*****************************************************************************/ +/** + * This macro starts the USB Timer 0, with repeat option for period of + * one second. + * + * @param InstancePtr is a pointer to XUsbPs instance of the controller. + * @param Interval is the interval for Timer0 to generate an interrupt + * + * @note C-style signature: + * void XUsbPs_StartTimer0(XUsbPs *InstancePtr, u32 Interval) + * + ******************************************************************************/ +#define XUsbPs_StartTimer0(InstancePtr, Interval) \ +{ \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_TIMER0_LD_OFFSET, (Interval)); \ + XUsbPs_SetBits(InstancePtr, XUSBPS_TIMER0_CTL_OFFSET, \ + XUSBPS_TIMER_RUN_MASK | \ + XUSBPS_TIMER_RESET_MASK | \ + XUSBPS_TIMER_REPEAT_MASK); \ +} \ + + +/*****************************************************************************/ +/** +* This macro stops Timer 0. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_StopTimer0(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_StopTimer0(InstancePtr) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_TIMER0_CTL_OFFSET, \ + XUSBPS_TIMER_RUN_MASK) + + +/*****************************************************************************/ +/** +* This macro reads Timer 0. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_ReadTimer0(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_ReadTimer0(InstancePtr) \ + XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_TIMER0_CTL_OFFSET) & \ + XUSBPS_TIMER_COUNTER_MASK + + +/*****************************************************************************/ +/** +* This macro force remote wakeup on host +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_RemoteWakeup(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_RemoteWakeup(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_PORTSCR1_OFFSET, \ + XUSBPS_PORTSCR_FPR_MASK) + + +/****************************************************************************** + * + * ENDPOINT RELATED MACROS + * + ******************************************************************************/ +/*****************************************************************************/ +/** +* This macro enables the given endpoint for the given direction. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is number of the endpoint to enable. +* @param Dir is direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpEnable(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpEnable(InstancePtr, EpNum, Dir) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_EPCRn_OFFSET(EpNum), \ + ((Dir) & XUSBPS_EP_DIRECTION_OUT ? XUSBPS_EPCR_RXE_MASK : 0) | \ + ((Dir) & XUSBPS_EP_DIRECTION_IN ? XUSBPS_EPCR_TXE_MASK : 0)) + + +/*****************************************************************************/ +/** +* This macro disables the given endpoint for the given direction. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is the number of the endpoint to disable. +* @param Dir is the direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpDisable(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpDisable(InstancePtr, EpNum, Dir) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_EPCRn_OFFSET(EpNum), \ + ((Dir) & XUSBPS_EP_DIRECTION_OUT ? XUSBPS_EPCR_RXE_MASK : 0) | \ + ((Dir) & XUSBPS_EP_DIRECTION_IN ? XUSBPS_EPCR_TXE_MASK : 0)) + + +/*****************************************************************************/ +/** +* This macro stalls the given endpoint for the given direction, and flush +* the buffers. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is number of the endpoint to stall. +* @param Dir is the direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpStall(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpStall(InstancePtr, EpNum, Dir) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_EPCRn_OFFSET(EpNum), \ + ((Dir) & XUSBPS_EP_DIRECTION_OUT ? XUSBPS_EPCR_RXS_MASK : 0) | \ + ((Dir) & XUSBPS_EP_DIRECTION_IN ? XUSBPS_EPCR_TXS_MASK : 0)) + + +/*****************************************************************************/ +/** +* This macro unstalls the given endpoint for the given direction. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is the Number of the endpoint to unstall. +* @param Dir is the Direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpUnStall(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpUnStall(InstancePtr, EpNum, Dir) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_EPCRn_OFFSET(EpNum), \ + ((Dir) & XUSBPS_EP_DIRECTION_OUT ? XUSBPS_EPCR_RXS_MASK : 0) | \ + ((Dir) & XUSBPS_EP_DIRECTION_IN ? XUSBPS_EPCR_TXS_MASK : 0)) + + +/*****************************************************************************/ +/** +* This macro flush an endpoint upon interface disable +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is the number of the endpoint to flush. +* @param Dir is the direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpFlush(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpFlush(InstancePtr, EpNum, Dir) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_EPFLUSH_OFFSET, \ + EpNum << ((Dir) & XUSBPS_EP_DIRECTION_OUT ? \ + XUSBPS_EPFLUSH_RX_SHIFT:XUSBPS_EPFLUSH_TX_SHIFT)) \ + +/*****************************************************************************/ +/** +* This macro enables the interrupts defined by the bit mask. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param IntrMask is the Bit mask of interrupts to be enabled. +* +* @note C-style signature: +* void XUsbPs_IntrEnable(XUsbPs *InstancePtr, u32 IntrMask) +* +******************************************************************************/ +#define XUsbPs_IntrEnable(InstancePtr, IntrMask) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_IER_OFFSET, IntrMask) + + +/*****************************************************************************/ +/** +* This function disables the interrupts defined by the bit mask. +* +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param IntrMask is a Bit mask of interrupts to be disabled. +* +* @note C-style signature: +* void XUsbPs_IntrDisable(XUsbPs *InstancePtr, u32 IntrMask) +* +******************************************************************************/ +#define XUsbPs_IntrDisable(InstancePtr, IntrMask) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_IER_OFFSET, IntrMask) + + +/*****************************************************************************/ +/** +* This macro enables the endpoint NAK interrupts defined by the bit mask. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param NakIntrMask is the Bit mask of endpoint NAK interrupts to be +* enabled. +* @note C-style signature: +* void XUsbPs_NakIntrEnable(XUsbPs *InstancePtr, u32 NakIntrMask) +* +******************************************************************************/ +#define XUsbPs_NakIntrEnable(InstancePtr, NakIntrMask) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_EPNAKIER_OFFSET, NakIntrMask) + + +/*****************************************************************************/ +/** +* This macro disables the endpoint NAK interrupts defined by the bit mask. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param NakIntrMask is a Bit mask of endpoint NAK interrupts to be +* disabled. +* +* @note +* C-style signature: +* void XUsbPs_NakIntrDisable(XUsbPs *InstancePtr, u32 NakIntrMask) +* +******************************************************************************/ +#define XUsbPs_NakIntrDisable(InstancePtr, NakIntrMask) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_EPNAKIER_OFFSET, NakIntrMask) + + +/*****************************************************************************/ +/** +* This function clears the endpoint NAK interrupts status defined by the +* bit mask. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param NakIntrMask is the Bit mask of endpoint NAK interrupts to be cleared. +* +* @note C-style signature: +* void XUsbPs_NakIntrClear(XUsbPs *InstancePtr, u32 NakIntrMask) +* +******************************************************************************/ +#define XUsbPs_NakIntrClear(InstancePtr, NakIntrMask) \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_EPNAKISR_OFFSET, NakIntrMask) + + + +/*****************************************************************************/ +/** +* This macro sets the Interrupt Threshold value in the control register +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param Threshold is the Interrupt threshold to be set. +* Allowed values: +* - XUSBPS_CMD_ITHRESHOLD_0 - Immediate interrupt +* - XUSBPS_CMD_ITHRESHOLD_1 - 1 Frame +* - XUSBPS_CMD_ITHRESHOLD_2 - 2 Frames +* - XUSBPS_CMD_ITHRESHOLD_4 - 4 Frames +* - XUSBPS_CMD_ITHRESHOLD_8 - 8 Frames +* - XUSBPS_CMD_ITHRESHOLD_16 - 16 Frames +* - XUSBPS_CMD_ITHRESHOLD_32 - 32 Frames +* - XUSBPS_CMD_ITHRESHOLD_64 - 64 Frames +* +* @note +* C-style signature: +* void XUsbPs_SetIntrThreshold(XUsbPs *InstancePtr, u8 Threshold) +* +******************************************************************************/ +#define XUsbPs_SetIntrThreshold(InstancePtr, Threshold) \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_CMD_OFFSET, (Threshold))\ + + +/*****************************************************************************/ +/** +* This macro sets the Tripwire bit in the USB command register. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_SetTripwire(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_SetTripwire(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_CMD_OFFSET, \ + XUSBPS_CMD_ATDTW_MASK) + + +/*****************************************************************************/ +/** +* This macro clears the Tripwire bit in the USB command register. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_ClrTripwire(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_ClrTripwire(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_CMD_OFFSET, \ + XUSBPS_CMD_ATDTW_MASK) + + +/*****************************************************************************/ +/** +* This macro checks if the Tripwire bit in the USB command register is set. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @return +* - TRUE: The tripwire bit is still set. +* - FALSE: The tripwire bit has been cleared. +* +* @note C-style signature: +* int XUsbPs_TripwireIsSet(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_TripwireIsSet(InstancePtr) \ + (XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_CMD_OFFSET) & \ + XUSBPS_CMD_ATDTW_MASK ? TRUE : FALSE) + + +/****************************************************************************** +* +* GENERAL REGISTER / BIT MANIPULATION MACROS +* +******************************************************************************/ +/****************************************************************************/ +/** +* This macro sets the given bit mask in the register. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param RegOffset is the register offset to be written. +* @param Bits is the Bits to be set in the register +* +* @return None. +* +* @note C-style signature: +* void XUsbPs_SetBits(u32 BaseAddress, u32 RegOffset, u32 Bits) +* +*****************************************************************************/ +#define XUsbPs_SetBits(InstancePtr, RegOffset, Bits) \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, RegOffset, \ + XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + RegOffset) | (Bits)); + + +/****************************************************************************/ +/** +* +* This macro clears the given bits in the register. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param RegOffset is the register offset to be written. +* @param Bits are the bits to be cleared in the register +* +* @return None. +* +* @note +* C-style signature: +* void XUsbPs_ClrBits(u32 BaseAddress, u32 RegOffset, u32 Bits) +* +*****************************************************************************/ +#define XUsbPs_ClrBits(InstancePtr, RegOffset, Bits) \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, RegOffset, \ + XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + RegOffset) & ~(Bits)); + + +/************************** Function Prototypes ******************************/ + +/** + * Setup / Initialize functions. + * + * Implemented in file xusbps.c + */ +int XUsbPs_CfgInitialize(XUsbPs *InstancePtr, + const XUsbPs_Config *ConfigPtr, u32 BaseAddress); + +int XUsbPs_ConfigureDevice(XUsbPs *InstancePtr, + const XUsbPs_DeviceConfig *CfgPtr); +u32 XUsbPs_DeviceMemRequired(const XUsbPs_DeviceConfig *CfgPtr); + +/** + * Common functions used for DEVICE/HOST mode. + */ +int XUsbPs_Reset(XUsbPs *InstancePtr); + +/** + * DEVICE mode specific functions. + */ +int XUsbPs_BusReset(XUsbPs *InstancePtr); +u32 XUsbPs_DeviceMemRequired(const XUsbPs_DeviceConfig *CfgPtr); +int XUsbPs_SetDeviceAddress(XUsbPs *InstancePtr, u8 Address); + + +/** + * Handling Suspend and Resume. + * + * Implemented in xusbps.c + */ +int XUsbPs_Suspend(const XUsbPs *InstancePtr); +int XUsbPs_Resume(const XUsbPs *InstancePtr); +int XUsbPs_RequestHostResume(const XUsbPs *InstancePtr); + + +/* + * Functions for managing Endpoints / Transfers + * + * Implemented in file xusbps_endpoint.c + */ +int XUsbPs_EpBufferSend(XUsbPs *InstancePtr, u8 EpNum, + const u8 *BufferPtr, u32 BufferLen); +int XUsbPs_EpBufferReceive(XUsbPs *InstancePtr, u8 EpNum, + u8 **BufferPtr, u32 *BufferLenPtr, u32 *Handle); +void XUsbPs_EpBufferRelease(u32 Handle); + +int XUsbPs_EpSetHandler(XUsbPs *InstancePtr, u8 EpNum, u8 Direction, + XUsbPs_EpHandlerFunc CallBackFunc, + void *CallBackRef); +int XUsbPs_EpGetSetupData(XUsbPs *InstancePtr, int EpNum, + XUsbPs_SetupData *SetupDataPtr); + +int XUsbPs_EpPrime(XUsbPs *InstancePtr, u8 EpNum, u8 Direction); + +int XUsbPs_ReconfigureEp(XUsbPs *InstancePtr, XUsbPs_DeviceConfig *CfgPtr, + int EpNum, unsigned short NewDirection, int DirectionChanged); + +/* + * Interrupt handling functions + * + * Implemented in file xusbps_intr.c + */ +void XUsbPs_IntrHandler(void *InstancePtr); + +int XUsbPs_IntrSetHandler(XUsbPs *InstancePtr, + XUsbPs_IntrHandlerFunc CallBackFunc, + void *CallBackRef, u32 Mask); +/* + * Helper functions for static configuration. + * Implemented in xusbps_sinit.c + */ +XUsbPs_Config *XUsbPs_LookupConfig(u16 DeviceId); + +#ifdef __cplusplus +} +#endif + +#endif /* XUSBPS_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps_endpoint.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps_endpoint.h new file mode 100755 index 000000000..98d701c83 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps_endpoint.h @@ -0,0 +1,521 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps_endpoint.h + * + * This is an internal file containung the definitions for endpoints. It is + * included by the xusbps_endpoint.c which is implementing the endpoint + * functions and by xusbps_intr.c. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- -------------------------------------------------------- + * 1.00a wgr 10/10/10 First release + * </pre> + * + ******************************************************************************/ +#ifndef XUSBPS_ENDPOINT_H +#define XUSBPS_ENDPOINT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_cache.h" +#include "xusbps.h" +#include "xil_types.h" + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + + +/** + * Endpoint Device Transfer Descriptor + * + * The dTD describes to the device controller the location and quantity of data + * to be sent/received for given transfer. The driver does not attempt to + * modify any field in an active dTD except the Next Link Pointer. + */ +#define XUSBPS_dTDNLP 0x00 /**< Pointer to the next descriptor */ +#define XUSBPS_dTDTOKEN 0x04 /**< Descriptor Token */ +#define XUSBPS_dTDBPTR0 0x08 /**< Buffer Pointer 0 */ +#define XUSBPS_dTDBPTR1 0x0C /**< Buffer Pointer 1 */ +#define XUSBPS_dTDBPTR2 0x10 /**< Buffer Pointer 2 */ +#define XUSBPS_dTDBPTR3 0x14 /**< Buffer Pointer 3 */ +#define XUSBPS_dTDBPTR4 0x18 /**< Buffer Pointer 4 */ +#define XUSBPS_dTDBPTR(n) (XUSBPS_dTDBPTR0 + (n) * 0x04) +#define XUSBPS_dTDRSRVD 0x1C /**< Reserved field */ + +/* We use the reserved field in the dTD to store user data. */ +#define XUSBPS_dTDUSERDATA XUSBPS_dTDRSRVD /**< Reserved field */ + + +/** @name dTD Next Link Pointer (dTDNLP) bit positions. + * @{ + */ +#define XUSBPS_dTDNLP_T_MASK 0x00000001 + /**< USB dTD Next Link Pointer Terminate Bit */ +#define XUSBPS_dTDNLP_ADDR_MASK 0xFFFFFFE0 + /**< USB dTD Next Link Pointer Address [31:5] */ +/* @} */ + + +/** @name dTD Token (dTDTOKEN) bit positions. + * @{ + */ +#define XUSBPS_dTDTOKEN_XERR_MASK 0x00000008 /**< dTD Transaction Error */ +#define XUSBPS_dTDTOKEN_BUFERR_MASK 0x00000020 /**< dTD Data Buffer Error */ +#define XUSBPS_dTDTOKEN_HALT_MASK 0x00000040 /**< dTD Halted Flag */ +#define XUSBPS_dTDTOKEN_ACTIVE_MASK 0x00000080 /**< dTD Active Bit */ +#define XUSBPS_dTDTOKEN_MULTO_MASK 0x00000C00 /**< Multiplier Override Field [1:0] */ +#define XUSBPS_dTDTOKEN_IOC_MASK 0x00008000 /**< Interrupt on Complete Bit */ +#define XUSBPS_dTDTOKEN_LEN_MASK 0x7FFF0000 /**< Transfer Length Field */ +/* @} */ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** + * + * IMPORTANT NOTE: + * =============== + * + * Many of the following macros modify Device Queue Head (dQH) data structures + * and Device Transfer Descriptor (dTD) data structures. Those structures can + * potentially reside in CACHED memory. Therefore, it's the callers + * responsibility to ensure cache coherency by using provided + * + * XUsbPs_dQHInvalidateCache() + * XUsbPs_dQHFlushCache() + * XUsbPs_dTDInvalidateCache() + * XUsbPs_dTDFlushCache() + * + * function calls. + * + ******************************************************************************/ +#define XUsbPs_dTDInvalidateCache(dTDPtr) \ + Xil_DCacheInvalidateRange((unsigned int)dTDPtr, sizeof(XUsbPs_dTD)) + +#define XUsbPs_dTDFlushCache(dTDPtr) \ + Xil_DCacheFlushRange((unsigned int)dTDPtr, sizeof(XUsbPs_dTD)) + +#define XUsbPs_dQHInvalidateCache(dQHPtr) \ + Xil_DCacheInvalidateRange((unsigned int)dQHPtr, sizeof(XUsbPs_dQH)) + +#define XUsbPs_dQHFlushCache(dQHPtr) \ + Xil_DCacheFlushRange((unsigned int)dQHPtr, sizeof(XUsbPs_dQH)) + +/*****************************************************************************/ +/** + * + * This macro sets the Transfer Length for the given Transfer Descriptor. + * + * @param dTDPtr is pointer to the dTD element. + * @param Len is the length to be set. Range: 0..16384 + * + * @note C-style signature: + * void XUsbPs_dTDSetTransferLen(u32 dTDPtr, u32 Len) + * + ******************************************************************************/ +#define XUsbPs_dTDSetTransferLen(dTDPtr, Len) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \ + (XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) & \ + ~XUSBPS_dTDTOKEN_LEN_MASK) | ((Len) << 16)) + + +/*****************************************************************************/ +/** + * + * This macro gets the Next Link pointer of the given Transfer Descriptor. + * + * @param dTDPtr is pointer to the dTD element. + * + * @return TransferLength field of the descriptor. + * + * @note C-style signature: + * u32 XUsbPs_dTDGetTransferLen(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDGetNLP(dTDPtr) \ + (XUsbPs_dTD *) ((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP)\ + & XUSBPS_dTDNLP_ADDR_MASK)) + + +/*****************************************************************************/ +/** + * + * This macro sets the Next Link pointer of the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * @param NLP is the Next Link Pointer + * + * @note C-style signature: + * void XUsbPs_dTDSetTransferLen(u32 dTDPtr, u32 Len) + * + ******************************************************************************/ +#define XUsbPs_dTDSetNLP(dTDPtr, NLP) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \ + (XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) & \ + ~XUSBPS_dTDNLP_ADDR_MASK) | \ + ((NLP) & XUSBPS_dTDNLP_ADDR_MASK)) + + +/*****************************************************************************/ +/** + * + * This macro gets the Transfer Length for the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @return TransferLength field of the descriptor. + * + * @note C-style signature: + * u32 XUsbPs_dTDGetTransferLen(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDGetTransferLen(dTDPtr) \ + (u32) ((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) \ + & XUSBPS_dTDTOKEN_LEN_MASK) >> 16) + + +/*****************************************************************************/ +/** + * + * This macro sets the Interrupt On Complete (IOC) bit for the given Transfer + * Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @note C-style signature: + * void XUsbPs_dTDSetIOC(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDSetIOC(dTDPtr) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \ + XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) | \ + XUSBPS_dTDTOKEN_IOC_MASK) + + +/*****************************************************************************/ +/** + * + * This macro sets the Terminate bit for the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @note C-style signature: + * void XUsbPs_dTDSetTerminate(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDSetTerminate(dTDPtr) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \ + XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) | \ + XUSBPS_dTDNLP_T_MASK) + + +/*****************************************************************************/ +/** + * + * This macro clears the Terminate bit for the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @note C-style signature: + * void XUsbPs_dTDClrTerminate(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDClrTerminate(dTDPtr) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \ + XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) & \ + ~XUSBPS_dTDNLP_T_MASK) + + +/*****************************************************************************/ +/** + * + * This macro checks if the given descriptor is active. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @return + * - TRUE: The buffer is active. + * - FALSE: The buffer is not active. + * + * @note C-style signature: + * int XUsbPs_dTDIsActive(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDIsActive(dTDPtr) \ + ((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) & \ + XUSBPS_dTDTOKEN_ACTIVE_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * + * This macro sets the Active bit for the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @note C-style signature: + * void XUsbPs_dTDSetActive(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDSetActive(dTDPtr) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \ + XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) | \ + XUSBPS_dTDTOKEN_ACTIVE_MASK) + + +/*****************************************************************************/ +/** + * + * This macro reads the content of a field in a Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * @param Id is the field ID inside the dTD element to read. + * + * @note C-style signature: + * u32 XUsbPs_ReaddTD(u32 dTDPtr, u32 Id) + * + ******************************************************************************/ +#define XUsbPs_ReaddTD(dTDPtr, Id) (*(u32 *)((u32)(dTDPtr) + (u32)(Id))) + +/*****************************************************************************/ +/** + * + * This macro writes a value to a field in a Transfer Descriptor. + * + * @param dTDPtr is pointer to the dTD element. + * @param Id is the field ID inside the dTD element to read. + * @param Val is the value to write to the field. + * + * @note C-style signature: + * u32 XUsbPs_WritedTD(u32 dTDPtr, u32 Id, u32 Val) + * + ******************************************************************************/ +#define XUsbPs_WritedTD(dTDPtr, Id, Val) \ + (*(u32 *) ((u32)(dTDPtr) + (u32)(Id)) = (u32)(Val)) + + +/******************************************************************************/ +/** + * Endpoint Device Queue Head + * + * Device queue heads are arranged in an array in a continuous area of memory + * pointed to by the ENDPOINTLISTADDR pointer. The device controller will index + * into this array based upon the endpoint number received from the USB bus. + * All information necessary to respond to transactions for all primed + * transfers is contained in this list so the Device Controller can readily + * respond to incoming requests without having to traverse a linked list. + * + * The device Endpoint Queue Head (dQH) is where all transfers are managed. The + * dQH is a 48-byte data structure, but must be aligned on a 64-byte boundary. + * During priming of an endpoint, the dTD (device transfer descriptor) is + * copied into the overlay area of the dQH, which starts at the nextTD pointer + * DWord and continues through the end of the buffer pointers DWords. After a + * transfer is complete, the dTD status DWord is updated in the dTD pointed to + * by the currentTD pointer. While a packet is in progress, the overlay area of + * the dQH is used as a staging area for the dTD so that the Device Controller + * can access needed information with little minimal latency. + * + * @note + * Software must ensure that no interface data structure reachable by the + * Device Controller spans a 4K-page boundary. The first element of the + * Endpoint Queue Head List must be aligned on a 4K boundary. + */ +#define XUSBPS_dQHCFG 0x00 /**< dQH Configuration */ +#define XUSBPS_dQHCPTR 0x04 /**< dQH Current dTD Pointer */ +#define XUSBPS_dQHdTDNLP 0x08 /**< dTD Next Link Ptr in dQH + overlay */ +#define XUSBPS_dQHdTDTOKEN 0x0C /**< dTD Token in dQH overlay */ +#define XUSBPS_dQHSUB0 0x28 /**< USB dQH Setup Buffer 0 */ +#define XUSBPS_dQHSUB1 0x2C /**< USB dQH Setup Buffer 1 */ + + +/** @name dQH Configuration (dQHCFG) bit positions. + * @{ + */ +#define XUSBPS_dQHCFG_IOS_MASK 0x00008000 + /**< USB dQH Interrupt on Setup Bit */ +#define XUSBPS_dQHCFG_MPL_MASK 0x07FF0000 + /**< USB dQH Maximum Packet Length + * Field [10:0] */ +#define XUSBPS_dQHCFG_MPL_SHIFT 16 +#define XUSBPS_dQHCFG_ZLT_MASK 0x20000000 + /**< USB dQH Zero Length Termination + * Select Bit */ +#define XUSBPS_dQHCFG_MULT_MASK 0xC0000000 + /* USB dQH Number of Transactions Field + * [1:0] */ +#define XUSBPS_dQHCFG_MULT_SHIFT 30 +/* @} */ + + +/*****************************************************************************/ +/** + * + * This macro sets the Maximum Packet Length field of the give Queue Head. + * + * @param dQHPtr is a pointer to the dQH element. + * @param Len is the length to be set. + * + * @note C-style signature: + * void XUsbPs_dQHSetMaxPacketLen(u32 dQHPtr, u32 Len) + * + ******************************************************************************/ +#define XUsbPs_dQHSetMaxPacketLen(dQHPtr, Len) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + (XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \ + ~XUSBPS_dQHCFG_MPL_MASK) | ((Len) << 16)) + +/*****************************************************************************/ +/** + * + * This macro sets the Interrupt On Setup (IOS) bit for an endpoint. + * + * @param dQHPtr is a pointer to the dQH element. + * + * @note C-style signature: + * void XUsbPs_dQHSetIOS(u32 dQHPtr) + * + ******************************************************************************/ +#define XUsbPs_dQHSetIOS(dQHPtr) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) | \ + XUSBPS_dQHCFG_IOS_MASK) + +/*****************************************************************************/ +/** + * + * This macro clears the Interrupt On Setup (IOS) bit for an endpoint. + * + * @param dQHPtr is a pointer to the dQH element. + * + * @note C-style signature: + * void XUsbPs_dQHClrIOS(u32 dQHPtr) + * + ******************************************************************************/ +#define XUsbPs_dQHClrIOS(dQHPtr) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \ + ~XUSBPS_dQHCFG_IOS_MASK) + +/*****************************************************************************/ +/** + * + * This macro enables Zero Length Termination for the endpoint. + * + * @param dQHPtr is a pointer to the dQH element. + * + * @note C-style signature: + * void XUsbPs_dQHEnableZLT(u32 dQHPtr) + * + * + ******************************************************************************/ +#define XUsbPs_dQHEnableZLT(dQHPtr) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \ + ~XUSBPS_dQHCFG_ZLT_MASK) + + +/*****************************************************************************/ +/** + * + * This macro disables Zero Length Termination for the endpoint. + * + * @param dQHPtr is a pointer to the dQH element. + * + * @note C-style signature: + * void XUsbPs_dQHDisableZLT(u32 dQHPtr) + * + * + ******************************************************************************/ +#define XUsbPs_dQHDisableZLT(dQHPtr) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) | \ + XUSBPS_dQHCFG_ZLT_MASK) + +/*****************************************************************************/ +/** + * + * This macro reads the content of a field in a Queue Head. + * + * @param dQHPtr is a pointer to the dQH element. + * @param Id is the Field ID inside the dQH element to read. + * + * @note C-style signature: + * u32 XUsbPs_ReaddQH(u32 dQHPtr, u32 Id) + * + ******************************************************************************/ +#define XUsbPs_ReaddQH(dQHPtr, Id) (*(u32 *)((u32)(dQHPtr) + (u32) (Id))) + +/*****************************************************************************/ +/** + * + * This macro writes a value to a field in a Queue Head. + * + * @param dQHPtr is a pointer to the dQH element. + * @param Id is the Field ID inside the dQH element to read. + * @param Val is the Value to write to the field. + * + * @note C-style signature: + * u32 XUsbPs_WritedQH(u32 dQHPtr, u32 Id, u32 Val) + * + ******************************************************************************/ +#define XUsbPs_WritedQH(dQHPtr, Id, Val) \ + (*(u32 *) ((u32)(dQHPtr) + (u32)(Id)) = (u32)(Val)) + + + +#ifdef __cplusplus +} +#endif + +#endif /* XUSBPS_ENDPOINT_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps_hw.h new file mode 100755 index 000000000..5986f65bd --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xusbps_hw.h @@ -0,0 +1,531 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps_hw.h + * + * This header file contains identifiers and low-level driver functions (or + * macros) that can be used to access the device. High-level driver functions + * are defined in xusbps.h. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ----------------------------------------------- + * 1.00a wgr 10/10/10 First release + * 1.04a nm 10/23/12 Fixed CR# 679106. + * 1.05a kpc 07/03/13 Added XUsbPs_ResetHw function prototype + * </pre> + * + ******************************************************************************/ +#ifndef XUSBPS_HW_H +#define XUSBPS_HW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + + +#define XUSBPS_REG_SPACING 4 + +/** @name Timer 0 Register offsets + * + * @{ + */ +#define XUSBPS_TIMER0_LD_OFFSET 0x00000080 +#define XUSBPS_TIMER0_CTL_OFFSET 0x00000084 +/* @} */ + +/** @name Timer Control Register bit mask + * + * @{ + */ +#define XUSBPS_TIMER_RUN_MASK 0x80000000 +#define XUSBPS_TIMER_STOP_MASK 0x80000000 +#define XUSBPS_TIMER_RESET_MASK 0x40000000 +#define XUSBPS_TIMER_REPEAT_MASK 0x01000000 +/* @} */ + +/** @name Timer Control Register bit mask + * + * @{ + */ +#define XUSBPS_TIMER_COUNTER_MASK 0x00FFFFFF +/* @} */ + +/** @name Device Hardware Parameters + * + * @{ + */ +#define XUSBPS_HWDEVICE_OFFSET 0x0000000C + +#define XUSBPS_EP_NUM_MASK 0x3E +#define XUSBPS_EP_NUM_SHIFT 1 +/* @} */ + +/** @name Capability Regsiter offsets + */ +#define XUSBPS_HCSPARAMS_OFFSET 0x00000104 + +/** @name Operational Register offsets. + * Register comments are tagged with "H:" and "D:" for Host and Device modes, + * respectively. + * Tags are only present for registers that have a different meaning DEVICE and + * HOST modes. Most registers are only valid for either DEVICE or HOST mode. + * Those registers don't have tags. + * @{ + */ +#define XUSBPS_CMD_OFFSET 0x00000140 /**< Configuration */ +#define XUSBPS_ISR_OFFSET 0x00000144 /**< Interrupt Status */ +#define XUSBPS_IER_OFFSET 0x00000148 /**< Interrupt Enable */ +#define XUSBPS_FRAME_OFFSET 0x0000014C /**< USB Frame Index */ +#define XUSBPS_LISTBASE_OFFSET 0x00000154 /**< H: Periodic List Base Address */ +#define XUSBPS_DEVICEADDR_OFFSET 0x00000154 /**< D: Device Address */ +#define XUSBPS_ASYNCLISTADDR_OFFSET 0x00000158 /**< H: Async List Address */ +#define XUSBPS_EPLISTADDR_OFFSET 0x00000158 /**< D: Endpoint List Addr */ +#define XUSBPS_TTCTRL_OFFSET 0x0000015C /**< TT Control */ +#define XUSBPS_BURSTSIZE_OFFSET 0x00000160 /**< Burst Size */ +#define XUSBPS_TXFILL_OFFSET 0x00000164 /**< Tx Fill Tuning */ +#define XUSBPS_ULPIVIEW_OFFSET 0x00000170 /**< ULPI Viewport */ +#define XUSBPS_EPNAKISR_OFFSET 0x00000178 /**< Endpoint NAK IRQ Status */ +#define XUSBPS_EPNAKIER_OFFSET 0x0000017C /**< Endpoint NAK IRQ Enable */ +#define XUSBPS_PORTSCR1_OFFSET 0x00000184 /**< Port Control/Status 1 */ + +/* NOTE: The Port Control / Status Register index is 1-based. */ +#define XUSBPS_PORTSCRn_OFFSET(n) \ + (XUSBPS_PORTSCR1_OFFSET + (((n)-1) * XUSBPS_REG_SPACING)) + + +#define XUSBPS_OTGCSR_OFFSET 0x000001A4 /**< OTG Status and Control */ +#define XUSBPS_MODE_OFFSET 0x000001A8 /**< USB Mode */ +#define XUSBPS_EPSTAT_OFFSET 0x000001AC /**< Endpoint Setup Status */ +#define XUSBPS_EPPRIME_OFFSET 0x000001B0 /**< Endpoint Prime */ +#define XUSBPS_EPFLUSH_OFFSET 0x000001B4 /**< Endpoint Flush */ +#define XUSBPS_EPRDY_OFFSET 0x000001B8 /**< Endpoint Ready */ +#define XUSBPS_EPCOMPL_OFFSET 0x000001BC /**< Endpoint Complete */ +#define XUSBPS_EPCR0_OFFSET 0x000001C0 /**< Endpoint Control 0 */ +#define XUSBPS_EPCR1_OFFSET 0x000001C4 /**< Endpoint Control 1 */ +#define XUSBPS_EPCR2_OFFSET 0x000001C8 /**< Endpoint Control 2 */ +#define XUSBPS_EPCR3_OFFSET 0x000001CC /**< Endpoint Control 3 */ +#define XUSBPS_EPCR4_OFFSET 0x000001D0 /**< Endpoint Control 4 */ + +#define XUSBPS_MAX_ENDPOINTS 4 /**< Number of supported Endpoints in + * this core. */ +#define XUSBPS_EP_OUT_MASK 0x0000001F /**< OUR (RX) endpoint mask */ +#define XUSBPS_EP_IN_MASK 0x001F0000 /**< IN (TX) endpoint mask */ +#define XUSBPS_EP_ALL_MASK 0x001F001F /**< Mask used for endpoint control + * registers */ +#define XUSBPS_EPCRn_OFFSET(n) \ + (XUSBPS_EPCR0_OFFSET + ((n) * XUSBPS_REG_SPACING)) + +#define XUSBPS_EPFLUSH_RX_SHIFT 0 +#define XUSBPS_EPFLUSH_TX_SHIFT 16 + +/* @} */ + + + +/** @name Endpoint Control Register (EPCR) bit positions. + * @{ + */ + +/* Definitions for TX Endpoint bits */ +#define XUSBPS_EPCR_TXT_CONTROL_MASK 0x00000000 /**< Control Endpoint - TX */ +#define XUSBPS_EPCR_TXT_ISO_MASK 0x00040000 /**< Isochronous. Endpoint */ +#define XUSBPS_EPCR_TXT_BULK_MASK 0x00080000 /**< Bulk Endpoint - TX */ +#define XUSBPS_EPCR_TXT_INTR_MASK 0x000C0000 /**< Interrupt Endpoint */ +#define XUSBPS_EPCR_TXS_MASK 0x00010000 /**< Stall TX endpoint */ +#define XUSBPS_EPCR_TXE_MASK 0x00800000 /**< Transmit enable - TX */ +#define XUSBPS_EPCR_TXR_MASK 0x00400000 /**< Data Toggle Reset Bit */ + + +/* Definitions for RX Endpoint bits */ +#define XUSBPS_EPCR_RXT_CONTROL_MASK 0x00000000 /**< Control Endpoint - RX */ +#define XUSBPS_EPCR_RXT_ISO_MASK 0x00000004 /**< Isochronous Endpoint */ +#define XUSBPS_EPCR_RXT_BULK_MASK 0x00000008 /**< Bulk Endpoint - RX */ +#define XUSBPS_EPCR_RXT_INTR_MASK 0x0000000C /**< Interrupt Endpoint */ +#define XUSBPS_EPCR_RXS_MASK 0x00000001 /**< Stall RX endpoint. */ +#define XUSBPS_EPCR_RXE_MASK 0x00000080 /**< Transmit enable. - RX */ +#define XUSBPS_EPCR_RXR_MASK 0x00000040 /**< Data Toggle Reset Bit */ +/* @} */ + + +/** @name USB Command Register (CR) bit positions. + * @{ + */ +#define XUSBPS_CMD_RS_MASK 0x00000001 /**< Run/Stop */ +#define XUSBPS_CMD_RST_MASK 0x00000002 /**< Controller RESET */ +#define XUSBPS_CMD_FS01_MASK 0x0000000C /**< Frame List Size bit 0,1 */ +#define XUSBPS_CMD_PSE_MASK 0x00000010 /**< Periodic Sched Enable */ +#define XUSBPS_CMD_ASE_MASK 0x00000020 /**< Async Sched Enable */ +#define XUSBPS_CMD_IAA_MASK 0x00000040 /**< IRQ Async Advance Doorbell */ +#define XUSBPS_CMD_ASP_MASK 0x00000300 /**< Async Sched Park Mode Cnt */ +#define XUSBPS_CMD_ASPE_MASK 0x00000800 /**< Async Sched Park Mode Enbl */ +#define XUSBPS_CMD_SUTW_MASK 0x00002000 /**< Setup TripWire */ +#define XUSBPS_CMD_ATDTW_MASK 0x00004000 /**< Add dTD TripWire */ +#define XUSBPS_CMD_FS2_MASK 0x00008000 /**< Frame List Size bit 2 */ +#define XUSBPS_CMD_ITC_MASK 0x00FF0000 /**< IRQ Threshold Control */ +/* @} */ + + +/** + * @name Interrupt Threshold + * These definitions are used by software to set the maximum rate at which the + * USB controller will generate interrupt requests. The interrupt interval is + * given in number of micro-frames. + * + * USB defines a full-speed 1 ms frame time indicated by a Start Of Frame (SOF) + * packet each and every 1ms. USB also defines a high-speed micro-frame with a + * 125us frame time. For each micro-frame a SOF (Start Of Frame) packet is + * generated. Data is sent in between the SOF packets. The interrupt threshold + * defines how many micro-frames the controller waits before issuing an + * interrupt after data has been received. + * + * For a threshold of 0 the controller will issue an interrupt immediately + * after the last byte of the data has been received. For a threshold n>0 the + * controller will wait for n micro-frames before issuing an interrupt. + * + * Therefore, a setting of 8 micro-frames (default) means that the controller + * will issue at most 1 interrupt per millisecond. + * + * @{ + */ +#define XUSBPS_CMD_ITHRESHOLD_0 0x00 /**< Immediate interrupt. */ +#define XUSBPS_CMD_ITHRESHOLD_1 0x01 /**< 1 micro-frame */ +#define XUSBPS_CMD_ITHRESHOLD_2 0x02 /**< 2 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_4 0x04 /**< 4 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_8 0x08 /**< 8 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_16 0x10 /**< 16 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_32 0x20 /**< 32 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_64 0x40 /**< 64 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_MAX XUSBPS_CMD_ITHRESHOLD_64 +#define XUSBPS_CMD_ITHRESHOLD_DEFAULT XUSBPS_CMD_ITHRESHOLD_8 +/* @} */ + + + +/** @name USB Interrupt Status Register (ISR) / Interrupt Enable Register (IER) + * bit positions. + * @{ + */ +#define XUSBPS_IXR_UI_MASK 0x00000001 /**< USB Transaction Complete */ +#define XUSBPS_IXR_UE_MASK 0x00000002 /**< Transaction Error */ +#define XUSBPS_IXR_PC_MASK 0x00000004 /**< Port Change Detect */ +#define XUSBPS_IXR_FRE_MASK 0x00000008 /**< Frame List Rollover */ +#define XUSBPS_IXR_AA_MASK 0x00000020 /**< Async Advance */ +#define XUSBPS_IXR_UR_MASK 0x00000040 /**< RESET Received */ +#define XUSBPS_IXR_SR_MASK 0x00000080 /**< Start of Frame */ +#define XUSBPS_IXR_SLE_MASK 0x00000100 /**< Device Controller Suspend */ +#define XUSBPS_IXR_ULPI_MASK 0x00000400 /**< ULPI IRQ */ +#define XUSBPS_IXR_HCH_MASK 0x00001000 /**< Host Controller Halted + * Read Only */ +#define XUSBPS_IXR_RCL_MASK 0x00002000 /**< USB Reclamation Read Only */ +#define XUSBPS_IXR_PS_MASK 0x00004000 /**< Periodic Sched Status + * Read Only */ +#define XUSBPS_IXR_AS_MASK 0x00008000 /**< Async Sched Status Read only */ +#define XUSBPS_IXR_NAK_MASK 0x00010000 /**< NAK IRQ */ +#define XUSBPS_IXR_UA_MASK 0x00040000 /**< USB Host Async IRQ */ +#define XUSBPS_IXR_UP_MASK 0x00080000 /**< USB Host Periodic IRQ */ +#define XUSBPS_IXR_TI0_MASK 0x01000000 /**< Timer 0 Interrupt */ +#define XUSBPS_IXR_TI1_MASK 0x02000000 /**< Timer 1 Interrupt */ + +#define XUSBPS_IXR_ALL (XUSBPS_IXR_UI_MASK | \ + XUSBPS_IXR_UE_MASK | \ + XUSBPS_IXR_PC_MASK | \ + XUSBPS_IXR_FRE_MASK | \ + XUSBPS_IXR_AA_MASK | \ + XUSBPS_IXR_UR_MASK | \ + XUSBPS_IXR_SR_MASK | \ + XUSBPS_IXR_SLE_MASK | \ + XUSBPS_IXR_ULPI_MASK | \ + XUSBPS_IXR_HCH_MASK | \ + XUSBPS_IXR_RCL_MASK | \ + XUSBPS_IXR_PS_MASK | \ + XUSBPS_IXR_AS_MASK | \ + XUSBPS_IXR_NAK_MASK | \ + XUSBPS_IXR_UA_MASK | \ + XUSBPS_IXR_UP_MASK | \ + XUSBPS_IXR_TI0_MASK | \ + XUSBPS_IXR_TI1_MASK) + /**< Mask for ALL IRQ types */ +/* @} */ + + +/** @name USB Mode Register (MODE) bit positions. + * @{ + */ +#define XUSBPS_MODE_CM_MASK 0x00000003 /**< Controller Mode Select */ +#define XUSBPS_MODE_CM_IDLE_MASK 0x00000000 +#define XUSBPS_MODE_CM_DEVICE_MASK 0x00000002 +#define XUSBPS_MODE_CM_HOST_MASK 0x00000003 +#define XUSBPS_MODE_ES_MASK 0x00000004 /**< USB Endian Select */ +#define XUSBPS_MODE_SLOM_MASK 0x00000008 /**< USB Setup Lockout Mode Disable */ +#define XUSBPS_MODE_SDIS_MASK 0x00000010 +#define XUSBPS_MODE_VALID_MASK 0x0000001F + +/* @} */ + + +/** @name USB Device Address Register (DEVICEADDR) bit positions. + * @{ + */ +#define XUSBPS_DEVICEADDR_DEVICEAADV_MASK 0x01000000 + /**< Device Addr Auto Advance */ +#define XUSBPS_DEVICEADDR_ADDR_MASK 0xFE000000 + /**< Device Address */ +#define XUSBPS_DEVICEADDR_ADDR_SHIFT 25 + /**< Address shift */ +#define XUSBPS_DEVICEADDR_MAX 127 + /**< Biggest allowed address */ +/* @} */ + +/** @name USB TT Control Register (TTCTRL) bit positions. + * @{ + */ +#define XUSBPS_TTCTRL_HUBADDR_MASK 0x7F000000 /**< TT Hub Address */ +/* @} */ + + +/** @name USB Burst Size Register (BURSTSIZE) bit posisions. + * @{ + */ +#define XUSBPS_BURSTSIZE_RX_MASK 0x000000FF /**< RX Burst Length */ +#define XUSBPS_BURSTSIZE_TX_MASK 0x0000FF00 /**< TX Burst Length */ +/* @} */ + + +/** @name USB Tx Fill Tuning Register (TXFILL) bit positions. + * @{ + */ +#define XUSBPS_TXFILL_OVERHEAD_MASK 0x000000FF + /**< Scheduler Overhead */ +#define XUSBPS_TXFILL_HEALTH_MASK 0x00001F00 + /**< Scheduler Health Cntr */ +#define XUSBPS_TXFILL_BURST_MASK 0x003F0000 + /**< FIFO Burst Threshold */ +/* @} */ + + +/** @name USB ULPI Viewport Register (ULPIVIEW) bit positions. + * @{ + */ +#define XUSBPS_ULPIVIEW_DATWR_MASK 0x000000FF /**< ULPI Data Write */ +#define XUSBPS_ULPIVIEW_DATRD_MASK 0x0000FF00 /**< ULPI Data Read */ +#define XUSBPS_ULPIVIEW_ADDR_MASK 0x00FF0000 /**< ULPI Data Address */ +#define XUSBPS_ULPIVIEW_PORT_MASK 0x07000000 /**< ULPI Port Number */ +#define XUSBPS_ULPIVIEW_SS_MASK 0x08000000 /**< ULPI Synchronous State */ +#define XUSBPS_ULPIVIEW_RW_MASK 0x20000000 /**< ULPI Read/Write Control */ +#define XUSBPS_ULPIVIEW_RUN_MASK 0x40000000 /**< ULPI Run */ +#define XUSBPS_ULPIVIEW_WU_MASK 0x80000000 /**< ULPI Wakeup */ +/* @} */ + + +/** @name Port Status Control Register bit positions. + * @{ + */ +#define XUSBPS_PORTSCR_CCS_MASK 0x00000001 /**< Current Connect Status */ +#define XUSBPS_PORTSCR_CSC_MASK 0x00000002 /**< Connect Status Change */ +#define XUSBPS_PORTSCR_PE_MASK 0x00000004 /**< Port Enable/Disable */ +#define XUSBPS_PORTSCR_PEC_MASK 0x00000008 /**< Port Enable/Disable Change */ +#define XUSBPS_PORTSCR_OCA_MASK 0x00000010 /**< Over-current Active */ +#define XUSBPS_PORTSCR_OCC_MASK 0x00000020 /**< Over-current Change */ +#define XUSBPS_PORTSCR_FPR_MASK 0x00000040 /**< Force Port Resume */ +#define XUSBPS_PORTSCR_SUSP_MASK 0x00000080 /**< Suspend */ +#define XUSBPS_PORTSCR_PR_MASK 0x00000100 /**< Port Reset */ +#define XUSBPS_PORTSCR_HSP_MASK 0x00000200 /**< High Speed Port */ +#define XUSBPS_PORTSCR_LS_MASK 0x00000C00 /**< Line Status */ +#define XUSBPS_PORTSCR_PP_MASK 0x00001000 /**< Port Power */ +#define XUSBPS_PORTSCR_PO_MASK 0x00002000 /**< Port Owner */ +#define XUSBPS_PORTSCR_PIC_MASK 0x0000C000 /**< Port Indicator Control */ +#define XUSBPS_PORTSCR_PTC_MASK 0x000F0000 /**< Port Test Control */ +#define XUSBPS_PORTSCR_WKCN_MASK 0x00100000 /**< Wake on Connect Enable */ +#define XUSBPS_PORTSCR_WKDS_MASK 0x00200000 /**< Wake on Disconnect Enable */ +#define XUSBPS_PORTSCR_WKOC_MASK 0x00400000 /**< Wake on Over-current Enable */ +#define XUSBPS_PORTSCR_PHCD_MASK 0x00800000 /**< PHY Low Power Suspend - + * Clock Disable */ +#define XUSBPS_PORTSCR_PFSC_MASK 0x01000000 /**< Port Force Full Speed + * Connect */ +#define XUSBPS_PORTSCR_PSPD_MASK 0x0C000000 /**< Port Speed */ +/* @} */ + + +/** @name On-The-Go Status Control Register (OTGCSR) bit positions. + * @{ + */ +#define XUSBPS_OTGSC_VD_MASK 0x00000001 /**< VBus Discharge Bit */ +#define XUSBPS_OTGSC_VC_MASK 0x00000002 /**< VBus Charge Bit */ +#define XUSBPS_OTGSC_HAAR_MASK 0x00000004 /**< HW Assist Auto Reset + * Enable Bit */ +#define XUSBPS_OTGSC_OT_MASK 0x00000008 /**< OTG Termination Bit */ +#define XUSBPS_OTGSC_DP_MASK 0x00000010 /**< Data Pulsing Pull-up + * Enable Bit */ +#define XUSBPS_OTGSC_IDPU_MASK 0x00000020 /**< ID Pull-up Enable Bit */ +#define XUSBPS_OTGSC_HADP_MASK 0x00000040 /**< HW Assist Data Pulse + * Enable Bit */ +#define XUSBPS_OTGSC_HABA_MASK 0x00000080 /**< USB Hardware Assist + * B Disconnect to A + * Connect Enable Bit */ +#define XUSBPS_OTGSC_ID_MASK 0x00000100 /**< ID Status Flag */ +#define XUSBPS_OTGSC_AVV_MASK 0x00000200 /**< USB A VBus Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_ASV_MASK 0x00000400 /**< USB A Session Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_BSV_MASK 0x00000800 /**< USB B Session Valid Status Flag */ +#define XUSBPS_OTGSC_BSE_MASK 0x00001000 /**< USB B Session End Status Flag */ +#define XUSBPS_OTGSC_1MST_MASK 0x00002000 /**< USB 1 Millisecond Timer Status Flag */ +#define XUSBPS_OTGSC_DPS_MASK 0x00004000 /**< Data Pulse Status Flag */ +#define XUSBPS_OTGSC_IDIS_MASK 0x00010000 /**< USB ID Interrupt Status Flag */ +#define XUSBPS_OTGSC_AVVIS_MASK 0x00020000 /**< USB A VBus Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_ASVIS_MASK 0x00040000 /**< USB A Session Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_BSVIS_MASK 0x00080000 /**< USB B Session Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_BSEIS_MASK 0x00100000 /**< USB B Session End Interrupt Status Flag */ +#define XUSBPS_OTGSC_1MSS_MASK 0x00200000 /**< 1 Millisecond Timer Interrupt Status Flag */ +#define XUSBPS_OTGSC_DPIS_MASK 0x00400000 /**< Data Pulse Interrupt Status Flag */ +#define XUSBPS_OTGSC_IDIE_MASK 0x01000000 /**< ID Interrupt Enable Bit */ +#define XUSBPS_OTGSC_AVVIE_MASK 0x02000000 /**< USB A VBus Valid Interrupt Enable Bit */ +#define XUSBPS_OTGSC_ASVIE_MASK 0x04000000 /**< USB A Session Valid Interrupt Enable Bit */ +#define XUSBPS_OTGSC_BSVIE_MASK 0x08000000 /**< USB B Session Valid Interrupt Enable Bit */ +#define XUSBPS_OTGSC_BSEE_MASK 0x10000000 /**< USB B Session End Interrupt Enable Bit */ +#define XUSBPS_OTGSC_1MSE_MASK 0x20000000 /**< 1 Millisecond Timer + * Interrupt Enable Bit */ +#define XUSBPS_OTGSC_DPIE_MASK 0x40000000 /**< Data Pulse Interrupt + * Enable Bit */ + +#define XUSBPS_OTG_ISB_ALL (XUSBPS_OTGSC_IDIS_MASK |\ + XUSBPS_OTGSC_AVVIS_MASK | \ + XUSBPS_OTGSC_ASVIS_MASK | \ + XUSBPS_OTGSC_BSVIS_MASK | \ + XUSBPS_OTGSC_BSEIS_MASK | \ + XUSBPS_OTGSC_1MSS_MASK | \ + XUSBPS_OTGSC_DPIS_MASK) + /** Mask for All IRQ status masks */ + +#define XUSBPS_OTG_IEB_ALL (XUSBPS_OTGSC_IDIE_MASK |\ + XUSBPS_OTGSC_AVVIE_MASK | \ + XUSBPS_OTGSC_ASVIE_MASK | \ + XUSBPS_OTGSC_BSVIE_MASK | \ + XUSBPS_OTGSC_BSEE_IEB_MASK | \ + XUSBPS_OTGSC_1MSE_MASK | \ + XUSBPS_OTGSC_DPIE_MASK) + /** Mask for All IRQ Enable masks */ +/* @} */ + + +/**< Alignment of the Device Queue Head List BASE. */ +#define XUSBPS_dQH_BASE_ALIGN 2048 + +/**< Alignment of a Device Queue Head structure. */ +#define XUSBPS_dQH_ALIGN 64 + +/**< Alignment of a Device Transfer Descriptor structure. */ +#define XUSBPS_dTD_ALIGN 32 + +/**< Size of one RX buffer for a OUT Transfer Descriptor. */ +#define XUSBPS_dTD_BUF_SIZE 4096 + +/**< Maximum size of one RX/TX buffer. */ +#define XUSBPS_dTD_BUF_MAX_SIZE 16*1024 + +/**< Alignment requirement for Transfer Descriptor buffers. */ +#define XUSBPS_dTD_BUF_ALIGN 4096 + + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* This macro reads the given register. +* +* @param BaseAddress is the base address for the USB registers. +* @param RegOffset is the register offset to be read. +* +* @return The 32-bit value of the register. +* +* @note C-style signature: +* u32 XUsbPs_ReadReg(u32 BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XUsbPs_ReadReg(BaseAddress, RegOffset) \ + Xil_In32(BaseAddress + (RegOffset)) + + +/****************************************************************************/ +/** +* +* This macro writes the given register. +* +* @param BaseAddress is the the base address for the USB registers. +* @param RegOffset is the register offset to be written. +* @param Data is the the 32-bit value to write to the register. +* +* @return None. +* +* @note C-style signature: +* void XUsbPs_WriteReg(u32 BaseAddress, u32 RegOffset, u32 Data) +* + *****************************************************************************/ +#define XUsbPs_WriteReg(BaseAddress, RegOffset, Data) \ + Xil_Out32(BaseAddress + (RegOffset), (Data)) + + +/************************** Function Prototypes ******************************/ +/* + * Perform reset operation to the USB PS interface + */ +void XUsbPs_ResetHw(u32 BaseAddress); +/************************** Variable Definitions ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* XUSBPS_L_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xutil.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xutil.h new file mode 100644 index 000000000..39469fef7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xutil.h @@ -0,0 +1,154 @@ +/* $Id: xutil.h,v 1.8 2007/05/04 21:55:59 wre Exp $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xutil.h +* +* This file contains utility functions such as memory test functions. +* +* <b>Memory test description</b> +* +* A subset of the memory tests can be selected or all of the tests can be run +* in order. If there is an error detected by a subtest, the test stops and the +* failure code is returned. Further tests are not run even if all of the tests +* are selected. +* +* Subtest descriptions: +* <pre> +* XUT_ALLMEMTESTS: +* Runs all of the following tests +* +* XUT_INCREMENT: +* Incrementing Value Test. +* This test starts at 'XUT_MEMTEST_INIT_VALUE' and uses the incrementing +* value as the test value for memory. +* +* XUT_WALKONES: +* Walking Ones Test. +* This test uses a walking '1' as the test value for memory. +* location 1 = 0x00000001 +* location 2 = 0x00000002 +* ... +* +* XUT_WALKZEROS: +* Walking Zero's Test. +* This test uses the inverse value of the walking ones test +* as the test value for memory. +* location 1 = 0xFFFFFFFE +* location 2 = 0xFFFFFFFD +* ... +* +* XUT_INVERSEADDR: +* Inverse Address Test. +* This test uses the inverse of the address of the location under test +* as the test value for memory. +* +* XUT_FIXEDPATTERN: +* Fixed Pattern Test. +* This test uses the provided patters as the test value for memory. +* If zero is provided as the pattern the test uses '0xDEADBEEF". +* </pre> +* +* <i>WARNING</i> +* +* The tests are <b>DESTRUCTIVE</b>. Run before any initialized memory spaces +* have been set up. +* +* The address, Addr, provided to the memory tests is not checked for +* validity except for the NULL case. It is possible to provide a code-space +* pointer for this test to start with and ultimately destroy executable code +* causing random failures. +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** width, +* the patterns used in XUT_WALKONES and XUT_WALKZEROS will repeat on a +* boundry of a power of two making it more difficult to detect addressing +* errors. The XUT_INCREMENT and XUT_INVERSEADDR tests suffer the same +* problem. Ideally, if large blocks of memory are to be tested, break +* them up into smaller regions of memory to allow the test patterns used +* not to repeat over the region tested. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 11/01/01 First release +* 1.00a xd 11/03/04 Improved support for doxygen. +* </pre> +* +******************************************************************************/ + +#ifndef XUTIL_H /* prevent circular inclusions */ +#define XUTIL_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xbasic_types.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/* xutil_memtest defines */ + +#define XUT_MEMTEST_INIT_VALUE 1 + +/** @name Memory subtests + * @{ + */ +/** + * See the detailed description of the subtests in the file description. + */ +#define XUT_ALLMEMTESTS 0 +#define XUT_INCREMENT 1 +#define XUT_WALKONES 2 +#define XUT_WALKZEROS 3 +#define XUT_INVERSEADDR 4 +#define XUT_FIXEDPATTERN 5 +#define XUT_MAXTEST XUT_FIXEDPATTERN +/* @} */ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/* xutil_memtest prototypes */ + +int XUtil_MemoryTest32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest); +int XUtil_MemoryTest16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest); +int XUtil_MemoryTest8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xversion.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xversion.h new file mode 100755 index 000000000..3a14716f0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/include/xversion.h @@ -0,0 +1,98 @@ +/* $Id: xversion.h,v 1.9 2007/05/07 14:29:23 wre Exp $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xversion.h +* +* This file contains the interface for the XVersion component. This +* component represents a version ID. It is encapsulated within a component +* so that it's type and implementation can change without affecting users of +* it. +* +* The version is formatted as X.YYZ where X = 0 - 9, Y = 00 - 99, Z = a - z +* X is the major revision, YY is the minor revision, and Z is the +* compatability revision. +* +* Packed versions are also utilized for the configuration ROM such that +* memory is minimized. A packed version consumes only 16 bits and is +* formatted as follows. +* +* <pre> +* Revision Range Bit Positions +* +* Major Revision 0 - 9 Bits 15 - 12 +* Minor Revision 0 - 99 Bits 11 - 5 +* Compatability Revision a - z Bits 4 - 0 +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a xd 11/03/04 Improved support for doxygen. +* </pre> +* +******************************************************************************/ + +#ifndef XVERSION_H /* prevent circular inclusions */ +#define XVERSION_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xbasic_types.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/* the following data type is used to hold a null terminated version string + * consisting of the following format, "X.YYX" + */ +typedef char XVersion[6]; + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +void XVersion_UnPack(XVersion *InstancePtr, u16 PackedVersion); + +int XVersion_Pack(XVersion *InstancePtr, u16 *PackedVersion); + +int XVersion_IsEqual(XVersion *InstancePtr, XVersion *VersionPtr); + +void XVersion_ToString(XVersion *InstancePtr, char *StringPtr); + +int XVersion_FromString(XVersion *InstancePtr, char *StringPtr); + +void XVersion_Copy(XVersion *InstancePtr, XVersion *VersionPtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/lib/libxil.a b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/lib/libxil.a new file mode 100644 index 0000000000000000000000000000000000000000..cd130b4ec73cbb8e492ada7951f6daac43c0ef2b GIT binary patch literal 923574 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�^|4{GV>NTIeoq^Zj=KV@pmXLQ)DpiOOQ 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%0Av<x}B*(;#GO(#(SnMsg4x|+yabt)==nc~R3 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 M?<;cw=+nXfA4h^+aR2}S literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/Makefile new file mode 100644 index 000000000..827952509 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/Makefile @@ -0,0 +1,28 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES=*.c +INCLUDEFILES=xbasic_types.h xenv.h xenv_none.h xenv_standalone.h xenv_vxworks.h xstatus.h xutil.h xversion.h xdebug.h + +libs: + echo "Compiling common" + $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES) + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS} + make clean + +include: + ${CP} $(INCLUDEFILES) $(INCLUDEDIR) + +clean: + rm -rf $(OUTS) + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xbasic_types.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xbasic_types.c new file mode 100755 index 000000000..c3e718330 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xbasic_types.c @@ -0,0 +1,137 @@ +/* $Id $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2012 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xbasic_types.c +* +* This file contains basic functions for Xilinx software IP. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a rpm 11/07/03 Added XNullHandler function as a stub interrupt handler +* 1.00a xd 11/03/04 Improved support for doxygen. +* 1.00a bss 13/01/12 Removed a compiler warning in XNullHandler; +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xbasic_types.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/** + * This variable allows testing to be done easier with asserts. An assert + * sets this variable such that a driver can evaluate this variable + * to determine if an assert occurred. + */ +unsigned int XAssertStatus; + +/** + * This variable allows the assert functionality to be changed for testing + * such that it does not wait infinitely. Use the debugger to disable the + * waiting during testing of asserts. + */ +int XWaitInAssert = TRUE; + +/* The callback function to be invoked when an assert is taken */ +static XAssertCallback XAssertCallbackRoutine = (XAssertCallback) NULL; + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* +* Implements assert. Currently, it calls a user-defined callback function +* if one has been set. Then, it potentially enters an infinite loop depending +* on the value of the XWaitInAssert variable. +* +* @param File is the name of the filename of the source +* @param Line is the linenumber within File +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XAssert(char *File, int Line) +{ + /* if the callback has been set then invoke it */ + if (XAssertCallbackRoutine != NULL) { + (*XAssertCallbackRoutine) (File, Line); + } + + /* if specified, wait indefinitely such that the assert will show up + * in testing + */ + while (XWaitInAssert) { + } +} + +/*****************************************************************************/ +/** +* +* Sets up a callback function to be invoked when an assert occurs. If there +* was already a callback installed, then it is replaced. +* +* @param Routine is the callback to be invoked when an assert is taken +* +* @return None. +* +* @note This function has no effect if NDEBUG is set +* +******************************************************************************/ +void XAssertSetCallback(XAssertCallback Routine) +{ + XAssertCallbackRoutine = Routine; +} + + +/*****************************************************************************/ +/** +* +* Null handler function. This follows the XInterruptHandler signature for +* interrupt handlers. It can be used to assign a null handler (a stub) to an +* interrupt controller vector table. +* +* @param NullParameter is an arbitrary void pointer and not used. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XNullHandler(void *NullParameter) +{ + (void) NullParameter; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xbasic_types.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xbasic_types.h new file mode 100755 index 000000000..d5db3f7b0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xbasic_types.h @@ -0,0 +1,300 @@ +/* $Id: xbasic_types.h,v 1.19.10.4 2011/06/28 11:00:54 sadanan Exp $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2007 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xbasic_types.h +* +* This file contains basic types for Xilinx software IP. These types do not +* follow the standard naming convention with respect to using the component +* name in front of each name because they are considered to be primitives. +* +* @note +* +* This file contains items which are architecture dependent. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a rmm 12/14/01 First release +* rmm 05/09/03 Added "xassert always" macros to rid ourselves of diab +* compiler warnings +* 1.00a rpm 11/07/03 Added XNullHandler function as a stub interrupt handler +* 1.00a rpm 07/21/04 Added XExceptionHandler typedef for processor exceptions +* 1.00a xd 11/03/04 Improved support for doxygen. +* 1.00a wre 01/25/07 Added Linux style data types u32, u16, u8, TRUE, FALSE +* 1.00a rpm 04/02/07 Added ifndef KERNEL around u32, u16, u8 data types +* </pre> +* +******************************************************************************/ + +#ifndef XBASIC_TYPES_H /* prevent circular inclusions */ +#define XBASIC_TYPES_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +# define TRUE 1 +#endif + +#ifndef FALSE +# define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +/** Xilinx NULL, TRUE and FALSE legacy support. Deprecated. */ +#define XNULL NULL +#define XTRUE TRUE +#define XFALSE FALSE + + +#define XCOMPONENT_IS_READY 0x11111111 /**< component has been initialized */ +#define XCOMPONENT_IS_STARTED 0x22222222 /**< component has been started */ + +/* the following constants and declarations are for unit test purposes and are + * designed to be used in test applications. + */ +#define XTEST_PASSED 0 +#define XTEST_FAILED 1 + +#define XASSERT_NONE 0 +#define XASSERT_OCCURRED 1 + +extern unsigned int XAssertStatus; +extern void XAssert(char *, int); + +/**************************** Type Definitions *******************************/ + +/** @name Legacy types + * Deprecated legacy types. + * @{ + */ +typedef unsigned char Xuint8; /**< unsigned 8-bit */ +typedef char Xint8; /**< signed 8-bit */ +typedef unsigned short Xuint16; /**< unsigned 16-bit */ +typedef short Xint16; /**< signed 16-bit */ +typedef unsigned long Xuint32; /**< unsigned 32-bit */ +typedef long Xint32; /**< signed 32-bit */ +typedef float Xfloat32; /**< 32-bit floating point */ +typedef double Xfloat64; /**< 64-bit double precision FP */ +typedef unsigned long Xboolean; /**< boolean (XTRUE or XFALSE) */ + +#if !defined __XUINT64__ +typedef struct +{ + Xuint32 Upper; + Xuint32 Lower; +} Xuint64; +#endif + +/** @name New types + * New simple types. + * @{ + */ +#ifndef __KERNEL__ +#ifndef XIL_TYPES_H +typedef Xuint32 u32; +typedef Xuint16 u16; +typedef Xuint8 u8; +#endif +#else +#include <linux/types.h> +#endif + +/*@}*/ + +/** + * This data type defines an interrupt handler for a device. + * The argument points to the instance of the component + */ +typedef void (*XInterruptHandler) (void *InstancePtr); + +/** + * This data type defines an exception handler for a processor. + * The argument points to the instance of the component + */ +typedef void (*XExceptionHandler) (void *InstancePtr); + +/** + * This data type defines a callback to be invoked when an + * assert occurs. The callback is invoked only when asserts are enabled + */ +typedef void (*XAssertCallback) (char *FilenamePtr, int LineNumber); + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** +* Return the most significant half of the 64 bit data type. +* +* @param x is the 64 bit word. +* +* @return The upper 32 bits of the 64 bit word. +* +* @note None. +* +******************************************************************************/ +#define XUINT64_MSW(x) ((x).Upper) + +/*****************************************************************************/ +/** +* Return the least significant half of the 64 bit data type. +* +* @param x is the 64 bit word. +* +* @return The lower 32 bits of the 64 bit word. +* +* @note None. +* +******************************************************************************/ +#define XUINT64_LSW(x) ((x).Lower) + + +#ifndef NDEBUG + +/*****************************************************************************/ +/** +* This assert macro is to be used for functions that do not return anything +* (void). This in conjunction with the XWaitInAssert boolean can be used to +* accomodate tests so that asserts which fail allow execution to continue. +* +* @param expression is the expression to evaluate. If it evaluates to +* false, the assert occurs. +* +* @return Returns void unless the XWaitInAssert variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define XASSERT_VOID(expression) \ +{ \ + if (expression) \ + { \ + XAssertStatus = XASSERT_NONE; \ + } \ + else \ + { \ + XAssert(__FILE__, __LINE__); \ + XAssertStatus = XASSERT_OCCURRED; \ + return; \ + } \ +} + +/*****************************************************************************/ +/** +* This assert macro is to be used for functions that do return a value. This in +* conjunction with the XWaitInAssert boolean can be used to accomodate tests so +* that asserts which fail allow execution to continue. +* +* @param expression is the expression to evaluate. If it evaluates to false, +* the assert occurs. +* +* @return Returns 0 unless the XWaitInAssert variable is true, in which case +* no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define XASSERT_NONVOID(expression) \ +{ \ + if (expression) \ + { \ + XAssertStatus = XASSERT_NONE; \ + } \ + else \ + { \ + XAssert(__FILE__, __LINE__); \ + XAssertStatus = XASSERT_OCCURRED; \ + return 0; \ + } \ +} + +/*****************************************************************************/ +/** +* Always assert. This assert macro is to be used for functions that do not +* return anything (void). Use for instances where an assert should always +* occur. +* +* @return Returns void unless the XWaitInAssert variable is true, in which case +* no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define XASSERT_VOID_ALWAYS() \ +{ \ + XAssert(__FILE__, __LINE__); \ + XAssertStatus = XASSERT_OCCURRED; \ + return; \ +} + +/*****************************************************************************/ +/** +* Always assert. This assert macro is to be used for functions that do return +* a value. Use for instances where an assert should always occur. +* +* @return Returns void unless the XWaitInAssert variable is true, in which case +* no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define XASSERT_NONVOID_ALWAYS() \ +{ \ + XAssert(__FILE__, __LINE__); \ + XAssertStatus = XASSERT_OCCURRED; \ + return 0; \ +} + + +#else + +#define XASSERT_VOID(expression) +#define XASSERT_VOID_ALWAYS() +#define XASSERT_NONVOID(expression) +#define XASSERT_NONVOID_ALWAYS() +#endif + +/************************** Function Prototypes ******************************/ + +void XAssertSetCallback(XAssertCallback Routine); +void XNullHandler(void *NullParameter); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xdebug.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xdebug.h new file mode 100644 index 000000000..8ab5e212c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xdebug.h @@ -0,0 +1,61 @@ +#ifndef XDEBUG +#define XDEBUG + +#undef DEBUG + +#if defined(DEBUG) && !defined(NDEBUG) + +#ifndef XDEBUG_WARNING +#define XDEBUG_WARNING +#warning DEBUG is enabled +#endif + +int printf(const char *format, ...); + +#define XDBG_DEBUG_ERROR 0x00000001 /* error condition messages */ +#define XDBG_DEBUG_GENERAL 0x00000002 /* general debug messages */ +#define XDBG_DEBUG_ALL 0xFFFFFFFF /* all debugging data */ + +#define XDBG_DEBUG_FIFO_REG 0x00000100 /* display register reads/writes */ +#define XDBG_DEBUG_FIFO_RX 0x00000101 /* receive debug messages */ +#define XDBG_DEBUG_FIFO_TX 0x00000102 /* transmit debug messages */ +#define XDBG_DEBUG_FIFO_ALL 0x0000010F /* all fifo debug messages */ + +#define XDBG_DEBUG_TEMAC_REG 0x00000400 /* display register reads/writes */ +#define XDBG_DEBUG_TEMAC_RX 0x00000401 /* receive debug messages */ +#define XDBG_DEBUG_TEMAC_TX 0x00000402 /* transmit debug messages */ +#define XDBG_DEBUG_TEMAC_ALL 0x0000040F /* all temac debug messages */ + +#define XDBG_DEBUG_TEMAC_ADPT_RX 0x00000800 /* receive debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_TX 0x00000801 /* transmit debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_IOCTL 0x00000802 /* ioctl debug messages */ +#define XDBG_DEBUG_TEMAC_ADPT_MISC 0x00000803 /* debug msg for other routines */ +#define XDBG_DEBUG_TEMAC_ADPT_ALL 0x0000080F /* all temac adapter debug messages */ + +#define xdbg_current_types (XDBG_DEBUG_ERROR) + +#define xdbg_stmnt(x) x + +/* In VxWorks, if _WRS_GNU_VAR_MACROS is defined, special syntax is needed for + * macros that accept variable number of arguments + */ +#if defined(XENV_VXWORKS) && defined(_WRS_GNU_VAR_MACROS) +#define xdbg_printf(type, args...) (((type) & xdbg_current_types) ? printf (## args) : 0) +#else /* ANSI Syntax */ +#define xdbg_printf(type, ...) (((type) & xdbg_current_types) ? printf (__VA_ARGS__) : 0) +#endif + +#else /* defined(DEBUG) && !defined(NDEBUG) */ + +#define xdbg_stmnt(x) + +/* See VxWorks comments above */ +#if defined(XENV_VXWORKS) && defined(_WRS_GNU_VAR_MACROS) +#define xdbg_printf(type, args...) +#else /* ANSI Syntax */ +#define xdbg_printf(...) +#endif + +#endif /* defined(DEBUG) && !defined(NDEBUG) */ + +#endif /* XDEBUG */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv.h new file mode 100755 index 000000000..27cb76810 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv.h @@ -0,0 +1,177 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv.h +* +* Defines common services that are typically found in a host operating. +* environment. This include file simply includes an OS specific file based +* on the compile-time constant BUILD_ENV_*, where * is the name of the target +* environment. +* +* All services are defined as macros. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b ch 10/24/02 Added XENV_LINUX +* 1.00a rmm 04/17/02 First release +* </pre> +* +******************************************************************************/ + +#ifndef XENV_H /* prevent circular inclusions */ +#define XENV_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Select which target environment we are operating under + */ + +/* VxWorks target environment */ +#if defined XENV_VXWORKS +#include "xenv_vxworks.h" + +/* Linux target environment */ +#elif defined XENV_LINUX +#include "xenv_linux.h" + +/* Unit test environment */ +#elif defined XENV_UNITTEST +#include "ut_xenv.h" + +/* Integration test environment */ +#elif defined XENV_INTTEST +#include "int_xenv.h" + +/* Standalone environment selected */ +#else +#include "xenv_standalone.h" +#endif + + +/* + * The following comments specify the types and macro wrappers that are + * expected to be defined by the target specific header files + */ + +/**************************** Type Definitions *******************************/ + +/*****************************************************************************/ +/** + * + * XENV_TIME_STAMP + * + * A structure that contains a time stamp used by other time stamp macros + * defined below. This structure is processor dependent. + */ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** + * + * XENV_MEM_COPY(void *DestPtr, void *SrcPtr, unsigned Bytes) + * + * Copies a non-overlapping block of memory. + * + * @param DestPtr is the destination address to copy data to. + * @param SrcPtr is the source address to copy data from. + * @param Bytes is the number of bytes to copy. + * + * @return None + */ + +/*****************************************************************************/ +/** + * + * XENV_MEM_FILL(void *DestPtr, char Data, unsigned Bytes) + * + * Fills an area of memory with constant data. + * + * @param DestPtr is the destination address to set. + * @param Data contains the value to set. + * @param Bytes is the number of bytes to set. + * + * @return None + */ +/*****************************************************************************/ +/** + * + * XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr) + * + * Samples the processor's or external timer's time base counter. + * + * @param StampPtr is the storage for the retrieved time stamp. + * + * @return None + */ + +/*****************************************************************************/ +/** + * + * XENV_TIME_STAMP_DELTA_US(XTIME_STAMP *Stamp1Ptr, XTIME_STAMP* Stamp2Ptr) + * + * Computes the delta between the two time stamps. + * + * @param Stamp1Ptr - First sampled time stamp. + * @param Stamp1Ptr - Sedond sampled time stamp. + * + * @return An unsigned int value with units of microseconds. + */ + +/*****************************************************************************/ +/** + * + * XENV_TIME_STAMP_DELTA_MS(XTIME_STAMP *Stamp1Ptr, XTIME_STAMP* Stamp2Ptr) + * + * Computes the delta between the two time stamps. + * + * @param Stamp1Ptr - First sampled time stamp. + * @param Stamp1Ptr - Sedond sampled time stamp. + * + * @return An unsigned int value with units of milliseconds. + */ + +/*****************************************************************************//** + * + * XENV_USLEEP(unsigned delay) + * + * Delay the specified number of microseconds. + * + * @param delay is the number of microseconds to delay. + * + * @return None + */ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_linux.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_linux.h new file mode 100755 index 000000000..8a69b662d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_linux.h @@ -0,0 +1,241 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2007 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv_linux.h +* +* Defines common services specified by xenv.h. +* +* @note +* This file is not intended to be included directly by driver code. +* Instead, the generic xenv.h file is intended to be included by driver +* code. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a wgr 02/28/07 Added cache handling macros. +* 1.00a wgr 02/27/07 Simplified code. Deprecated old-style macro names. +* 1.00a xd 11/03/04 Improved support for doxygen. +* 1.00a ch 10/24/02 First release +* 1.10a wgr 03/22/07 Converted to new coding style. +* </pre> +* +* +******************************************************************************/ + +#ifndef XENV_LINUX_H +#define XENV_LINUX_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + +#include <asm/cache.h> +#include <asm/cacheflush.h> +#include <linux/string.h> +#include <linux/delay.h> + + +/****************************************************************************** + * + * MEMCPY / MEMSET related macros. + * + * Those macros are defined to catch legacy code in Xilinx drivers. The + * XENV_MEM_COPY and XENV_MEM_FILL macros were used in early Xilinx driver + * code. They are being replaced by memcpy() and memset() function calls. These + * macros are defined to catch any remaining occurences of those macros. + * + ******************************************************************************/ + +/*****************************************************************************/ +/** + * + * Copies a non-overlapping block of memory. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param SrcPtr + * Source address to copy data from. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + *****************************************************************************/ + +#define XENV_MEM_COPY(DestPtr, SrcPtr, Bytes) \ + memcpy(DestPtr, SrcPtr, Bytes) +/* do_not_use_XENV_MEM_COPY_use_memcpy_instead */ + + +/*****************************************************************************/ +/** + * + * Fills an area of memory with constant data. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param Data + * Value to set. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + *****************************************************************************/ + +#define XENV_MEM_FILL(DestPtr, Data, Bytes) \ + memset(DestPtr, Data, Bytes) +/* do_not_use_XENV_MEM_FILL_use_memset_instead */ + + +/****************************************************************************** + * + * TIME related macros + * + ******************************************************************************/ +/** + * A structure that contains a time stamp used by other time stamp macros + * defined below. This structure is processor dependent. + */ +typedef int XENV_TIME_STAMP; + +/*****************************************************************************/ +/** + * + * Time is derived from the 64 bit PPC timebase register + * + * @param StampPtr is the storage for the retrieved time stamp. + * + * @return None. + * + * @note + * + * Signature: void XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr) + * <br><br> + * This macro must be implemented by the user. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_GET(StampPtr) + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note + * + * This macro must be implemented by the user. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_US(Stamp1Ptr, Stamp2Ptr) (0) + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note + * + * This macro must be implemented by the user + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_MS(Stamp1Ptr, Stamp2Ptr) (0) + +/*****************************************************************************/ +/** + * + * Delay the specified number of microseconds. + * + * @param delay + * Number of microseconds to delay. + * + * @return None. + * + * @note XENV_USLEEP is deprecated. Use udelay() instead. + * + *****************************************************************************/ + +#define XENV_USLEEP(delay) udelay(delay) +/* do_not_use_XENV_MEM_COPY_use_memcpy_instead */ + + +/****************************************************************************** + * + * CACHE handling macros / mappings + * + * The implementation of the cache handling functions can be found in + * arch/microblaze. + * + * These #defines are simple mappings to the Linux API. + * + * The underlying Linux implementation will take care of taking the right + * actions depending on the configuration of the MicroBlaze processor in the + * system. + * + ******************************************************************************/ + +#define XCACHE_ENABLE_DCACHE() __enable_dcache() +#define XCACHE_DISABLE_DCACHE() __disable_dcache() +#define XCACHE_ENABLE_ICACHE() __enable_icache() +#define XCACHE_DISABLE_ICACHE() __disable_icache() + +#define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) invalidate_dcache_range((u32)(Addr), ((u32)(Addr)+(Len))) +#define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) flush_dcache_range((u32)(Addr), ((u32)(Addr)+(Len))) + +#define XCACHE_INVALIDATE_ICACHE_RANGE(Addr, Len) "XCACHE_INVALIDATE_ICACHE_RANGE unsupported" +#define XCACHE_FLUSH_ICACHE_RANGE(Addr, Len) flush_icache_range(Addr, Len) + +#define XCACHE_ENABLE_CACHE() \ + { XCACHE_ENABLE_DCACHE(); XCACHE_ENABLE_ICACHE(); } + +#define XCACHE_DISABLE_CACHE() \ + { XCACHE_DISABLE_DCACHE(); XCACHE_DISABLE_ICACHE(); } + + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_none.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_none.h new file mode 100755 index 000000000..bc837860f --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_none.h @@ -0,0 +1,41 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv_none.h +* +* This is a legacy file kept for backwards compatibility. +* +* Please modify your code to #include "xenv_standalone.h" instead. +* +* +******************************************************************************/ + +#warning ******************************************************************** +#warning * +#warning * Use of xenv_none.h deprecated. +#warning * Please include the new xenv_standalone.h file instead. +#warning * +#warning ******************************************************************** + +#include "xenv_standalone.h" + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_standalone.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_standalone.h new file mode 100644 index 000000000..f2b2b6887 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_standalone.h @@ -0,0 +1,356 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2008 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv_standalone.h +* +* Defines common services specified by xenv.h. +* +* @note +* This file is not intended to be included directly by driver code. +* Instead, the generic xenv.h file is intended to be included by driver +* code. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a wgr 02/28/07 Added cache handling macros. +* 1.00a wgr 02/27/07 Simplified code. Deprecated old-style macro names. +* 1.00a rmm 01/24/06 Implemented XENV_USLEEP. Assume implementation is being +* used under Xilinx standalone BSP. +* 1.00a xd 11/03/04 Improved support for doxygen. +* 1.00a rmm 03/21/02 First release +* 1.00a wgr 03/22/07 Converted to new coding style. +* 1.00a rpm 06/29/07 Added udelay macro for standalone +* 1.00a xd 07/19/07 Included xparameters.h as XPAR_ constants are referred +* to in MICROBLAZE section +* 1.00a ecm 09/19/08 updated for v7.20 of Microblaze, new functionality +* +* </pre> +* +* +******************************************************************************/ + +#ifndef XENV_STANDALONE_H +#define XENV_STANDALONE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +/****************************************************************************** + * + * Get the processor dependent includes + * + ******************************************************************************/ + +#include <string.h> + +#if defined __MICROBLAZE__ +# include "mb_interface.h" +# include "xparameters.h" /* XPAR constants used below in MB section */ + +#elif defined __PPC__ +# include "sleep.h" +# include "xcache_l.h" /* also include xcache_l.h for caching macros */ +#endif + +/****************************************************************************** + * + * MEMCPY / MEMSET related macros. + * + * The following are straight forward implementations of memset and memcpy. + * + * NOTE: memcpy may not work if source and target memory area are overlapping. + * + ******************************************************************************/ +/*****************************************************************************/ +/** + * + * Copies a non-overlapping block of memory. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param SrcPtr + * Source address to copy data from. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + * @note + * The use of XENV_MEM_COPY is deprecated. Use memcpy() instead. + * + * @note + * This implemention MAY BREAK work if source and target memory + * area are overlapping. + * + *****************************************************************************/ + +#define XENV_MEM_COPY(DestPtr, SrcPtr, Bytes) \ + memcpy((void *) DestPtr, (const void *) SrcPtr, (size_t) Bytes) + + + +/*****************************************************************************/ +/** + * + * Fills an area of memory with constant data. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param Data + * Value to set. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + * @note + * The use of XENV_MEM_FILL is deprecated. Use memset() instead. + * + *****************************************************************************/ + +#define XENV_MEM_FILL(DestPtr, Data, Bytes) \ + memset((void *) DestPtr, (int) Data, (size_t) Bytes) + + + +/****************************************************************************** + * + * TIME related macros + * + ******************************************************************************/ + +/** + * A structure that contains a time stamp used by other time stamp macros + * defined below. This structure is processor dependent. + */ +typedef int XENV_TIME_STAMP; + +/*****************************************************************************/ +/** + * + * Time is derived from the 64 bit PPC timebase register + * + * @param StampPtr is the storage for the retrieved time stamp. + * + * @return None. + * + * @note + * + * Signature: void XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr) + * <br><br> + * This macro must be implemented by the user. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_GET(StampPtr) + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note + * + * This macro must be implemented by the user. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_US(Stamp1Ptr, Stamp2Ptr) (0) + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note + * + * This macro must be implemented by the user. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_MS(Stamp1Ptr, Stamp2Ptr) (0) + +/*****************************************************************************/ +/** + * XENV_USLEEP(unsigned delay) + * + * Delay the specified number of microseconds. Not implemented without OS + * support. + * + * @param delay + * Number of microseconds to delay. + * + * @return None. + * + *****************************************************************************/ + +#ifdef __PPC__ +#define XENV_USLEEP(delay) usleep(delay) +#define udelay(delay) usleep(delay) +#else +#define XENV_USLEEP(delay) +#define udelay(delay) +#endif + + +/****************************************************************************** + * + * CACHE handling macros / mappings + * + ******************************************************************************/ +/****************************************************************************** + * + * Processor independent macros + * + ******************************************************************************/ + +#define XCACHE_ENABLE_CACHE() \ + { XCACHE_ENABLE_DCACHE(); XCACHE_ENABLE_ICACHE(); } + +#define XCACHE_DISABLE_CACHE() \ + { XCACHE_DISABLE_DCACHE(); XCACHE_DISABLE_ICACHE(); } + + +/****************************************************************************** + * + * MicroBlaze case + * + * NOTE: Currently the following macros will only work on systems that contain + * only ONE MicroBlaze processor. Also, the macros will only be enabled if the + * system is built using a xparameters.h file. + * + ******************************************************************************/ + +#if defined __MICROBLAZE__ + +/* Check if MicroBlaze data cache was built into the core. + */ +#if (XPAR_MICROBLAZE_USE_DCACHE == 1) +# define XCACHE_ENABLE_DCACHE() microblaze_enable_dcache() +# define XCACHE_DISABLE_DCACHE() microblaze_disable_dcache() +# define XCACHE_INVALIDATE_DCACHE() microblaze_invalidate_dcache() + +# define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) \ + microblaze_invalidate_dcache_range((int)(Addr), (int)(Len)) + +#if (XPAR_MICROBLAZE_DCACHE_USE_WRITEBACK == 1) +# define XCACHE_FLUSH_DCACHE() microblaze_flush_dcache() +# define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + microblaze_flush_dcache_range((int)(Addr), (int)(Len)) +#else +# define XCACHE_FLUSH_DCACHE() microblaze_invalidate_dcache() +# define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + microblaze_invalidate_dcache_range((int)(Addr), (int)(Len)) +#endif /*XPAR_MICROBLAZE_DCACHE_USE_WRITEBACK*/ + +#else +# define XCACHE_ENABLE_DCACHE() +# define XCACHE_DISABLE_DCACHE() +# define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) +# define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) +#endif /*XPAR_MICROBLAZE_USE_DCACHE*/ + + +/* Check if MicroBlaze instruction cache was built into the core. + */ +#if (XPAR_MICROBLAZE_USE_ICACHE == 1) +# define XCACHE_ENABLE_ICACHE() microblaze_enable_icache() +# define XCACHE_DISABLE_ICACHE() microblaze_disable_icache() + +# define XCACHE_INVALIDATE_ICACHE() microblaze_invalidate_icache() + +# define XCACHE_INVALIDATE_ICACHE_RANGE(Addr, Len) \ + microblaze_invalidate_icache_range((int)(Addr), (int)(Len)) + +#else +# define XCACHE_ENABLE_ICACHE() +# define XCACHE_DISABLE_ICACHE() +#endif /*XPAR_MICROBLAZE_USE_ICACHE*/ + + +/****************************************************************************** + * + * PowerPC case + * + * Note that the XCACHE_ENABLE_xxx functions are hardcoded to enable a + * specific memory region (0x80000001). Each bit (0-30) in the regions + * bitmask stands for 128MB of memory. Bit 31 stands for the upper 2GB + * range. + * + * regions --> cached address range + * ------------|-------------------------------------------------- + * 0x80000000 | [0, 0x7FFFFFF] + * 0x00000001 | [0xF8000000, 0xFFFFFFFF] + * 0x80000001 | [0, 0x7FFFFFF],[0xF8000000, 0xFFFFFFFF] + * + ******************************************************************************/ + +#elif defined __PPC__ + +#define XCACHE_ENABLE_DCACHE() XCache_EnableDCache(0x80000001) +#define XCACHE_DISABLE_DCACHE() XCache_DisableDCache() +#define XCACHE_ENABLE_ICACHE() XCache_EnableICache(0x80000001) +#define XCACHE_DISABLE_ICACHE() XCache_DisableICache() + +#define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) \ + XCache_InvalidateDCacheRange((unsigned int)(Addr), (unsigned)(Len)) + +#define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + XCache_FlushDCacheRange((unsigned int)(Addr), (unsigned)(Len)) + +#define XCACHE_INVALIDATE_ICACHE() XCache_InvalidateICache() + + +/****************************************************************************** + * + * Unknown processor / architecture + * + ******************************************************************************/ + +#else +/* #error "Unknown processor / architecture. Must be MicroBlaze or PowerPC." */ +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* #ifndef XENV_STANDALONE_H */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_vxworks.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_vxworks.h new file mode 100755 index 000000000..4269f10e0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xenv_vxworks.h @@ -0,0 +1,258 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2007 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xenv_vxworks.h +* +* Defines common services specified by xenv.h. +* +* @note +* This file is not intended to be included directly by driver code. +* Instead, the generic xenv.h file is intended to be included by driver +* code. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a wgr 02/28/07 Added cache handling macros. +* 1.00a wgr 02/27/07 Simplified code. Deprecated old-style macro names. +* 1.00a xd 11/03/04 Improved support for doxygen. +* rmm 09/13/03 CR 177068: Fix compiler warning in XENV_MEM_FILL +* rmm 10/24/02 Added XENV_USLEEP macro +* 1.00a rmm 07/16/01 First release +* 1.10a wgr 03/22/07 Converted to new coding style. +* </pre> +* +* +******************************************************************************/ + +#ifndef XENV_VXWORKS_H +#define XENV_VXWORKS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xbasic_types.h" +#include "vxWorks.h" +#include "vxLib.h" +#include "sysLibExtra.h" +#include "cacheLib.h" +#include <string.h> + +/*****************************************************************************/ +/** + * + * Copies a non-overlapping block of memory. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param SrcPtr + * Source address to copy data from. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + * @note XENV_MEM_COPY is deprecated. Use memcpy() instead. + * + *****************************************************************************/ + +#define XENV_MEM_COPY(DestPtr, SrcPtr, Bytes) \ + memcpy((void *) DestPtr, (const void *) SrcPtr, (size_t) Bytes) + + +/*****************************************************************************/ +/** + * + * Fills an area of memory with constant data. + * + * @param DestPtr + * Destination address to copy data to. + * + * @param Data + * Value to set. + * + * @param Bytes + * Number of bytes to copy. + * + * @return None. + * + * @note XENV_MEM_FILL is deprecated. Use memset() instead. + * + *****************************************************************************/ + +#define XENV_MEM_FILL(DestPtr, Data, Bytes) \ + memset((void *) DestPtr, (int) Data, (size_t) Bytes) + + +#if (CPU_FAMILY==PPC) +/** + * A structure that contains a time stamp used by other time stamp macros + * defined below. This structure is processor dependent. + */ +typedef struct +{ + u32 TimeBaseUpper; + u32 TimeBaseLower; +} XENV_TIME_STAMP; + +/*****************************************************************************/ +/** + * + * Time is derived from the 64 bit PPC timebase register + * + * @param StampPtr is the storage for the retrieved time stamp. + * + * @return None. + * + * @note + * + * Signature: void XENV_TIME_STAMP_GET(XTIME_STAMP *StampPtr) + * + *****************************************************************************/ +#define XENV_TIME_STAMP_GET(StampPtr) \ +{ \ + vxTimeBaseGet((UINT32*)&(StampPtr)->TimeBaseUpper, \ + (UINT32*)&(StampPtr)->TimeBaseLower); \ +} + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note None. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_US(Stamp1Ptr, Stamp2Ptr) (0) + +/*****************************************************************************/ +/** + * + * This macro is not yet implemented and always returns 0. + * + * @param Stamp1Ptr is the first sampled time stamp. + * @param Stamp2Ptr is the second sampled time stamp. + * + * @return 0 + * + * @note + * + * None. + * + *****************************************************************************/ +#define XENV_TIME_STAMP_DELTA_MS(Stamp1Ptr, Stamp2Ptr) (0) + + +/* For non-PPC systems the above macros are not defined. Generate a error to + * make the developer aware of the problem. + */ +#else +#error "XENV_TIME_STAMP_GET used in a non-PPC system. Aborting." +#endif + + +/*****************************************************************************/ +/** + * + * Delay the specified number of microseconds. + * + * @param delay + * Number of microseconds to delay. + * + * @return None. + * + *****************************************************************************/ + +#define XENV_USLEEP(delay) sysUsDelay(delay) + +#define udelay(delay) sysUsDelay(delay) + + +/****************************************************************************** + * + * CACHE handling macros / mappings + * + ******************************************************************************/ +/****************************************************************************** + * + * PowerPC case + * + ******************************************************************************/ + +#if (CPU_FAMILY==PPC) + +#define XCACHE_ENABLE_CACHE() \ + { XCACHE_ENABLE_DCACHE(); XCACHE_ENABLE_ICACHE(); } + +#define XCACHE_DISABLE_CACHE() \ + { XCACHE_DISABLE_DCACHE(); XCACHE_DISABLE_ICACHE(); } + + +#define XCACHE_ENABLE_DCACHE() cacheEnable(DATA_CACHE) +#define XCACHE_DISABLE_DCACHE() cacheDisable(DATA_CACHE) +#define XCACHE_ENABLE_ICACHE() cacheEnable(INSTRUCTION_CACHE) +#define XCACHE_DISABLE_ICACHE() cacheDisable(INSTRUCTION_CACHE) + + +#define XCACHE_INVALIDATE_DCACHE_RANGE(Addr, Len) \ + cacheInvalidate(DATA_CACHE, (void *)(Addr), (Len)) + +#define XCACHE_FLUSH_DCACHE_RANGE(Addr, Len) \ + cacheFlush(DATA_CACHE, (void *)(Addr), (Len)) + +#define XCACHE_INVALIDATE_ICACHE_RANGE(Addr, Len) \ + cacheInvalidate(INSTRUCTION_CACHE, (void *)(Addr), (Len)) + +#define XCACHE_FLUSH_ICACHE_RANGE(Addr, Len) \ + cacheFlush(INSTRUCTION_CACHE, (void *)(Addr), (Len)) + + +/****************************************************************************** + * + * Unknown processor / architecture + * + ******************************************************************************/ + +#else +#error "Unknown processor / architecture. Must be PPC for VxWorks." +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* #ifdef XENV_VXWORKS_H */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xparameters.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xparameters.h new file mode 100755 index 000000000..be21689f0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xparameters.h @@ -0,0 +1,738 @@ +/* $Id: xparameters.h,v 1.83.2.11 2011/05/18 03:23:57 svemula Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2002-2011 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xparameters.h +* +* This file contains system parameters for the Xilinx device driver environment. +* It is a representation of the system in that it contains the number of each +* device in the system as well as the parameters and memory map for each +* device. The user can view this file to obtain a summary of the devices in +* their system and the device parameters. +* +* This file may be automatically generated by a design tool such as System +* Generator. +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#ifndef XPARAMETERS_H /* prevent circular inclusions */ +#define XPARAMETERS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* unifying driver changes + +added XPAR_INTC_0_ACK_BEFORE, XPAR_INTC_1_ACK_BEFORE +changed XPAR_INTC_MAX_ID to XPAR_INTC_MAX_NUM_INTR_INPUTS +deleted XPAR_INTC_0_MAX_ID, XPAR_INTC_1_MAX_ID + +*/ + +/************************** Constant Definitions *****************************/ + +/* + * The following constants are for each device. + * + * An instance must exist for each physical device that exists in the system. + * The device IDs in the following constants are unique between all devices to + * allow device IDs to be searched in the future. + */ + +/***************************************************************************** + * + * System Level defines. These constants are for devices that do not require + * a device driver. Examples of these types of devices include volatile RAM + * devices. + */ +#define XPAR_ZBT_NUM_INSTANCES 1 +#define XPAR_ZBT_0_BASE 0x00000000 +#define XPAR_ZBT_0_SIZE 0x00100000 + +#define XPAR_SRAM_NUM_INSTANCES 1 +#define XPAR_SRAM_0_BASE 0x00100000 +#define XPAR_SRAM_0_SIZE 0x00200000 + +#define XPAR_DDR_NUM_INSTANCES 1 +#define XPAR_DDR_0_BASE 0xF0000000 +#define XPAR_DDR_0_SIZE 0x01000000 + +#define XPAR_CORE_CLOCK_FREQ_HZ 12500000 + +#define XPAR_CPU_PPC405_CORE_CLOCK_FREQ_HZ XPAR_CORE_CLOCK_FREQ_HZ + +/***************************************************************************** + * + * Interrupt Controller (Intc) defines. + * DeviceID starts at 0 + */ +#define XPAR_XINTC_NUM_INSTANCES 2 /* Number of instances */ +#define XPAR_INTC_MAX_NUM_INTR_INPUTS 31 /* max # inputs of all */ +#define XPAR_INTC_SINGLE_BASEADDR 0x70800000 /* low level driver base */ +#define XPAR_INTC_SINGLE_DEVICE_ID 0 /* single instance ID */ +#define XPAR_INTC_SINGLE_ACK_BEFORE 0xFFFF00FF /* low level driver */ + +#define XPAR_INTC_0_DEVICE_ID 1 /* Device ID for instance */ +#define XPAR_INTC_0_ACK_BEFORE 0xFFFF00FF /* Ack timing, before/after */ +#define XPAR_INTC_0_BASEADDR 0x70800000 /* Register base address */ + +#define XPAR_INTC_0_UARTLITE_0_VEC_ID 4 /* Interrupt source for vector */ +#define XPAR_INTC_0_WDTTB_0_VEC_ID 5 /* Interrupt source for vector */ +#define XPAR_INTC_0_WD_0_VEC_ID 6 /* Interrupt source for vector */ +#define XPAR_INTC_0_TMRCTR_0_VEC_ID 7 /* Interrupt source for vector */ +#define XPAR_INTC_0_SPI_0_VEC_ID 11 /* Interrupt source for vector */ +#define XPAR_INTC_0_IIC_0_VEC_ID 12 /* Interrupt source for vector */ +#define XPAR_INTC_0_UARTNS550_0_VEC_ID 13 /* Interrupt source for vector */ +#define XPAR_INTC_0_UARTNS550_1_VEC_ID 14 /* Interrupt source for vector */ +#define XPAR_INTC_0_EMAC_0_VEC_ID 15 /* Interrupt source for vector */ + +#define XPAR_INTC_0_AXIDMA_0_S2MM_INTROUT_VEC_ID 16 /* Intr ID for AXIDMA rx */ +#define XPAR_INTC_0_AXIDMA_0_MM2S_INTROUT_VEC_ID 17 /* Intr ID for AXIDMA tx */ + +#define XPAR_INTC_0_AXICDMA_0_VEC_ID 18 /* Intr ID for AXICDMA */ + +#define XPAR_INTC_0_AXIVDMA_0_S2MM_INTROUT_VEC_ID 19 /* AXIVDMA write intr */ +#define XPAR_INTC_0_AXIVDMA_0_MM2S_INTROUT_VEC_ID 20 /* AXIVDMA read intr */ + +#define XPAR_INTC_1_DEVICE_ID 2 /* Device ID for instance */ +#define XPAR_INTC_1_ACK_BEFORE 0xFFFF00FF /* Ack timing, before/after */ +#define XPAR_INTC_1_BASEADDR 0x70800020 /* Register base address */ + +#define XPAR_INTC_1_OPB_TO_PLB_ERR_VEC_ID 0 /* Interrupt source for vector */ +#define XPAR_INTC_1_PLB_TO_OPB_ERR_VEC_ID 1 /* Interrupt source for vector */ + +/***************************************************************************** + * + * AXI DMA defines + */ + +#define XPAR_XAXIDMA_NUM_INSTANCES 1 + +#define XPAR_AXI_DMA_0_DEVICE_ID 0 +#define XPAR_AXI_DMA_0_BASEADDR 0x40000000 +#define XPAR_AXI_DMA_0_HIGHADDR 0x4000007F +#define XPAR_AXI_DMA_0_SG_INCLUDE_STSCNTRL_STRM 1 +#define XPAR_AXI_DMA_0_INCLUDE_MM2S_DRE 1 +#define XPAR_AXI_DMA_0_INCLUDE_S2MM_DRE 1 +#define XPAR_AXI_DMA_0_INCLUDE_MM2S 1 +#define XPAR_AXI_DMA_0_INCLUDE_S2MM 1 +#define XPAR_AXI_DMA_0_M_AXIS_MM2S_DATA_WIDTH 32 +#define XPAR_AXI_DMA_0_S_AXIS_S2MM_DATA_WIDTH 32 + +/***************************************************************************** + * + * AXI Central DMA defines + */ + +#define XPAR_XAXICDMA_NUM_INSTANCES 1 + +#define XPAR_AXI_CDMA_0_DEVICE_ID 0 +#define XPAR_AXI_CDMA_0_BASEADDR 0x40001000 +#define XPAR_AXI_CDMA_0_HIGHADDR 0x4000107F +#define XPAR_AXI_CDMA_0_INCLUDE_DRE 1 +#define XPAR_AXI_CDMA_0_USE_DATAMOVER_LITE 0 +#define XPAR_AXI_CDMA_0_M_AXI_DATA_WIDTH 32 + +/***************************************************************************** + * + * AXI Video DMA defines + */ +#define XPAR_XAXIVDMA_NUM_INSTANCES 1 + +#define XPAR_AXI_VDMA_0_DEVICE_ID 0 +#define XPAR_AXI_VDMA_0_BASEADDR 0x40002000 +#define XPAR_AXI_VDMA_0_NUM_FSTORES 16 +#define XPAR_AXI_VDMA_0_INCLUDE_MM2S 1 +#define XPAR_AXI_VDMA_0_INCLUDE_MM2S_DRE 1 +#define XPAR_AXI_VDMA_0_M_AXIS_MM2S_DATA_WIDTH 32 +#define XPAR_AXI_VDMA_0_INCLUDE_S2MM 1 +#define XPAR_AXI_VDMA_0_INCLUDE_S2MM_DRE 1 +#define XPAR_AXI_VDMA_0_S_AXIS_S2MM_DATA_WIDTH 32 + +/***************************************************************************** + * + * Ethernet 10/100 MAC defines. + * DeviceID starts at 10 + */ +#define XPAR_XEMAC_NUM_INSTANCES 1 /* Number of instances */ + +#define XPAR_EMAC_0_DEVICE_ID 10 /* Device ID for instance */ +#define XPAR_EMAC_0_BASEADDR 0x60000000/* Device base address */ +#define XPAR_EMAC_0_DMA_PRESENT FALSE /* Does device have DMA? */ +#define XPAR_EMAC_0_ERR_COUNT_EXIST TRUE /* Does device have counters? */ +#define XPAR_EMAC_0_MII_EXIST TRUE /* Does device support MII? */ + +/***************************************************************************** + * + * NS16550 UART defines. + * DeviceID starts at 20 + */ +#define XPAR_XUARTNS550_NUM_INSTANCES 1 /* Number of instances */ + +#define XPAR_UARTNS550_0_DEVICE_ID 20 /* Device ID for instance */ +#define XPAR_UARTNS550_0_BASEADDR 0xA0010000 /* IPIF base address */ +#define XPAR_UARTNS550_0_CLOCK_HZ (66000000L)/* 66 MHz clock */ + +#define XPAR_UARTNS550_1_DEVICE_ID 21 /* Device ID for instance */ +#define XPAR_UARTNS550_1_BASEADDR 0xA0000000 /* IPIF base address */ +#define XPAR_UARTNS550_1_CLOCK_HZ (66000000L)/* 66 MHz clock */ + +/***************************************************************************** + * + * UartLite defines. + * DeviceID starts at 30 + */ +#define XPAR_XUARTLITE_NUM_INSTANCES 1 /* Number of instances */ + +#define XPAR_UARTLITE_0_DEVICE_ID 30 /* Device ID for instance */ +#define XPAR_UARTLITE_0_BASEADDR 0xA0020000 /* Device base address */ +#define XPAR_UARTLITE_0_BAUDRATE 19200 /* Baud rate */ +#define XPAR_UARTLITE_0_USE_PARITY FALSE /* Parity generator enabled */ +#define XPAR_UARTLITE_0_ODD_PARITY FALSE /* Type of parity generated */ +#define XPAR_UARTLITE_0_DATA_BITS 8 /* Data bits */ + +/***************************************************************************** + * + * ATM controller defines. + * DeviceID starts at 40 + */ +#define XPAR_XATMC_NUM_INSTANCES 1 /* Number of instances */ + +#define XPAR_ATMC_0_DEVICE_ID 40 /* Device ID for instance */ +#define XPAR_ATMC_0_BASEADDR 0x70000000 /* Device base address */ +#define XPAR_ATMC_0_DMA_PRESENT FALSE /* Does device have DMA? */ + +/***************************************************************************** + * + * Serial Peripheral Interface (SPI) defines. + * DeviceID starts at 50 + */ +#define XPAR_XSPI_NUM_INSTANCES 2 /* Number of instances */ + +#define XPAR_SPI_0_DEVICE_ID 50 /* Device ID for instance */ +#define XPAR_SPI_0_BASEADDR 0x50000000 /* Device base address */ +#define XPAR_SPI_0_FIFO_EXIST TRUE /* Does device have FIFOs? */ +#define XPAR_SPI_0_SLAVE_ONLY FALSE /* Is the device slave only? */ +#define XPAR_SPI_0_NUM_SS_BITS 32 /* Number of slave select bits */ + +#define XPAR_SPI_1_DEVICE_ID 51 /* Device ID for instance */ +#define XPAR_SPI_1_BASEADDR 0x50000100 /* IPIF base address */ +#define XPAR_SPI_1_FIFO_EXIST TRUE /* Does device have FIFOs? */ +#define XPAR_SPI_1_SLAVE_ONLY FALSE /* Is the device slave only? */ +#define XPAR_SPI_1_NUM_SS_BITS 32 /* Number of slave select bits */ + +/***************************************************************************** + * + * OPB Arbiter defines. + * DeviceID starts at 60 + */ +#define XPAR_XOPBARB_NUM_INSTANCES 1 /* Number of instances */ + +#define XPAR_OPBARB_0_DEVICE_ID 60 /* Device ID for instance */ +#define XPAR_OPBARB_0_BASEADDR 0x80000000 /* Register base address */ +#define XPAR_OPBARB_0_NUM_MASTERS 8 /* Number of masters on bus */ + +/***************************************************************************** + * + * Watchdog timer/timebase (WdtTb) defines. + * DeviceID starts at 70 + */ +#define XPAR_XWDTTB_NUM_INSTANCES 1 /* Number of instances */ + +#define XPAR_WDTTB_0_DEVICE_ID 70 /* Device ID for instance */ +#define XPAR_WDTTB_0_BASEADDR 0x70800040 /* Register base address */ + +/***************************************************************************** + * + * Timer Counter (TmrCtr) defines. + * DeviceID starts at 80 + */ +#define XPAR_XTMRCTR_NUM_INSTANCES 2 /* Number of instances */ + +#define XPAR_TMRCTR_0_DEVICE_ID 80 /* Device ID for instance */ +#define XPAR_TMRCTR_0_BASEADDR 0x70800100 /* Register base address */ + +/***************************************************************************** + * + * IIC defines. + * DeviceID starts at 90 + */ +#define XPAR_XIIC_NUM_INSTANCES 2 /* Number of instances */ + +#define XPAR_IIC_0_DEVICE_ID 90 /* Device ID for instance */ +#define XPAR_IIC_0_BASEADDR 0xA8000000 /* Device base address */ +#define XPAR_IIC_0_TEN_BIT_ADR TRUE /* Supports 10 bit addresses */ + +#define XPAR_IIC_1_DEVICE_ID 91 /* Device ID for instance */ +#define XPAR_IIC_1_BASEADDR 0xA8000000 /* Device base address */ +#define XPAR_IIC_1_TEN_BIT_ADR TRUE /* Supports 10 bit addresses */ + +/***************************************************************************** + * + * Flash defines. + * DeviceID starts at 100 + */ +#define XPAR_XFLASH_NUM_INSTANCES 1 /* Number of instances */ +#define XPAR_FLASH_INTEL_SUPPORT /* Include intel flash support */ + +#define XPAR_FLASH_0_DEVICE_ID 100 /* Device ID for first instance +*/ +#define XPAR_FLASH_0_BASEADDR 0xFF000000 /* Base address of parts */ +#define XPAR_FLASH_0_NUM_PARTS 2 /* Number of parts in array */ +#define XPAR_FLASH_0_PART_WIDTH 2 /* Width of each part in bytes */ +#define XPAR_FLASH_0_PART_MODE 2 /* Mode of each part in bytes */ + +/***************************************************************************** + * + * GPIO defines. + * DeviceID starts at 110 + */ +#define XPAR_XGPIO_NUM_INSTANCES 1 + +#define XPAR_GPIO_0_DEVICE_ID 110 /* Device ID for instance */ +#define XPAR_GPIO_0_BASEADDR 0x90000000 /* Register base address */ +#define XPAR_GPIO_0_INTERRUPT_PRESENT 0 /* Interrupts supported? */ +#define XPAR_GPIO_0_IS_DUAL 0 /* Dual channels supported? */ + +/***************************************************************************** + * + * EMC defines. + * DeviceID starts at 120 + */ +#define XPAR_XEMC_NUM_INSTANCES 1 + +#define XPAR_EMC_0_DEVICE_ID 120 /* Device ID for instance */ +#define XPAR_EMC_0_BASEADDR 0xE0000000 /* Register base address */ +#define XPAR_EMC_0_NUM_BANKS_MEM 3 /* Number of banks */ + +/***************************************************************************** + * + * PLB Arbiter defines. + * DeviceID starts at 130 + */ +#define XPAR_XPLBARB_NUM_INSTANCES 1 + +#define XPAR_PLBARB_0_DEVICE_ID 130 /* Device ID for instance */ +#define XPAR_PLBARB_0_BASEADDR 0x300 /* Register base address */ +#define XPAR_PLBARB_0_NUM_MASTERS 1 /* Number of masters on bus */ + +/***************************************************************************** + * + * PLB To OPB Bridge defines. + * DeviceID starts at 140 + */ +#define XPAR_XPLB2OPB_NUM_INSTANCES 1 + +#define XPAR_PLB2OPB_0_DEVICE_ID 140 /* Device ID for instance */ +#define XPAR_PLB2OPB_0_DCR_BASEADDR 0x0 /* DCR Register base address +*/ +#define XPAR_PLB2OPB_0_NUM_MASTERS 1 /* Number of masters on bus +*/ + + +/***************************************************************************** + * + * OPB To PLB Bridge defines. + * DeviceID starts at 150 + */ +#define XPAR_XOPB2PLB_NUM_INSTANCES 1 +#define XPAR_XOPB2PLB_ANY_OPB_REG_INTF /* Accessible from OPB, not DCR */ + +#define XPAR_OPB2PLB_0_DEVICE_ID 150 /* Device ID for instance */ +#define XPAR_OPB2PLB_0_OPB_BASEADDR 0x0 /* Register base address */ +#define XPAR_OPB2PLB_0_DCR_BASEADDR 0x0 /* DCR Register base address */ + + +/***************************************************************************** + * + * System ACE defines. + * DeviceID starts at 160 + */ +#define XPAR_XSYSACE_NUM_INSTANCES 1 + +#define XPAR_SYSACE_0_DEVICE_ID 160 /* Device ID for instance */ +#define XPAR_SYSACE_0_BASEADDR 0xCF000000 /* Register base address */ + + +/***************************************************************************** + * + * HDLC defines. + * DeviceID starts at 170 + */ +#define XPAR_XHDLC_NUM_INSTANCES 1 + +#define XPAR_HDLC_0_DEVICE_ID 170 /* Device ID for instance */ +#define XPAR_HDLC_0_BASEADDR 0x60010000 /* Register base address */ +#define XPAR_HDLC_0_TX_MEM_DEPTH 2048 /* Tx FIFO depth (bytes) */ +#define XPAR_HDLC_0_RX_MEM_DEPTH 2048 /* Rx FIFO depth (bytes) */ +#define XPAR_HDLC_0_DMA_PRESENT 3 /* DMA SG in hardware */ + + +/***************************************************************************** + * + * PS2 Reference driver defines. + * DeviceID starts at 180 + */ +#define XPAR_XPS2_NUM_INSTANCES 2 + +#define XPAR_PS2_0_DEVICE_ID 180 /* Device ID for instance */ +#define XPAR_PS2_0_BASEADDR 0x40010000 /* Register base address */ + +#define XPAR_PS2_1_DEVICE_ID 181 /* Device ID for instance */ +#define XPAR_PS2_1_BASEADDR 0x40020000 /* Register base address */ + +/***************************************************************************** + * + * Rapid IO defines. + * DeviceID starts at 190 + */ +#define XPAR_XRAPIDIO_NUM_INSTANCES 1 + +#define XPAR_RAPIDIO_0_DEVICE_ID 190 /* Device ID for instance */ +#define XPAR_RAPIDIO_0_BASEADDR 0x60000000 /* Register base address */ + + +/***************************************************************************** + * + * PCI defines. + * DeviceID starts at 200 + */ +#define XPAR_XPCI_NUM_INSTANCES 1 +#define XPAR_OPB_PCI_1_DEVICE_ID 200 +#define XPAR_OPB_PCI_1_BASEADDR 0x86000000 +#define XPAR_OPB_PCI_1_HIGHADDR 0x860001FF +#define XPAR_OPB_PCI_1_PCIBAR_0 0x10000000 +#define XPAR_OPB_PCI_1_PCIBAR_LEN_0 27 +#define XPAR_OPB_PCI_1_PCIBAR2IPIF_0 0xF0000000 +#define XPAR_OPB_PCI_1_PCIBAR_ENDIAN_TRANSLATE_EN_0 0 +#define XPAR_OPB_PCI_1_PCI_PREFETCH_0 1 +#define XPAR_OPB_PCI_1_PCI_SPACETYPE_0 1 +#define XPAR_OPB_PCI_1_PCIBAR_1 0x3F000000 +#define XPAR_OPB_PCI_1_PCIBAR_LEN_1 15 +#define XPAR_OPB_PCI_1_PCIBAR2IPIF_1 0xC0FF8000 +#define XPAR_OPB_PCI_1_PCIBAR_ENDIAN_TRANSLATE_EN_1 0 +#define XPAR_OPB_PCI_1_PCI_PREFETCH_1 1 +#define XPAR_OPB_PCI_1_PCI_SPACETYPE_1 1 +#define XPAR_OPB_PCI_1_PCIBAR_2 0x5F000000 +#define XPAR_OPB_PCI_1_PCIBAR_LEN_2 16 +#define XPAR_OPB_PCI_1_PCIBAR2IPIF_2 0x00000000 +#define XPAR_OPB_PCI_1_PCIBAR_ENDIAN_TRANSLATE_EN_2 0 +#define XPAR_OPB_PCI_1_PCI_PREFETCH_2 1 +#define XPAR_OPB_PCI_1_PCI_SPACETYPE_2 1 +#define XPAR_OPB_PCI_1_IPIFBAR_0 0x80000000 +#define XPAR_OPB_PCI_1_IPIF_HIGHADDR_0 0x81FFFFFF +#define XPAR_OPB_PCI_1_IPIFBAR2PCI_0 0xF0000000 +#define XPAR_OPB_PCI_1_IPIFBAR_ENDIAN_TRANSLATE_EN_0 0 +#define XPAR_OPB_PCI_1_IPIF_PREFETCH_0 1 +#define XPAR_OPB_PCI_1_IPIF_SPACETYPE_0 1 +#define XPAR_OPB_PCI_1_IPIFBAR_1 0x82000000 +#define XPAR_OPB_PCI_1_IPIF_HIGHADDR_1 0x820007FF +#define XPAR_OPB_PCI_1_IPIFBAR2PCI_1 0xCE000000 +#define XPAR_OPB_PCI_1_IPIFBAR_ENDIAN_TRANSLATE_EN_1 0 +#define XPAR_OPB_PCI_1_IPIF_PREFETCH_1 1 +#define XPAR_OPB_PCI_1_IPIF_SPACETYPE_1 1 +#define XPAR_OPB_PCI_1_IPIFBAR_2 0x82320000 +#define XPAR_OPB_PCI_1_IPIF_HIGHADDR_2 0x8232FFFF +#define XPAR_OPB_PCI_1_IPIFBAR2PCI_2 0x00010000 +#define XPAR_OPB_PCI_1_IPIFBAR_ENDIAN_TRANSLATE_EN_2 0 +#define XPAR_OPB_PCI_1_IPIF_PREFETCH_2 1 +#define XPAR_OPB_PCI_1_IPIF_SPACETYPE_2 1 +#define XPAR_OPB_PCI_1_IPIFBAR_3 0x82330000 +#define XPAR_OPB_PCI_1_IPIF_HIGHADDR_3 0x8233FFFF +#define XPAR_OPB_PCI_1_IPIFBAR2PCI_3 0x00010000 +#define XPAR_OPB_PCI_1_IPIFBAR_ENDIAN_TRANSLATE_EN_3 0 +#define XPAR_OPB_PCI_1_IPIF_PREFETCH_3 1 +#define XPAR_OPB_PCI_1_IPIF_SPACETYPE_3 0 +#define XPAR_OPB_PCI_1_IPIFBAR_4 0x82340000 +#define XPAR_OPB_PCI_1_IPIF_HIGHADDR_4 0x8234FFFF +#define XPAR_OPB_PCI_1_IPIFBAR2PCI_4 0x00010000 +#define XPAR_OPB_PCI_1_IPIFBAR_ENDIAN_TRANSLATE_EN_4 0 +#define XPAR_OPB_PCI_1_IPIF_PREFETCH_4 0 +#define XPAR_OPB_PCI_1_IPIF_SPACETYPE_4 0 +#define XPAR_OPB_PCI_1_IPIFBAR_5 0x82350000 +#define XPAR_OPB_PCI_1_IPIF_HIGHADDR_5 0x8235FFFF +#define XPAR_OPB_PCI_1_IPIFBAR2PCI_5 0x00010000 +#define XPAR_OPB_PCI_1_IPIFBAR_ENDIAN_TRANSLATE_EN_5 0 +#define XPAR_OPB_PCI_1_IPIF_PREFETCH_5 1 +#define XPAR_OPB_PCI_1_IPIF_SPACETYPE_5 1 +#define XPAR_OPB_PCI_1_DMA_BASEADDR 0x87000000 +#define XPAR_OPB_PCI_1_DMA_HIGHADDR 0x8700007F +#define XPAR_OPB_PCI_1_DMA_CHAN_TYPE 0 +#define XPAR_OPB_PCI_1_DMA_LENGTH_WIDTH 11 + +/***************************************************************************** + * + * GEmac defines. + * DeviceID starts at 210 + */ +#define XPAR_XGEMAC_NUM_INSTANCES 1 +#define XPAR_GEMAC_0_DEVICE_ID 210 +#define XPAR_GEMAC_0_BASEADDR 0x61000000 +#define XPAR_GEMAC_0_DMA_TYPE 9 +#define XPAR_GEMAC_0_MIIM_EXIST 0 +#define XPAR_GEMAC_0_INCLUDE_STATS 0 + + +/***************************************************************************** + * + * Touchscreen defines . + * DeviceID starts at 220 + */ +#define XPAR_XTOUCHSCREEN_NUM_INSTANCES 1 +#define XPAR_TOUCHSCREEN_0_DEVICE_ID 220 +#define XPAR_TOUCHSCREEN_0_BASEADDR 0x70000000 + + +/***************************************************************************** + * + * DDR defines . + * DeviceID starts at 230 + */ +#define XPAR_XDDR_NUM_INSTANCES 1 +#define XPAR_DDR_0_DEVICE_ID 230 +#define XPAR_DDR_0_BASEADDR 0 +#define XPAR_DDR_0_INTERRUPT_PRESENT 0 + +/***************************************************************************** + * + * EmacLite defines . + * DeviceID starts at 240 + */ +#define XPAR_XEMACLITE_NUM_INSTANCES 1 +#define XPAR_EMACLITE_0_DEVICE_ID 240 +#define XPAR_EMACLITE_0_BASEADDR 0 +#define XPAR_EMACLITE_0_TX_PING_PONG 0 +#define XPAR_EMACLITE_0_RX_PING_PONG 0 + +/***************************************************************************** + * + * DSDAC defines . + * DeviceID starts at 250 + */ +#define XPAR_XDSDAC_NUM_INSTANCES 1 +#define XPAR_DSDAC_0_DEVICE_ID 250 +#define XPAR_DSDAC_0_BASEADDR 0 + +/***************************************************************************** + * + * DSADC defines . + * DeviceID starts at 260 + */ +#define XPAR_XDSADC_NUM_INSTANCES 1 +#define XPAR_DSADC_0_DEVICE_ID 260 +#define XPAR_DSADC_0_BASEADDR 0 + +/***************************************************************************** + * + * PCI Arbiter defines. + * DeviceID starts at 270 + */ +#define XPAR_XPCIARB_NUM_INSTANCES 1 +#define XPAR_OPB_PCI_ARBITER_0_DEVICE_ID 270 +#define XPAR_OPB_PCI_ARBITER_0_BASEADDR 0 +#define XPAR_OPB_PCI_ARBITER_0_NUM_PCI_MSTRS 2 + +/***************************************************************************** + * + * TEMAC defines . + * DeviceID starts at 280 + */ +#define XPAR_XTEMAC_NUM_INSTANCES 1 +#define XPAR_TEMAC_0_DEVICE_ID 280 +#define XPAR_TEMAC_0_BASEADDR 0 +#define XPAR_TEMAC_0_DMA_TYPE 3 +#define XPAR_TEMAC_0_RDFIFO_DEPTH 131072 +#define XPAR_TEMAC_0_WRFIFO_DEPTH 131072 +#define XPAR_TEMAC_0_MAC_FIFO_DEPTH 16 +#define XPAR_TEMAC_0_TEMAC_DCR_HOST 0 +#define XPAR_TEMAC_0_DRE 0 + +/***************************************************************************** + * + * DMACENTRAL defines . + * DeviceID starts at 290 + */ +#define XPAR_XDMACENTRAL_NUM_INSTANCES 1 +#define XPAR_DMACENTRAL_0_DEVICE_ID 290 +#define XPAR_DMACENTRAL_0_BASEADDR 0 +#define XPAR_DMACENTRAL_0_READ_OPTIONAL_REGS 0 + +/***************************************************************************** + * + * CAN defines + * DeviceID starts at 300 + */ +#define XPAR_XCAN_NUM_INSTANCES 1 +#define XPAR_CAN_0_DEVICE_ID 300 + +/* Definitions for FLEXRAY Driver */ +#define XPAR_XFLEXRAY_NUM_INSTANCES 1 +#define XPAR_OPB_FLEXRAY_0_DEVICE_ID 0 +#define XPAR_OPB_FLEXRAY_0_BASEADDR 0x7D80E000 +#define XPAR_OPB_FLEXRAY_MAX_PAYLOAD_SIZE 254 +#define XPAR_OPB_FLEXRAY_NO_OF_TX_BUFFERS 128 +#define XPAR_OPB_FLEXRAY_NO_OF_RX_BUFFERS 128 +#define XPAR_OPB_FLEXRAY_RX_FIFO_DEPTH 16 + +/* Definitions for MOST driver */ +#define XPAR_XMOST_NUM_INSTANCES 1 +#define XPAR_MOST_0_DEVICE_ID 0 +#define XPAR_MOST_0_BASEADDR 0x7D810000 +#define XPAR_MOST_OPMODE 0 +#define XPAR_MOST_FWC 16 +#define XPAR_MOST_EWC 16 + +/* Definitions for USB driver */ +#define XPAR_XUSB_NUM_INSTANCES 1 +#define XPAR_USB_0_DEVICE_ID 0 +#define XPAR_USB_0_BASEADDR 0x7D813000 + +/***************************************************************************** + * + * HWICAP defines . + */ +#define XPAR_XHWICAP_NUM_INSTANCES 1 +#define XPAR_OPB_HWICAP_0_DEVICE_ID 0 +#define XPAR_OPB_HWICAP_0_BASEADDR 0xFFFFFFFF + +/***************************************************************************** + * + * LLTEMAC and LLFIFO defines . + */ +#define XPAR_XLLTEMAC_NUM_INSTANCES 1 +#define XPAR_XLLFIFO_NUM_INSTANCES 1 + +/***************************************************************************** + * + * PCIe defines . + */ +#define XPAR_XPCIE_NUM_INSTANCES 1 + +/***************************************************************************** + * + * MPMC defines . + */ +#define XPAR_XMPMC_NUM_INSTANCES 1 + +/***************************************************************************** + * + * SYSMON defines . + */ +#define XPAR_XSYSMON_NUM_INSTANCES 1 + + +/***************************************************************************** + * + * AXI Ethernet defines . + */ +#define XPAR_XAXIETHERNET_NUM_INSTANCES 1 + +/***************************************************************************** + * + * TFT defines . + */ +#define XPAR_XTFT_NUM_INSTANCES 1 + +/***************************************************************************** + * + * MBox defines . + */ +#define XPAR_XMBOX_NUM_INSTANCES 1 +#define XPAR_XMBOX_0_DEVICE_ID 0 +#define XPAR_XMBOX_0_BASEADDR 0x7D814000 +#define XPAR_XMBOX_0_NUM_CHANNELS 1 +#define XPAR_XMBOX_0_USE_FSL 0 + + +/***************************************************************************** + * + * Mutex defines . + */ +#define XPAR_XMUTEX_NUM_INSTANCES 1 +#define XPAR_XMUTEX_0_DEVICE_ID 0 +#define XPAR_XMUTEX_0_BASEADDR 0x7D815000 +#define XPAR_XMUTEX_0_NUM_MUTEX 2 +#define XPAR_XMUTEX_0_ENABLE_USER 1 + +/* + * MicroBlaze sets this define but for the build check to + * function it needs to be set here + */ +#define XPAR_CPU_ID 0 + + +/***************************************************************************** + * + * BRAM defines . + */ +#define XPAR_XBRAM_NUM_INSTANCES 1 + + +/***************************************************************************** + * + * AXI PCIE defines . + */ +#define XPAR_XAXIPCIE_NUM_INSTANCES 1 + +/***************************************************************************** + * + * V6 DDRX efines . + */ +#define XPAR_XV6DDR_NUM_INSTANCES 1 + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xstatus.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xstatus.h new file mode 100755 index 000000000..e80558f05 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xstatus.h @@ -0,0 +1,418 @@ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002-2011 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xstatus.h +* +* This file contains Xilinx software status codes. Status codes have their +* own data type called int. These codes are used throughout the Xilinx +* device drivers. +* +******************************************************************************/ + +#ifndef XSTATUS_H /* prevent circular inclusions */ +#define XSTATUS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xbasic_types.h" + +/************************** Constant Definitions *****************************/ + +/*********************** Common statuses 0 - 500 *****************************/ + +#define XST_SUCCESS 0L +#define XST_FAILURE 1L +#define XST_DEVICE_NOT_FOUND 2L +#define XST_DEVICE_BLOCK_NOT_FOUND 3L +#define XST_INVALID_VERSION 4L +#define XST_DEVICE_IS_STARTED 5L +#define XST_DEVICE_IS_STOPPED 6L +#define XST_FIFO_ERROR 7L /* an error occurred during an + operation with a FIFO such as + an underrun or overrun, this + error requires the device to + be reset */ +#define XST_RESET_ERROR 8L /* an error occurred which requires + the device to be reset */ +#define XST_DMA_ERROR 9L /* a DMA error occurred, this error + typically requires the device + using the DMA to be reset */ +#define XST_NOT_POLLED 10L /* the device is not configured for + polled mode operation */ +#define XST_FIFO_NO_ROOM 11L /* a FIFO did not have room to put + the specified data into */ +#define XST_BUFFER_TOO_SMALL 12L /* the buffer is not large enough + to hold the expected data */ +#define XST_NO_DATA 13L /* there was no data available */ +#define XST_REGISTER_ERROR 14L /* a register did not contain the + expected value */ +#define XST_INVALID_PARAM 15L /* an invalid parameter was passed + into the function */ +#define XST_NOT_SGDMA 16L /* the device is not configured for + scatter-gather DMA operation */ +#define XST_LOOPBACK_ERROR 17L /* a loopback test failed */ +#define XST_NO_CALLBACK 18L /* a callback has not yet been + registered */ +#define XST_NO_FEATURE 19L /* device is not configured with + the requested feature */ +#define XST_NOT_INTERRUPT 20L /* device is not configured for + interrupt mode operation */ +#define XST_DEVICE_BUSY 21L /* device is busy */ +#define XST_ERROR_COUNT_MAX 22L /* the error counters of a device + have maxed out */ +#define XST_IS_STARTED 23L /* used when part of device is + already started i.e. + sub channel */ +#define XST_IS_STOPPED 24L /* used when part of device is + already stopped i.e. + sub channel */ +#define XST_DATA_LOST 26L /* driver defined error */ +#define XST_RECV_ERROR 27L /* generic receive error */ +#define XST_SEND_ERROR 28L /* generic transmit error */ +#define XST_NOT_ENABLED 29L /* a requested service is not + available because it has not + been enabled */ + +/***************** Utility Component statuses 401 - 500 *********************/ + +#define XST_MEMTEST_FAILED 401L /* memory test failed */ + + +/***************** Common Components statuses 501 - 1000 *********************/ + +/********************* Packet Fifo statuses 501 - 510 ************************/ + +#define XST_PFIFO_LACK_OF_DATA 501L /* not enough data in FIFO */ +#define XST_PFIFO_NO_ROOM 502L /* not enough room in FIFO */ +#define XST_PFIFO_BAD_REG_VALUE 503L /* self test, a register value + was invalid after reset */ +#define XST_PFIFO_ERROR 504L /* generic packet FIFO error */ +#define XST_PFIFO_DEADLOCK 505L /* packet FIFO is reporting + * empty and full simultaneously + */ + +/************************** DMA statuses 511 - 530 ***************************/ + +#define XST_DMA_TRANSFER_ERROR 511L /* self test, DMA transfer + failed */ +#define XST_DMA_RESET_REGISTER_ERROR 512L /* self test, a register value + was invalid after reset */ +#define XST_DMA_SG_LIST_EMPTY 513L /* scatter gather list contains + no buffer descriptors ready + to be processed */ +#define XST_DMA_SG_IS_STARTED 514L /* scatter gather not stopped */ +#define XST_DMA_SG_IS_STOPPED 515L /* scatter gather not running */ +#define XST_DMA_SG_LIST_FULL 517L /* all the buffer desciptors of + the scatter gather list are + being used */ +#define XST_DMA_SG_BD_LOCKED 518L /* the scatter gather buffer + descriptor which is to be + copied over in the scatter + list is locked */ +#define XST_DMA_SG_NOTHING_TO_COMMIT 519L /* no buffer descriptors have been + put into the scatter gather + list to be commited */ +#define XST_DMA_SG_COUNT_EXCEEDED 521L /* the packet count threshold + specified was larger than the + total # of buffer descriptors + in the scatter gather list */ +#define XST_DMA_SG_LIST_EXISTS 522L /* the scatter gather list has + already been created */ +#define XST_DMA_SG_NO_LIST 523L /* no scatter gather list has + been created */ +#define XST_DMA_SG_BD_NOT_COMMITTED 524L /* the buffer descriptor which was + being started was not committed + to the list */ +#define XST_DMA_SG_NO_DATA 525L /* the buffer descriptor to start + has already been used by the + hardware so it can't be reused + */ +#define XST_DMA_SG_LIST_ERROR 526L /* general purpose list access + error */ +#define XST_DMA_BD_ERROR 527L /* general buffer descriptor + error */ + +/************************** IPIF statuses 531 - 550 ***************************/ + +#define XST_IPIF_REG_WIDTH_ERROR 531L /* an invalid register width + was passed into the function */ +#define XST_IPIF_RESET_REGISTER_ERROR 532L /* the value of a register at + reset was not valid */ +#define XST_IPIF_DEVICE_STATUS_ERROR 533L /* a write to the device interrupt + status register did not read + back correctly */ +#define XST_IPIF_DEVICE_ACK_ERROR 534L /* the device interrupt status + register did not reset when + acked */ +#define XST_IPIF_DEVICE_ENABLE_ERROR 535L /* the device interrupt enable + register was not updated when + other registers changed */ +#define XST_IPIF_IP_STATUS_ERROR 536L /* a write to the IP interrupt + status register did not read + back correctly */ +#define XST_IPIF_IP_ACK_ERROR 537L /* the IP interrupt status register + did not reset when acked */ +#define XST_IPIF_IP_ENABLE_ERROR 538L /* IP interrupt enable register was + not updated correctly when other + registers changed */ +#define XST_IPIF_DEVICE_PENDING_ERROR 539L /* The device interrupt pending + register did not indicate the + expected value */ +#define XST_IPIF_DEVICE_ID_ERROR 540L /* The device interrupt ID register + did not indicate the expected + value */ +#define XST_IPIF_ERROR 541L /* generic ipif error */ + +/****************** Device specific statuses 1001 - 4095 *********************/ + +/********************* Ethernet statuses 1001 - 1050 *************************/ + +#define XST_EMAC_MEMORY_SIZE_ERROR 1001L /* Memory space is not big enough + * to hold the minimum number of + * buffers or descriptors */ +#define XST_EMAC_MEMORY_ALLOC_ERROR 1002L /* Memory allocation failed */ +#define XST_EMAC_MII_READ_ERROR 1003L /* MII read error */ +#define XST_EMAC_MII_BUSY 1004L /* An MII operation is in progress */ +#define XST_EMAC_OUT_OF_BUFFERS 1005L /* Driver is out of buffers */ +#define XST_EMAC_PARSE_ERROR 1006L /* Invalid driver init string */ +#define XST_EMAC_COLLISION_ERROR 1007L /* Excess deferral or late + * collision on polled send */ + +/*********************** UART statuses 1051 - 1075 ***************************/ +#define XST_UART + +#define XST_UART_INIT_ERROR 1051L +#define XST_UART_START_ERROR 1052L +#define XST_UART_CONFIG_ERROR 1053L +#define XST_UART_TEST_FAIL 1054L +#define XST_UART_BAUD_ERROR 1055L +#define XST_UART_BAUD_RANGE 1056L + + +/************************ IIC statuses 1076 - 1100 ***************************/ + +#define XST_IIC_SELFTEST_FAILED 1076 /* self test failed */ +#define XST_IIC_BUS_BUSY 1077 /* bus found busy */ +#define XST_IIC_GENERAL_CALL_ADDRESS 1078 /* mastersend attempted with */ + /* general call address */ +#define XST_IIC_STAND_REG_RESET_ERROR 1079 /* A non parameterizable reg */ + /* value after reset not valid */ +#define XST_IIC_TX_FIFO_REG_RESET_ERROR 1080 /* Tx fifo included in design */ + /* value after reset not valid */ +#define XST_IIC_RX_FIFO_REG_RESET_ERROR 1081 /* Rx fifo included in design */ + /* value after reset not valid */ +#define XST_IIC_TBA_REG_RESET_ERROR 1082 /* 10 bit addr incl in design */ + /* value after reset not valid */ +#define XST_IIC_CR_READBACK_ERROR 1083 /* Read of the control register */ + /* didn't return value written */ +#define XST_IIC_DTR_READBACK_ERROR 1084 /* Read of the data Tx reg */ + /* didn't return value written */ +#define XST_IIC_DRR_READBACK_ERROR 1085 /* Read of the data Receive reg */ + /* didn't return value written */ +#define XST_IIC_ADR_READBACK_ERROR 1086 /* Read of the data Tx reg */ + /* didn't return value written */ +#define XST_IIC_TBA_READBACK_ERROR 1087 /* Read of the 10 bit addr reg */ + /* didn't return written value */ +#define XST_IIC_NOT_SLAVE 1088 /* The device isn't a slave */ + +/*********************** ATMC statuses 1101 - 1125 ***************************/ + +#define XST_ATMC_ERROR_COUNT_MAX 1101L /* the error counters in the ATM + controller hit the max value + which requires the statistics + to be cleared */ + +/*********************** Flash statuses 1126 - 1150 **************************/ + +#define XST_FLASH_BUSY 1126L /* Flash is erasing or programming + */ +#define XST_FLASH_READY 1127L /* Flash is ready for commands */ +#define XST_FLASH_ERROR 1128L /* Flash had detected an internal + error. Use XFlash_DeviceControl + to retrieve device specific codes + */ +#define XST_FLASH_ERASE_SUSPENDED 1129L /* Flash is in suspended erase state + */ +#define XST_FLASH_WRITE_SUSPENDED 1130L /* Flash is in suspended write state + */ +#define XST_FLASH_PART_NOT_SUPPORTED 1131L /* Flash type not supported by + driver */ +#define XST_FLASH_NOT_SUPPORTED 1132L /* Operation not supported */ +#define XST_FLASH_TOO_MANY_REGIONS 1133L /* Too many erase regions */ +#define XST_FLASH_TIMEOUT_ERROR 1134L /* Programming or erase operation + aborted due to a timeout */ +#define XST_FLASH_ADDRESS_ERROR 1135L /* Accessed flash outside its + addressible range */ +#define XST_FLASH_ALIGNMENT_ERROR 1136L /* Write alignment error */ +#define XST_FLASH_BLOCKING_CALL_ERROR 1137L /* Couldn't return immediately from + write/erase function with + XFL_NON_BLOCKING_WRITE/ERASE + option cleared */ +#define XST_FLASH_CFI_QUERY_ERROR 1138L /* Failed to query the device */ + +/*********************** SPI statuses 1151 - 1175 ****************************/ + +#define XST_SPI_MODE_FAULT 1151 /* master was selected as slave */ +#define XST_SPI_TRANSFER_DONE 1152 /* data transfer is complete */ +#define XST_SPI_TRANSMIT_UNDERRUN 1153 /* slave underruns transmit register */ +#define XST_SPI_RECEIVE_OVERRUN 1154 /* device overruns receive register */ +#define XST_SPI_NO_SLAVE 1155 /* no slave has been selected yet */ +#define XST_SPI_TOO_MANY_SLAVES 1156 /* more than one slave is being + * selected */ +#define XST_SPI_NOT_MASTER 1157 /* operation is valid only as master */ +#define XST_SPI_SLAVE_ONLY 1158 /* device is configured as slave-only + */ +#define XST_SPI_SLAVE_MODE_FAULT 1159 /* slave was selected while disabled */ +#define XST_SPI_SLAVE_MODE 1160 /* device has been addressed as slave */ +#define XST_SPI_RECEIVE_NOT_EMPTY 1161 /* device received data in slave mode */ + +#define XST_SPI_COMMAND_ERROR 1162 /* unrecognised command - qspi only */ + +/********************** OPB Arbiter statuses 1176 - 1200 *********************/ + +#define XST_OPBARB_INVALID_PRIORITY 1176 /* the priority registers have either + * one master assigned to two or more + * priorities, or one master not + * assigned to any priority + */ +#define XST_OPBARB_NOT_SUSPENDED 1177 /* an attempt was made to modify the + * priority levels without first + * suspending the use of priority + * levels + */ +#define XST_OPBARB_PARK_NOT_ENABLED 1178 /* bus parking by id was enabled but + * bus parking was not enabled + */ +#define XST_OPBARB_NOT_FIXED_PRIORITY 1179 /* the arbiter must be in fixed + * priority mode to allow the + * priorities to be changed + */ + +/************************ Intc statuses 1201 - 1225 **************************/ + +#define XST_INTC_FAIL_SELFTEST 1201 /* self test failed */ +#define XST_INTC_CONNECT_ERROR 1202 /* interrupt already in use */ + +/********************** TmrCtr statuses 1226 - 1250 **************************/ + +#define XST_TMRCTR_TIMER_FAILED 1226 /* self test failed */ + +/********************** WdtTb statuses 1251 - 1275 ***************************/ + +#define XST_WDTTB_TIMER_FAILED 1251L + +/********************** PlbArb statuses 1276 - 1300 **************************/ + +#define XST_PLBARB_FAIL_SELFTEST 1276L + +/********************** Plb2Opb statuses 1301 - 1325 *************************/ + +#define XST_PLB2OPB_FAIL_SELFTEST 1301L + +/********************** Opb2Plb statuses 1326 - 1350 *************************/ + +#define XST_OPB2PLB_FAIL_SELFTEST 1326L + +/********************** SysAce statuses 1351 - 1360 **************************/ + +#define XST_SYSACE_NO_LOCK 1351L /* No MPU lock has been granted */ + +/********************** PCI Bridge statuses 1361 - 1375 **********************/ + +#define XST_PCI_INVALID_ADDRESS 1361L + +/********************** FlexRay constants 1400 - 1409 *************************/ + +#define XST_FR_TX_ERROR 1400 +#define XST_FR_TX_BUSY 1401 +#define XST_FR_BUF_LOCKED 1402 +#define XST_FR_NO_BUF 1403 + +/****************** USB constants 1410 - 1420 *******************************/ + +#define XST_USB_ALREADY_CONFIGURED 1410 +#define XST_USB_BUF_ALIGN_ERROR 1411 +#define XST_USB_NO_DESC_AVAILABLE 1412 +#define XST_USB_BUF_TOO_BIG 1413 +#define XST_USB_NO_BUF 1414 + +/****************** HWICAP constants 1421 - 1429 *****************************/ + +#define XST_HWICAP_WRITE_DONE 1421 + + +/****************** AXI VDMA constants 1430 - 1440 *****************************/ + +#define XST_VDMA_MISMATCH_ERROR 1430 + +/*********************** NAND Flash statuses 1441 - 1459 *********************/ + +#define XST_NAND_BUSY 1441L /* Flash is erasing or + * programming + */ +#define XST_NAND_READY 1442L /* Flash is ready for commands + */ +#define XST_NAND_ERROR 1443L /* Flash had detected an + * internal error. + */ +#define XST_NAND_PART_NOT_SUPPORTED 1444L /* Flash type not supported by + * driver + */ +#define XST_NAND_OPT_NOT_SUPPORTED 1445L /* Operation not supported + */ +#define XST_NAND_TIMEOUT_ERROR 1446L /* Programming or erase + * operation aborted due to a + * timeout + */ +#define XST_NAND_ADDRESS_ERROR 1447L /* Accessed flash outside its + * addressible range + */ +#define XST_NAND_ALIGNMENT_ERROR 1448L /* Write alignment error + */ +#define XST_NAND_PARAM_PAGE_ERROR 1449L /* Failed to read parameter + * page of the device + */ +#define XST_NAND_CACHE_ERROR 1450L /* Flash page buffer error + */ + +#define XST_NAND_WRITE_PROTECTED 1451L /* Flash is write protected + */ + +/**************************** Type Definitions *******************************/ + +typedef int XStatus; + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xutil.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xutil.h new file mode 100644 index 000000000..39469fef7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xutil.h @@ -0,0 +1,154 @@ +/* $Id: xutil.h,v 1.8 2007/05/04 21:55:59 wre Exp $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xutil.h +* +* This file contains utility functions such as memory test functions. +* +* <b>Memory test description</b> +* +* A subset of the memory tests can be selected or all of the tests can be run +* in order. If there is an error detected by a subtest, the test stops and the +* failure code is returned. Further tests are not run even if all of the tests +* are selected. +* +* Subtest descriptions: +* <pre> +* XUT_ALLMEMTESTS: +* Runs all of the following tests +* +* XUT_INCREMENT: +* Incrementing Value Test. +* This test starts at 'XUT_MEMTEST_INIT_VALUE' and uses the incrementing +* value as the test value for memory. +* +* XUT_WALKONES: +* Walking Ones Test. +* This test uses a walking '1' as the test value for memory. +* location 1 = 0x00000001 +* location 2 = 0x00000002 +* ... +* +* XUT_WALKZEROS: +* Walking Zero's Test. +* This test uses the inverse value of the walking ones test +* as the test value for memory. +* location 1 = 0xFFFFFFFE +* location 2 = 0xFFFFFFFD +* ... +* +* XUT_INVERSEADDR: +* Inverse Address Test. +* This test uses the inverse of the address of the location under test +* as the test value for memory. +* +* XUT_FIXEDPATTERN: +* Fixed Pattern Test. +* This test uses the provided patters as the test value for memory. +* If zero is provided as the pattern the test uses '0xDEADBEEF". +* </pre> +* +* <i>WARNING</i> +* +* The tests are <b>DESTRUCTIVE</b>. Run before any initialized memory spaces +* have been set up. +* +* The address, Addr, provided to the memory tests is not checked for +* validity except for the NULL case. It is possible to provide a code-space +* pointer for this test to start with and ultimately destroy executable code +* causing random failures. +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** width, +* the patterns used in XUT_WALKONES and XUT_WALKZEROS will repeat on a +* boundry of a power of two making it more difficult to detect addressing +* errors. The XUT_INCREMENT and XUT_INVERSEADDR tests suffer the same +* problem. Ideally, if large blocks of memory are to be tested, break +* them up into smaller regions of memory to allow the test patterns used +* not to repeat over the region tested. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 11/01/01 First release +* 1.00a xd 11/03/04 Improved support for doxygen. +* </pre> +* +******************************************************************************/ + +#ifndef XUTIL_H /* prevent circular inclusions */ +#define XUTIL_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xbasic_types.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/* xutil_memtest defines */ + +#define XUT_MEMTEST_INIT_VALUE 1 + +/** @name Memory subtests + * @{ + */ +/** + * See the detailed description of the subtests in the file description. + */ +#define XUT_ALLMEMTESTS 0 +#define XUT_INCREMENT 1 +#define XUT_WALKONES 2 +#define XUT_WALKZEROS 3 +#define XUT_INVERSEADDR 4 +#define XUT_FIXEDPATTERN 5 +#define XUT_MAXTEST XUT_FIXEDPATTERN +/* @} */ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/* xutil_memtest prototypes */ + +int XUtil_MemoryTest32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest); +int XUtil_MemoryTest16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest); +int XUtil_MemoryTest8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xutil_memtest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xutil_memtest.c new file mode 100755 index 000000000..47e4ce2ad --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xutil_memtest.c @@ -0,0 +1,1173 @@ +/* $Id: xutil_memtest.c,v 1.10 2007/05/04 21:55:59 wre Exp $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xutil_memtest.c +* +* Contains the memory test utility functions. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 11/01/01 First release +* 1.00a xd 11/03/04 Improved support for doxygen. +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ +#include "xbasic_types.h" +#include "xstatus.h" +#include "xutil.h" + +/************************** Constant Definitions ****************************/ +/************************** Function Prototypes *****************************/ + +static u32 RotateLeft(u32 Input, u8 Width); + +/* define ROTATE_RIGHT to give access to this functionality */ +/* #define ROTATE_RIGHT */ +#ifdef ROTATE_RIGHT +static u32 RotateRight(u32 Input, u8 Width); +#endif /* ROTATE_RIGHT */ + + +/*****************************************************************************/ +/** +* +* Performs a destructive 32-bit wide memory test. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Words is the length of the block. +* @param Pattern is the constant used for the constant pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest is the test selected. See xutil.h for possible values. +* +* @return +* +* - XST_MEMTEST_FAILED is returned for a failure +* - XST_SUCCESS is returned for a pass +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** width, +* the patterns used in XUT_WALKONES and XUT_WALKZEROS will repeat on a +* boundry of a power of two making it more difficult to detect addressing +* errors. The XUT_INCREMENT and XUT_INVERSEADDR tests suffer the same +* problem. Ideally, if large blocks of memory are to be tested, break +* them up into smaller regions of memory to allow the test patterns used +* not to repeat over the region tested. +* +*****************************************************************************/ +int XUtil_MemoryTest32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest) +{ + u32 i; + u32 j; + u32 Val = XUT_MEMTEST_INIT_VALUE; + u32 FirstVal = XUT_MEMTEST_INIT_VALUE; + u32 Word; + + XASSERT_NONVOID(Words != 0); + XASSERT_NONVOID(Subtest <= XUT_MAXTEST); + + /* + * Select the proper Subtest + */ + + + switch (Subtest) { + + case XUT_ALLMEMTESTS: + + /* this case executes all of the Subtests */ + + /* fall through case statement */ + + case XUT_INCREMENT: + { + + /* + * Fill the memory with incrementing + * values starting from 'FirstVal' + */ + for (i = 0L; i < Words; i++) { + Addr[i] = Val; + + /* write memory location */ + + Val++; + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = FirstVal; + + /* + * Check every word within the Words + * of tested memory and compare it + * with the incrementing reference + * Val + */ + + for (i = 0L; i < Words; i++) { + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + + Val++; + } + + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + + } /* end of case 1 */ + + /* fall through case statement */ + + case XUT_WALKONES: + { + /* + * set up to cycle through all possible initial + * test Patterns for walking ones test + */ + + for (j = 0L; j < 32; j++) { + /* + * Generate an initial value for walking ones test to test for bad + * data bits + */ + + Val = 1 << j; + + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + + for (i = 0L; i < 32; i++) { + + /* write memory location */ + + Addr[i] = Val; + Val = (u32) RotateLeft(Val, 32); + + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = 1 << j; + + /* Read the values from each location that was written */ + + for (i = 0L; i < 32; i++) { + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + + Val = (u32) RotateLeft(Val, 32); + + } + + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + + } /* end of case 2 */ + + /* fall through case statement */ + + case XUT_WALKZEROS: + { + /* + * set up to cycle through all possible + * initial test Patterns for walking zeros test + */ + + for (j = 0L; j < 32; j++) { + + /* + * Generate an initial value for walking ones test to test for + * bad data bits + */ + + Val = ~(1 << j); + + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + + for (i = 0L; i < 32; i++) { + + /* write memory location */ + + Addr[i] = Val; + Val = ~((u32) RotateLeft(~Val, 32)); + + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = ~(1 << j); + + /* Read the values from each location that was written */ + + for (i = 0L; i < 32; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + + Val = ~((u32) RotateLeft(~Val, 32)); + + } + + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + } /* end of case 3 */ + + /* fall through case statement */ + + case XUT_INVERSEADDR: + { + + /* Fill the memory with inverse of address */ + + for (i = 0L; i < Words; i++) { + + /* write memory location */ + + Val = (u32) (~((u32) (&Addr[i]))); + + Addr[i] = Val; + + } + + /* + * Check every word within the Words + * of tested memory + */ + + for (i = 0L; i < Words; i++) { + + /* Read the location */ + + Word = Addr[i]; + + Val = (u32) (~((u32) (&Addr[i]))); + + if ((Word ^ Val) != 0x00000000) { + return XST_MEMTEST_FAILED; + } + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + + } /* end of case 4 */ + + + /* fall through case statement */ + + case XUT_FIXEDPATTERN: + { + + /* + * Generate an initial value for + * memory testing + */ + + if (Pattern == 0) { + Val = 0xDEADBEEF; + + } + else { + Val = Pattern; + + } + + /* + * Fill the memory with fixed pattern + */ + + for (i = 0L; i < Words; i++) { + /* write memory location */ + + Addr[i] = Val; + + } + + /* + * Check every word within the Words + * of tested memory and compare it + * with the fixed pattern + */ + + for (i = 0L; i < Words; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + } /* end of case 5 */ + + /* this break is for the prior fall through case statements */ + + break; + + default: + { + return XST_MEMTEST_FAILED; + } + + } /* end of switch */ + + /* Successfully passed memory test ! */ + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Performs a destructive 16-bit wide memory test. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Words is the length of the block. +* @param Pattern is the constant used for the constant pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest is the test selected. See xutil.h for possible values. +* +* @return +* +* - XST_MEMTEST_FAILED is returned for a failure +* - XST_SUCCESS is returned for a pass +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** width, +* the patterns used in XUT_WALKONES and XUT_WALKZEROS will repeat on a +* boundry of a power of two making it more difficult to detect addressing +* errors. The XUT_INCREMENT and XUT_INVERSEADDR tests suffer the same +* problem. Ideally, if large blocks of memory are to be tested, break +* them up into smaller regions of memory to allow the test patterns used +* not to repeat over the region tested. +* +*****************************************************************************/ +int XUtil_MemoryTest16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest) +{ + u32 i; + u32 j; + u16 Val = XUT_MEMTEST_INIT_VALUE; + u16 FirstVal = XUT_MEMTEST_INIT_VALUE; + u16 Word; + + XASSERT_NONVOID(Words != 0); + XASSERT_NONVOID(Subtest <= XUT_MAXTEST); + + /* + * selectthe proper Subtest(s) + */ + + switch (Subtest) { + + case XUT_ALLMEMTESTS: + + /* this case executes all of the Subtests */ + + /* fall through case statement */ + + case XUT_INCREMENT: + { + + /* + * Fill the memory with incrementing + * values starting from 'FirstVal' + */ + for (i = 0L; i < Words; i++) { + /* write memory location */ + + Addr[i] = Val; + + Val++; + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = FirstVal; + + /* + * Check every word within the Words + * of tested memory and compare it + * with the incrementing reference + * Val + */ + + for (i = 0L; i < Words; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + Val++; + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + } /* end of case 1 */ + + /* fall through case statement */ + + case XUT_WALKONES: + { + /* + * set up to cycle through all possible initial test + * Patterns for walking ones test + */ + + for (j = 0L; j < 16; j++) { + /* + * Generate an initial value for walking ones test to test for bad + * data bits + */ + + Val = 1 << j; + + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + + for (i = 0L; i < 16; i++) { + + /* write memory location */ + + Addr[i] = Val; + + Val = (u16) RotateLeft(Val, 16); + + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = 1 << j; + + /* Read the values from each location that was written */ + + for (i = 0L; i < 16; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + + Val = (u16) RotateLeft(Val, 16); + + } + + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + + } /* end of case 2 */ + + /* fall through case statement */ + + case XUT_WALKZEROS: + { + /* + * set up to cycle through all possible initial + * test Patterns for walking zeros test + */ + + for (j = 0L; j < 16; j++) { + + /* + * Generate an initial value for walking ones + * test to test for bad + * data bits + */ + + Val = ~(1 << j); + + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + + for (i = 0L; i < 16; i++) { + + + /* write memory location */ + + Addr[i] = Val; + Val = ~((u16) RotateLeft(~Val, 16)); + + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = ~(1 << j); + + /* Read the values from each location that was written */ + + for (i = 0L; i < 16; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + + Val = ~((u16) RotateLeft(~Val, 16)); + + } + + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + } /* end of case 3 */ + + /* fall through case statement */ + + case XUT_INVERSEADDR: + { + + /* Fill the memory with inverse of address */ + + for (i = 0L; i < Words; i++) { + /* write memory location */ + + Val = (u16) (~((u32) (&Addr[i]))); + Addr[i] = Val; + + } + + /* + * Check every word within the Words + * of tested memory + */ + + for (i = 0L; i < Words; i++) { + + /* read memory location */ + + Word = Addr[i]; + + Val = (u16) (~((u32) (&Addr[i]))); + + if ((Word ^ Val) != 0x0000) { + return XST_MEMTEST_FAILED; + } + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + + } /* end of case 4 */ + + + /* fall through case statement */ + + case XUT_FIXEDPATTERN: + { + + /* + * Generate an initial value for + * memory testing + */ + + if (Pattern == 0) { + Val = 0xDEAD; + + } + else { + Val = Pattern; + + } + + /* + * Fill the memory with fixed pattern + */ + + for (i = 0L; i < Words; i++) { + + /* write memory location */ + + Addr[i] = Val; + + } + + /* + * Check every word within the Words + * of tested memory and compare it + * with the fixed pattern + */ + + for (i = 0L; i < Words; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + } /* end of case 5 */ + + /* this break is for the prior fall through case statements */ + + break; + + default: + { + return XST_MEMTEST_FAILED; + } + + } /* end of switch */ + + /* Successfully passed memory test ! */ + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* +* Performs a destructive 8-bit wide memory test. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Words is the length of the block. +* @param Pattern is the constant used for the constant pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest is the test selected. See xutil.h for possible values. +* +* @return +* +* - XST_MEMTEST_FAILED is returned for a failure +* - XST_SUCCESS is returned for a pass +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** width, +* the patterns used in XUT_WALKONES and XUT_WALKZEROS will repeat on a +* boundry of a power of two making it more difficult to detect addressing +* errors. The XUT_INCREMENT and XUT_INVERSEADDR tests suffer the same +* problem. Ideally, if large blocks of memory are to be tested, break +* them up into smaller regions of memory to allow the test patterns used +* not to repeat over the region tested. +* +*****************************************************************************/ +int XUtil_MemoryTest8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest) +{ + u32 i; + u32 j; + u8 Val = XUT_MEMTEST_INIT_VALUE; + u8 FirstVal = XUT_MEMTEST_INIT_VALUE; + u8 Word; + + XASSERT_NONVOID(Words != 0); + XASSERT_NONVOID(Subtest <= XUT_MAXTEST); + + /* + * select the proper Subtest(s) + */ + + switch (Subtest) { + + case XUT_ALLMEMTESTS: + + /* this case executes all of the Subtests */ + + /* fall through case statement */ + + case XUT_INCREMENT: + { + + /* + * Fill the memory with incrementing + * values starting from 'FirstVal' + */ + for (i = 0L; i < Words; i++) { + + /* write memory location */ + + Addr[i] = Val; + Val++; + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = FirstVal; + + /* + * Check every word within the Words + * of tested memory and compare it + * with the incrementing reference + * Val + */ + + for (i = 0L; i < Words; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + Val++; + } + + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + + } /* end of case 1 */ + + /* fall through case statement */ + + case XUT_WALKONES: + { + /* + * set up to cycle through all possible initial + * test Patterns for walking ones test + */ + + for (j = 0L; j < 8; j++) { + /* + * Generate an initial value for walking ones test to test + * for bad data bits + */ + + Val = 1 << j; + + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + + for (i = 0L; i < 8; i++) { + + /* write memory location */ + + Addr[i] = Val; + Val = (u8) RotateLeft(Val, 8); + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = 1 << j; + + /* Read the values from each location that was written */ + + for (i = 0L; i < 8; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + + Val = (u8) RotateLeft(Val, 8); + + } + + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + + } /* end of case 2 */ + + /* fall through case statement */ + + case XUT_WALKZEROS: + { + /* + * set up to cycle through all possible initial test + * Patterns for walking zeros test + */ + + for (j = 0L; j < 8; j++) { + + /* + * Generate an initial value for walking ones test to test + * for bad data bits + */ + + Val = ~(1 << j); + + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + + for (i = 0L; i < 8; i++) { + + + /* write memory location */ + + Addr[i] = Val; + Val = ~((u8) RotateLeft(~Val, 8)); + + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = ~(1 << j); + + /* Read the values from each location that was written */ + + for (i = 0L; i < 8; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + + Val = ~((u8) RotateLeft(~Val, 8)); + + } + + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + } /* end of case 3 */ + + /* fall through case statement */ + + case XUT_INVERSEADDR: + { + + /* Fill the memory with inverse of address */ + + for (i = 0L; i < Words; i++) { + + /* write memory location */ + + Val = (u8) (~((u32) (&Addr[i]))); + Addr[i] = Val; + + } + + /* + * Check every word within the Words + * of tested memory + */ + + for (i = 0L; i < Words; i++) { + + /* read memory location */ + + Word = Addr[i]; + + Val = (u8) (~((u32) (&Addr[i]))); + + if ((Word ^ Val) != 0x00) { + return XST_MEMTEST_FAILED; + } + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + + } /* end of case 4 */ + + + /* fall through case statement */ + + case XUT_FIXEDPATTERN: + { + + /* + * Generate an initial value for + * memory testing + */ + + if (Pattern == 0) { + Val = 0xA5; + + } + else { + Val = Pattern; + + } + + /* + * Fill the memory with fixed pattern + */ + + for (i = 0L; i < Words; i++) { + + /* write memory location */ + + Addr[i] = Val; + + } + + /* + * Check every word within the Words + * of tested memory and compare it + * with the fixed pattern + */ + + for (i = 0L; i < Words; i++) { + + /* read memory location */ + + Word = Addr[i]; + + if (Word != Val) { + return XST_MEMTEST_FAILED; + } + } + + if (Subtest != XUT_ALLMEMTESTS) { + return XST_SUCCESS; + } + + } /* end of case 5 */ + + /* this break is for the prior fall through case statements */ + + break; + + default: + { + return XST_MEMTEST_FAILED; + } + + } /* end of switch */ + + /* Successfully passed memory test ! */ + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* +* Rotates the provided value to the left one bit position +* +* @param Input is value to be rotated to the left +* @param Width is the number of bits in the input data +* +* @return +* +* The resulting unsigned long value of the rotate left +* +* @note +* +* None. +* +*****************************************************************************/ +static u32 RotateLeft(u32 Input, u8 Width) +{ + u32 Msb; + u32 ReturnVal; + u32 WidthMask; + u32 MsbMask; + + /* + * set up the WidthMask and the MsbMask + */ + + MsbMask = 1 << (Width - 1); + + WidthMask = (MsbMask << 1) - 1; + + /* + * set the width of the Input to the correct width + */ + + Input = Input & WidthMask; + + Msb = Input & MsbMask; + + ReturnVal = Input << 1; + + if (Msb != 0x00000000) { + ReturnVal = ReturnVal | 0x00000001; + } + + ReturnVal = ReturnVal & WidthMask; + + return (ReturnVal); + +} + +#ifdef ROTATE_RIGHT +/*****************************************************************************/ +/** +* +* Rotates the provided value to the right one bit position +* +* @param Input is value to be rotated to the right +* @param Width is the number of bits in the input data +* +* @return +* +* The resulting u32 value of the rotate right +* +* @note +* +* None. +* +*****************************************************************************/ +static u32 RotateRight(u32 Input, u8 Width) +{ + u32 Lsb; + u32 ReturnVal; + u32 WidthMask; + u32 MsbMask; + + /* + * set up the WidthMask and the MsbMask + */ + + MsbMask = 1 << (Width - 1); + + WidthMask = (MsbMask << 1) - 1; + + /* + * set the width of the Input to the correct width + */ + + Input = Input & WidthMask; + + ReturnVal = Input >> 1; + + Lsb = Input & 0x00000001; + + if (Lsb != 0x00000000) { + ReturnVal = ReturnVal | MsbMask; + } + + ReturnVal = ReturnVal & WidthMask; + + return (ReturnVal); + +} +#endif /* ROTATE_RIGHT */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xversion.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xversion.c new file mode 100755 index 000000000..1c79b5756 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xversion.c @@ -0,0 +1,344 @@ +/* $Id: xversion.c,v 1.10 2007/05/07 14:29:23 wre Exp $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xversion.c +* +* This file contains the implementation of the XVersion component. This +* component represents a version ID. It is encapsulated within a component +* so that it's type and implementation can change without affecting users of +* it. +* +* The version is formatted as X.YYZ where X = 0 - 9, Y = 00 - 99, Z = a - z +* X is the major revision, YY is the minor revision, and Z is the +* compatability revision. +* +* Packed versions are also utilized for the configuration ROM such that +* memory is minimized. A packed version consumes only 16 bits and is +* formatted as follows. +* +* <pre> +* Revision Range Bit Positions +* +* Major Revision 0 - 9 Bits 15 - 12 +* Minor Revision 0 - 99 Bits 11 - 5 +* Compatability Revision a - z Bits 4 - 0 +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a xd 11/03/04 Improved support for doxygen. +</pre> +* +******************************************************************************/ + + +/***************************** Include Files *********************************/ + +#include "xbasic_types.h" +#include "xversion.h" + +/************************** Constant Definitions *****************************/ + +/* the following constants define the masks and shift values to allow the + * revisions to be packed and unpacked, a packed version is packed into a 16 + * bit value in the following format, XXXXYYYYYYYZZZZZ, where XXXX is the + * major revision, YYYYYYY is the minor revision, and ZZZZZ is the compatability + * revision + */ +#define XVE_MAJOR_SHIFT_VALUE 12 +#define XVE_MINOR_ONLY_MASK 0x0FE0 +#define XVE_MINOR_SHIFT_VALUE 5 +#define XVE_COMP_ONLY_MASK 0x001F + +/* the following constants define the specific characters of a version string + * for each character of the revision, a version string is in the following + * format, "X.YYZ" where X is the major revision (0 - 9), YY is the minor + * revision (00 - 99), and Z is the compatability revision (a - z) + */ +#define XVE_MAJOR_CHAR 0 /* major revision 0 - 9 */ +#define XVE_MINOR_TENS_CHAR 2 /* minor revision tens 0 - 9 */ +#define XVE_MINOR_ONES_CHAR 3 /* minor revision ones 0 - 9 */ +#define XVE_COMP_CHAR 4 /* compatability revision a - z */ +#define XVE_END_STRING_CHAR 5 + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +static int IsVersionStringValid(char *StringPtr); + +/*****************************************************************************/ +/** +* +* Unpacks a packed version into the specified version. Versions are packed +* into the configuration ROM to reduce the amount storage. A packed version +* is a binary format as oppossed to a non-packed version which is implemented +* as a string. +* +* @param InstancePtr points to the version to unpack the packed version into. +* @param PackedVersion contains the packed version to unpack. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XVersion_UnPack(XVersion *InstancePtr, u16 PackedVersion) +{ + (void) InstancePtr; + (void) PackedVersion; + /* not implemented yet since CROM related */ +} + +/*****************************************************************************/ +/** +* +* Packs a version into the specified packed version. Versions are packed into +* the configuration ROM to reduce the amount storage. +* +* @param InstancePtr points to the version to pack. +* @param PackedVersionPtr points to the packed version which will receive +* the new packed version. +* +* @return +* +* A status, XST_SUCCESS, indicating the packing was accomplished +* successfully, or an error, XST_INVALID_VERSION, indicating the specified +* input version was not valid such that the pack did not occur +* <br><br> +* The packed version pointed to by PackedVersionPtr is modified with the new +* packed version if the status indicates success. +* +* @note +* +* None. +* +******************************************************************************/ +int XVersion_Pack(XVersion *InstancePtr, u16 *PackedVersionPtr) +{ + /* not implemented yet since CROM related */ + (void) InstancePtr; + (void) PackedVersionPtr; + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Determines if two versions are equal. +* +* @param InstancePtr points to the first version to be compared. +* @param VersionPtr points to a second version to be compared. +* +* @return +* +* TRUE if the versions are equal, FALSE otherwise. +* +* @note +* +* None. +* +******************************************************************************/ +int XVersion_IsEqual(XVersion *InstancePtr, XVersion *VersionPtr) +{ + u8 *Version1 = (u8 *) InstancePtr; + u8 *Version2 = (u8 *) VersionPtr; + u32 Index; + + /* assert to verify input arguments */ + + XASSERT_NONVOID(InstancePtr != NULL); + XASSERT_NONVOID(VersionPtr != NULL); + + /* check each byte of the versions to see if they are the same, + * return at any point a byte differs between them + */ + for (Index = 0; Index < sizeof(XVersion); Index++) { + if (Version1[Index] != Version2[Index]) { + return FALSE; + } + } + + /* No byte was found to be different between the versions, so indicate + * the versions are equal + */ + return TRUE; +} + +/*****************************************************************************/ +/** +* +* Converts a version to a null terminated string. +* +* @param InstancePtr points to the version to convert. +* @param StringPtr points to the string which will be the result of the +* conversion. This does not need to point to a null terminated +* string as an input, but must point to storage which is an adequate +* amount to hold the result string. +* +* @return +* +* The null terminated string is inserted at the location pointed to by +* StringPtr if the status indicates success. +* +* @note +* +* It is necessary for the caller to have already allocated the storage to +* contain the string. The amount of memory necessary for the string is +* specified in the version header file. +* +******************************************************************************/ +void XVersion_ToString(XVersion *InstancePtr, char *StringPtr) +{ + /* assert to verify input arguments */ + + XASSERT_VOID(InstancePtr != NULL); + XASSERT_VOID(StringPtr != NULL); + + /* since version is implemented as a string, just copy the specified + * input into the specified output + */ + XVersion_Copy(InstancePtr, (XVersion *) StringPtr); +} + +/*****************************************************************************/ +/** +* +* Initializes a version from a null terminated string. Since the string may not +* be a format which is compatible with the version, an error could occur. +* +* @param InstancePtr points to the version which is to be initialized. +* @param StringPtr points to a null terminated string which will be +* converted to a version. The format of the string must match the +* version string format which is X.YYX where X = 0 - 9, YY = 00 - 99, +* Z = a - z. +* +* @return +* +* A status, XST_SUCCESS, indicating the conversion was accomplished +* successfully, or XST_INVALID_VERSION indicating the version string format +* was not valid. +* +* @note +* +* None. +* +******************************************************************************/ +int XVersion_FromString(XVersion *InstancePtr, char *StringPtr) +{ + /* assert to verify input arguments */ + + XASSERT_NONVOID(InstancePtr != NULL); + XASSERT_NONVOID(StringPtr != NULL); + + /* if the version string specified is not valid, return an error */ + + if (!IsVersionStringValid(StringPtr)) { + return XST_INVALID_VERSION; + } + + /* copy the specified string into the specified version and indicate the + * conversion was successful + */ + XVersion_Copy((XVersion *) StringPtr, InstancePtr); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Copies the contents of a version to another version. +* +* @param InstancePtr points to the version which is the source of data for +* the copy operation. +* @param VersionPtr points to another version which is the destination of +* the copy operation. +* +* @return +* +* None. +* +* @note +* +* None. +* +******************************************************************************/ +void XVersion_Copy(XVersion *InstancePtr, XVersion *VersionPtr) +{ + u8 *Source = (u8 *) InstancePtr; + u8 *Destination = (u8 *) VersionPtr; + u32 Index; + + /* assert to verify input arguments */ + + XASSERT_VOID(InstancePtr != NULL); + XASSERT_VOID(VersionPtr != NULL); + + /* copy each byte of the source version to the destination version */ + + for (Index = 0; Index < sizeof(XVersion); Index++) { + Destination[Index] = Source[Index]; + } +} + +/*****************************************************************************/ +/** +* +* Determines if the specified version is valid. +* +* @param StringPtr points to the string to be validated. +* +* @return +* +* TRUE if the version string is a valid format, FALSE otherwise. +* +* @note +* +* None. +* +******************************************************************************/ +static int IsVersionStringValid(char *StringPtr) +{ + /* if the input string is not a valid format, "X.YYZ" where X = 0 - 9, + * YY = 00 - 99, and Z = a - z, then indicate it's not valid + */ + if ((StringPtr[XVE_MAJOR_CHAR] < '0') || + (StringPtr[XVE_MAJOR_CHAR] > '9') || + (StringPtr[XVE_MINOR_TENS_CHAR] < '0') || + (StringPtr[XVE_MINOR_TENS_CHAR] > '9') || + (StringPtr[XVE_MINOR_ONES_CHAR] < '0') || + (StringPtr[XVE_MINOR_ONES_CHAR] > '9') || + (StringPtr[XVE_COMP_CHAR] < 'a') || + (StringPtr[XVE_COMP_CHAR] > 'z')) { + return FALSE; + } + + return TRUE; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xversion.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xversion.h new file mode 100755 index 000000000..3a14716f0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/common_v1_00_a/src/xversion.h @@ -0,0 +1,98 @@ +/* $Id: xversion.h,v 1.9 2007/05/07 14:29:23 wre Exp $ */ +/****************************************************************************** +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" +* AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND +* SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, +* OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, +* APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION +* THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, +* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE +* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY +* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE +* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR +* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF +* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE. +* +* (c) Copyright 2002 Xilinx Inc. +* All rights reserved. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xversion.h +* +* This file contains the interface for the XVersion component. This +* component represents a version ID. It is encapsulated within a component +* so that it's type and implementation can change without affecting users of +* it. +* +* The version is formatted as X.YYZ where X = 0 - 9, Y = 00 - 99, Z = a - z +* X is the major revision, YY is the minor revision, and Z is the +* compatability revision. +* +* Packed versions are also utilized for the configuration ROM such that +* memory is minimized. A packed version consumes only 16 bits and is +* formatted as follows. +* +* <pre> +* Revision Range Bit Positions +* +* Major Revision 0 - 9 Bits 15 - 12 +* Minor Revision 0 - 99 Bits 11 - 5 +* Compatability Revision a - z Bits 4 - 0 +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a xd 11/03/04 Improved support for doxygen. +* </pre> +* +******************************************************************************/ + +#ifndef XVERSION_H /* prevent circular inclusions */ +#define XVERSION_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xbasic_types.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/* the following data type is used to hold a null terminated version string + * consisting of the following format, "X.YYX" + */ +typedef char XVersion[6]; + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +void XVersion_UnPack(XVersion *InstancePtr, u16 PackedVersion); + +int XVersion_Pack(XVersion *InstancePtr, u16 *PackedVersion); + +int XVersion_IsEqual(XVersion *InstancePtr, XVersion *VersionPtr); + +void XVersion_ToString(XVersion *InstancePtr, char *StringPtr); + +int XVersion_FromString(XVersion *InstancePtr, char *StringPtr); + +void XVersion_Copy(XVersion *InstancePtr, XVersion *VersionPtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v1_01_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v1_01_a/src/Makefile new file mode 100755 index 000000000..77363c67c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v1_01_a/src/Makefile @@ -0,0 +1,23 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES=*.c +INCLUDEFILES=*.h + +libs: + echo "Compiling cpu_cortexa9" + +.PHONY: include +include: + ${CP} $(INCLUDEFILES) $(INCLUDEDIR) + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v1_01_a/src/xcpu_cortexa9.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v1_01_a/src/xcpu_cortexa9.h new file mode 100755 index 000000000..0933143a4 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/cpu_cortexa9_v1_01_a/src/xcpu_cortexa9.h @@ -0,0 +1,49 @@ +/* $Id: xcpu_cortexa9.h,v 1.1.2.1 2011/02/11 09:30:37 kkatna Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2011 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xcpu_cortexa9.h +* +* dummy file +* +******************************************************************************/ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/Makefile new file mode 100755 index 000000000..2b569563c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xdevcfg_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling devcfg" + +xdevcfg_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xdevcfg_includes + +xdevcfg_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg.c new file mode 100755 index 000000000..f2f61d020 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg.c @@ -0,0 +1,909 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg.c +* +* This file contains the implementation of the interface functions for XDcfg +* driver. Refer to the header file xdevcfg.h for more detailed information. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a hvm 02/07/11 First release +* 2.00a nm 05/31/12 Updated the driver for CR 660835 so that input length for +* source/destination to the XDcfg_InitiateDma, XDcfg_Transfer +* APIs is words (32 bit) and not bytes. +* Updated the notes for XDcfg_InitiateDma/XDcfg_Transfer APIs +* to add information that 2 LSBs of the Source/Destination +* address when equal to 2’b01 indicate the last DMA command +* of an overall transfer. +* Updated the XDcfg_Transfer function to use the +* Destination Address passed to this API for secure transfers +* instead of using 0xFFFFFFFF for CR 662197. This issue was +* resulting in the failure of secure transfers of +* non-bitstream images. +* 2.01a nm 08/27/12 Updated the XDcfg_Transfer API to clear the +* QUARTER_PCAP_RATE_EN bit in the control register for +* non secure writes for CR 675543. +* 2.02a nm 01/31/13 Fixed CR# 679335. +* Added Setting and Clearing the internal PCAP loopback. +* Removed code for enabling/disabling AES engine as BootROM +* locks down this setting. +* Fixed CR# 681976. +* Skip Checking the PCFG_INIT in case of non-secure DMA +* loopback. +* Fixed CR# 699558. +* XDcfg_Transfer fails to transfer data in loopback mode. +* 2.03a nm 04/19/13 Fixed CR# 703728. +* Updated the register definitions as per the latest TRM +* version UG585 (v1.4) November 16, 2012. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xdevcfg.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/****************************************************************************/ +/** +* +* Initialize the Device Config Interface driver. This function +* must be called before other functions of the driver are called. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param ConfigPtr is the config structure. +* @param EffectiveAddress is the base address for the device. It could be +* a virtual address if address translation is supported in the +* system, otherwise it is the physical address. +* +* @return +* - XST_SUCCESS if initialization was successful. +* - XST_DEVICE_IS_STARTED if the device has already been started. +* +* @note The very first APB access to the Device Configuration Interface +* block needs to be a write to the UNLOCK register with the value +* of 0x757BDF0D. This step is to be done once after reset, any +* other APB access has to come after this. The APB access is +* considered illegal if the step is not done or if it is done +* incorrectly. Furthermore, if any of efuse_sec_cfg[5:0] is high, +* the following additional actions would be carried out. +* In other words, if all bits are low, the following steps are not +* done. +* 1. AES is disabled +* 2. All APB writes disabled +* 3. SoC debug fully enabled +* +******************************************************************************/ +int XDcfg_CfgInitialize(XDcfg *InstancePtr, + XDcfg_Config *ConfigPtr, u32 EffectiveAddress) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + /* + * If the device is started, disallow the initialize and return a + * status indicating it is started. This allows the user to stop the + * device and reinitialize, but prevents a user from inadvertently + * initializing. + */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return XST_DEVICE_IS_STARTED; + } + + /* + * Copy configuration into instance. + */ + InstancePtr->Config.DeviceId = ConfigPtr->DeviceId; + + /* + * Save the base address pointer such that the registers of the block + * can be accessed and indicate it has not been started yet. + */ + InstancePtr->Config.BaseAddr = EffectiveAddress; + InstancePtr->IsStarted = 0; + + + /* Unlock the Device Configuration Interface */ + XDcfg_Unlock(InstancePtr); + + /* + * Indicate the instance is ready to use, successfully initialized. + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* The functions enables the PCAP interface by setting the PCAP mode bit in the +* control register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return None. +* +* @note Enable FPGA programming from PCAP interface. Enabling this bit +* disables all the external interfaces from programming of FPGA +* except for ICAP. The user needs to ensure that the FPGA is +* programmed through either PCAP or ICAP. +* +*****************************************************************************/ +void XDcfg_EnablePCAP(XDcfg *InstancePtr) +{ + u32 CtrlReg; + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (CtrlReg | XDCFG_CTRL_PCAP_MODE_MASK)); + +} + +/****************************************************************************/ +/** +* +* The functions disables the PCAP interface by clearing the PCAP mode bit in +* the control register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_DisablePCAP(XDcfg *InstancePtr) +{ + u32 CtrlReg; + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (CtrlReg & ( ~XDCFG_CTRL_PCAP_MODE_MASK))); + +} + +/****************************************************************************/ +/** +* +* The function sets the contents of the Control Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Mask is the 32 bit mask data to be written to the Register. +* The mask definitions are defined in the xdevcfg_hw.h file. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_SetControlRegister(XDcfg *InstancePtr, u32 Mask) +{ + u32 CtrlReg; + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_CTRL_OFFSET, + (CtrlReg | Mask)); + +} + +/****************************************************************************/ +/** +* +* The function reads the contents of the Control Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return A 32-bit value representing the contents of the Control +* Register. +* Use the XDCFG_CTRL_*_MASK constants defined in xdevcfg_hw.h to +* interpret the returned value. +* +* @note None. +* +*****************************************************************************/ +u32 XDcfg_GetControlRegister(XDcfg *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Control Register and return the value. + */ + return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_CTRL_OFFSET); +} + +/****************************************************************************/ +/** +* +* The function sets the contents of the Lock Register. These bits +* can only be set to a 1. They will be cleared after a Power On Reset. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Data is the 32 bit data to be written to the Register. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_SetLockRegister(XDcfg *InstancePtr, u32 Data) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_LOCK_OFFSET, Data); + +} + +/****************************************************************************/ +/** +* +* The function reads the contents of the Lock Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return A 32-bit value representing the contents of the Lock +* Register. +* Use the XDCFG_CR_*_MASK constants defined in xdevcfg_hw.h to +* interpret the returned value. +* +* @note None. +* +*****************************************************************************/ +u32 XDcfg_GetLockRegister(XDcfg *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Lock Register and return the value. + */ + return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_LOCK_OFFSET); +} + +/****************************************************************************/ +/** +* +* The function sets the contents of the Configuration Register with the +* given value. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Data is the 32 bit data to be written to the Register. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_SetConfigRegister(XDcfg *InstancePtr, u32 Data) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_CFG_OFFSET, Data); + +} + +/****************************************************************************/ +/** +* +* The function reads the contents of the Configuration Register with the +* given value. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return A 32-bit value representing the contents of the Config +* Register. +* Use the XDCFG_CFG_*_MASK constants defined in xdevcfg_hw.h to +* interpret the returned value. +* +* @note None. +* +*****************************************************************************/ +u32 XDcfg_GetConfigRegister(XDcfg *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_CFG_OFFSET); + +} + +/****************************************************************************/ +/** +* +* The function sets the contents of the Status Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Data is the 32 bit data to be written to the Register. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_SetStatusRegister(XDcfg *InstancePtr, u32 Data) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_STATUS_OFFSET, Data); + +} + +/****************************************************************************/ +/** +* +* The function reads the contents of the Status Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return A 32-bit value representing the contents of the Status +* Register. +* Use the XDCFG_STATUS_*_MASK constants defined in +* xdevcfg_hw.h to interpret the returned value. +* +* @note None. +* +*****************************************************************************/ +u32 XDcfg_GetStatusRegister(XDcfg *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Status Register and return the value. + */ + return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_STATUS_OFFSET); +} + +/****************************************************************************/ +/** +* +* The function sets the contents of the ROM Shadow Control Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Data is the 32 bit data to be written to the Register. +* +* @return None. +* +* @note This register is can only be written and is used to control the +* RAM shadow of 32 bit 4K page ROM pages in user mode +* +*****************************************************************************/ +void XDcfg_SetRomShadowRegister(XDcfg *InstancePtr, u32 Data) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_ROM_SHADOW_OFFSET, + Data); + +} + +/****************************************************************************/ +/** +* +* The function reads the contents of the Software ID Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return 32 Bit boot software ID. +* +* @note This register is locked for write once the system enters +* usermode. Hence API for reading the register only is provided. +* +*****************************************************************************/ +u32 XDcfg_GetSoftwareIdRegister(XDcfg *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Software ID Register and return the value. + */ + return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_SW_ID_OFFSET); +} + +/****************************************************************************/ +/** +* +* The function sets the bit mask for the feature in Miscellaneous Control +* Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Mask is the bit-mask of the feature to be set. +* +* @return None. +* +* @note None +* +*****************************************************************************/ +void XDcfg_SetMiscControlRegister(XDcfg *InstancePtr, u32 Mask) +{ + u32 RegData; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + RegData = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, XDCFG_MCTRL_OFFSET, + (RegData | Mask)); +} + +/****************************************************************************/ +/** +* +* The function reads the contents of the Miscellaneous Control Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return 32 Bit boot software ID. +* +* @note This register is locked for write once the system enters +* usermode. Hence API to reading the register only is provided. +* +*****************************************************************************/ +u32 XDcfg_GetMiscControlRegister(XDcfg *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Miscellaneous Control Register and return the value. + */ + return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_MCTRL_OFFSET); +} + +/******************************************************************************/ +/** +* +* This function checks if DMA command queue is full. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return XST_SUCCESS is the DMA is busy +* XST_FAILURE if the DMA is idle +* +* @note The DMA queue has a depth of two. +* +****************************************************************************/ +u32 XDcfg_IsDmaBusy(XDcfg *InstancePtr) +{ + + u32 RegData; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Read the PCAP status register for DMA status */ + RegData = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_STATUS_OFFSET); + + if ((RegData & XDCFG_STATUS_DMA_CMD_Q_F_MASK) == + XDCFG_STATUS_DMA_CMD_Q_F_MASK){ + return XST_SUCCESS; + } + + return XST_FAILURE; +} + +/******************************************************************************/ +/** +* +* This function initiates the DMA transfer. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param SourcePtr contains a pointer to the source memory where the data +* is to be transferred from. +* @param SrcWordLength is the number of words (32 bit) to be transferred +* for the source transfer. +* @param DestPtr contains a pointer to the destination memory +* where the data is to be transferred to. +* @param DestWordLength is the number of words (32 bit) to be transferred +* for the Destination transfer. +* +* @return None. +* +* @note It is the responsibility of the caller function to ensure that +* correct values are passed to this function. +* +* The 2 LSBs of the SourcePtr (Source)/ DestPtr (Destination) +* address when equal to 2’b01 indicates the last DMA command of +* an overall transfer. +* +****************************************************************************/ +void XDcfg_InitiateDma(XDcfg *InstancePtr, u32 SourcePtr, u32 DestPtr, + u32 SrcWordLength, u32 DestWordLength) +{ + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_DMA_SRC_ADDR_OFFSET, + SourcePtr); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_DMA_DEST_ADDR_OFFSET, + DestPtr); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_DMA_SRC_LEN_OFFSET, + SrcWordLength); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_DMA_DEST_LEN_OFFSET, + DestWordLength); +} + +/******************************************************************************/ +/** +* +* This function Implements the DMA Read Command. This command is used to +* transfer the image data from FPGA to the external memory. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param SourcePtr contains a pointer to the source memory where the data +* is to be transferred from. +* @param SrcWordLength is the number of words (32 bit) to be transferred +* for the source transfer. +* @param DestPtr contains a pointer to the destination memory +* where the data is to be transferred to. +* @param DestWordLength is the number of words (32 bit) to be transferred +* for the Destination transfer. +* +* @return - XST_INVALID_PARAM if source address/length is invalid. +* - XST_SUCCESS if DMA transfer initiated properly. +* +* @note None. +* +****************************************************************************/ +static u32 XDcfg_PcapReadback(XDcfg *InstancePtr, u32 SourcePtr, + u32 SrcWordLength, u32 DestPtr, + u32 DestWordLength) +{ + u32 IntrReg; + + /* + * Send READ Frame command to FPGA + */ + XDcfg_InitiateDma(InstancePtr, SourcePtr, XDCFG_DMA_INVALID_ADDRESS, + SrcWordLength, 0); + + /* + * Store the enabled interrupts to enable before the actual read + * transfer is initiated and Disable all the interrupts temporarily. + */ + IntrReg = XDcfg_IntrGetEnabled(InstancePtr); + XDcfg_IntrDisable(InstancePtr, XDCFG_IXR_ALL_MASK); + + /* + * Wait till you get the DMA done for the read command sent + */ + while ((XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_STS_OFFSET) & + XDCFG_IXR_D_P_DONE_MASK) == + XDCFG_IXR_D_P_DONE_MASK); + /* + * Enable the previously stored Interrupts . + */ + XDcfg_IntrEnable(InstancePtr, IntrReg); + + /* + * Initiate the DMA write command. + */ + XDcfg_InitiateDma(InstancePtr, XDCFG_DMA_INVALID_ADDRESS, (u32)DestPtr, + 0, DestWordLength); + + return XST_SUCCESS; +} + + +/****************************************************************************/ +/** +* +* This function starts the DMA transfer. This function only starts the +* operation and returns before the operation may be completed. +* If the interrupt is enabled, an interrupt will be generated when the +* operation is completed, otherwise it is necessary to poll the Status register +* to determine when it is completed. It is the responsibility of the caller to +* determine when the operation is completed by handling the generated interrupt +* or polling the Status Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param SourcePtr contains a pointer to the source memory where the data +* is to be transferred from. +* @param SrcWordLength is the number of words (32 bit) to be transferred +* for the source transfer. +* @param DestPtr contains a pointer to the destination memory +* where the data is to be transferred to. +* @param DestWordLength is the number of words (32 bit) to be transferred +* for the Destination transfer. +* @param TransferType contains the type of PCAP transfer being requested. +* The definitions can be found in the xdevcfg.h file. +* @return +* - XST_SUCCESS.if DMA transfer initiated successfully +* - XST_DEVICE_BUSY if DMA is busy +* - XST_INVALID_PARAM if invalid Source / Destination address +* is sent or an invalid Source / Destination length is +* sent +* +* @note It is the responsibility of the caller to ensure that the cache +* is flushed and invalidated both before the DMA operation is +* started and after the DMA operation completes if the memory +* pointed to is cached. The caller must also ensure that the +* pointers contain physical address rather than a virtual address +* if address translation is being used. +* +* The 2 LSBs of the SourcePtr (Source)/ DestPtr (Destination) +* address when equal to 2’b01 indicates the last DMA command of +* an overall transfer. +* +*****************************************************************************/ +u32 XDcfg_Transfer(XDcfg *InstancePtr, + void *SourcePtr, u32 SrcWordLength, + void *DestPtr, u32 DestWordLength, + u32 TransferType) +{ + + u32 CtrlReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + if (XDcfg_IsDmaBusy(InstancePtr) == XST_SUCCESS) { + return XST_DEVICE_BUSY; + } + + /* + * Check whether the fabric is in initialized state + */ + if ((XDcfg_ReadReg(InstancePtr->Config.BaseAddr, XDCFG_STATUS_OFFSET) + & XDCFG_STATUS_PCFG_INIT_MASK) == 0) { + /* + * We don't need to check PCFG_INIT to be high for + * non-encrypted loopback transfers. + */ + if (TransferType != XDCFG_CONCURRENT_NONSEC_READ_WRITE) { + return XST_FAILURE; + } + } + + if ((TransferType == XDCFG_SECURE_PCAP_WRITE) || + (TransferType == XDCFG_NON_SECURE_PCAP_WRITE)) { + + /* Check for valid source pointer and length */ + if ((!SourcePtr) || (SrcWordLength == 0)) { + return XST_INVALID_PARAM; + } + + /* Clear internal PCAP loopback */ + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET); + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET, (CtrlReg & + ~(XDCFG_MCTRL_PCAP_LPBK_MASK))); + + if (TransferType == XDCFG_NON_SECURE_PCAP_WRITE) { + /* + * Clear QUARTER_PCAP_RATE_EN bit + * so that the PCAP data is transmitted every clock + */ + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET, (CtrlReg & + ~XDCFG_CTRL_PCAP_RATE_EN_MASK)); + + } + if (TransferType == XDCFG_SECURE_PCAP_WRITE) { + /* + * AES engine handles only 8 bit data every clock cycle. + * Hence, Encrypted PCAP data which is 32 bit data can + * only be sent in every 4 clock cycles. Set the control + * register QUARTER_PCAP_RATE_EN bit to achieve this + * operation. + */ + XDcfg_SetControlRegister(InstancePtr, + XDCFG_CTRL_PCAP_RATE_EN_MASK); + } + + XDcfg_InitiateDma(InstancePtr, (u32)SourcePtr, + (u32)DestPtr, SrcWordLength, DestWordLength); + + } + + if (TransferType == XDCFG_PCAP_READBACK) { + + if ((!DestPtr) || (DestWordLength == 0)) { + + return XST_INVALID_PARAM; + } + + /* Clear internal PCAP loopback */ + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET); + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET, (CtrlReg & + ~(XDCFG_MCTRL_PCAP_LPBK_MASK))); + + /* + * For PCAP readback of FPGA configuration register or memory, + * the read command is first sent (written) to the FPGA fabric + * which responds by returning the required read data. Read data + * from the FPGA is captured if pcap_radata_v is active.A DMA + * read transfer is required to obtain the readback command, + * which is then sent to the FPGA, followed by a DMA write + * transfer to support this mode of operation. + */ + return XDcfg_PcapReadback(InstancePtr, + (u32)SourcePtr, SrcWordLength, + (u32)DestPtr, DestWordLength); + } + + + if ((TransferType == XDCFG_CONCURRENT_SECURE_READ_WRITE) || + (TransferType == XDCFG_CONCURRENT_NONSEC_READ_WRITE)) { + + if ((!SourcePtr) || (SrcWordLength == 0) || + (!DestPtr) || (DestWordLength == 0)) { + return XST_INVALID_PARAM; + } + + if (TransferType == XDCFG_CONCURRENT_NONSEC_READ_WRITE) { + /* Enable internal PCAP loopback */ + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET); + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET, (CtrlReg | + XDCFG_MCTRL_PCAP_LPBK_MASK)); + + /* + * Clear QUARTER_PCAP_RATE_EN bit + * so that the PCAP data is transmitted every clock + */ + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_CTRL_OFFSET, (CtrlReg & + ~XDCFG_CTRL_PCAP_RATE_EN_MASK)); + + } + if (TransferType == XDCFG_CONCURRENT_SECURE_READ_WRITE) { + /* Clear internal PCAP loopback */ + CtrlReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET); + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_MCTRL_OFFSET, (CtrlReg & + ~(XDCFG_MCTRL_PCAP_LPBK_MASK))); + + /* + * Set the QUARTER_PCAP_RATE_EN bit + * so that the PCAP data is transmitted every 4 clock + * cycles, this is required for encrypted data. + */ + XDcfg_SetControlRegister(InstancePtr, + XDCFG_CTRL_PCAP_RATE_EN_MASK); + } + + XDcfg_InitiateDma(InstancePtr, (u32)SourcePtr, + (u32)DestPtr, SrcWordLength, DestWordLength); + } + + return XST_SUCCESS; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg.h new file mode 100755 index 000000000..124838496 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg.h @@ -0,0 +1,385 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg.h +* +* The is the main header file for the Device Configuration Interface of the Zynq +* device. The device configuration interface has three main functionality. +* 1. AXI-PCAP +* 2. Security Policy +* 3. XADC +* This current version of the driver supports only the AXI-PCAP and Security +* Policy blocks. There is a separate driver for XADC. +* +* AXI-PCAP is used for download/upload an encrypted or decrypted bitstream. +* DMA embedded in the AXI PCAP provides the master interface to +* the Device configuration block for any DMA transfers. The data transfer can +* take place between the Tx/RxFIFOs of AXI-PCAP and memory (on chip +* RAM/DDR/peripheral memory). +* +* The current driver only supports the downloading the FPGA bitstream and +* readback of the decrypted image (sort of loopback). +* The driver does not know what information needs to be written to the FPGA to +* readback FPGA configuration register or memory data. The application above the +* driver should take care of creating the data that needs to be downloaded to +* the FPGA so that the bitstream can be readback. +* This driver also does not support the reading of the internal registers of the +* PCAP. The driver has no knowledge of the PCAP internals. +* +* <b> Initialization and Configuration </b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate with the Device Configuration device. +* +* XDcfg_CfgInitialize() API is used to initialize the Device Configuration +* Interface. The user needs to first call the XDcfg_LookupConfig() API which +* returns the Configuration structure pointer which is passed as a parameter to +* the XDcfg_CfgInitialize() API. +* +* <b>Interrupts</b> +* The Driver implements an interrupt handler to support the interrupts provided +* by this interface. +* +* <b> Threads </b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* <b> Asserts </b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* <b> Building the driver </b> +* +* The XDcfg driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* +* <br><br> +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a hvm 02/07/11 First release +* 2.00a nm 05/31/12 Updated the driver for CR 660835 so that input length for +* source/destination to the XDcfg_InitiateDma, XDcfg_Transfer +* APIs is words (32 bit) and not bytes. +* Updated the notes for XDcfg_InitiateDma/XDcfg_Transfer APIs +* to add information that 2 LSBs of the Source/Destination +* address when equal to 2’b01 indicate the last DMA command +* of an overall transfer. +* Destination Address passed to this API for secure transfers +* instead of using 0xFFFFFFFF for CR 662197. This issue was +* resulting in the failure of secure transfers of +* non-bitstream images. +* 2.01a nm 07/07/12 Updated the XDcfg_IntrClear function to directly +* set the mask instead of oring it with the +* value read from the interrupt status register +* Added defines for the PS Version bits, +* removed the FIFO Flush bits from the +* Miscellaneous Control Reg. +* Added XDcfg_GetPsVersion, XDcfg_SelectIcapInterface +* and XDcfg_SelectPcapInterface APIs for CR 643295 +* The user has to call the XDcfg_SelectIcapInterface API +* for the PL reconfiguration using AXI HwIcap. +* Updated the XDcfg_Transfer API to clear the +* QUARTER_PCAP_RATE_EN bit in the control register for +* non secure writes for CR 675543. +* 2.02a nm 01/31/13 Fixed CR# 679335. +* Added Setting and Clearing the internal PCAP loopback. +* Removed code for enabling/disabling AES engine as BootROM +* locks down this setting. +* Fixed CR# 681976. +* Skip Checking the PCFG_INIT in case of non-secure DMA +* loopback. +* Fixed CR# 699558. +* XDcfg_Transfer fails to transfer data in loopback mode. +* Fixed CR# 701348. +* Peripheral test fails with Running +* DcfgSelfTestExample() in SECURE bootmode. +* 2.03a nm 04/19/13 Fixed CR# 703728. +* Updated the register definitions as per the latest TRM +* version UG585 (v1.4) November 16, 2012. +* </pre> +* +******************************************************************************/ +#ifndef XDCFG_H /* prevent circular inclusions */ +#define XDCFG_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xdevcfg_hw.h" +#include "xstatus.h" +#include "xil_assert.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/* Types of PCAP transfers */ + +#define XDCFG_NON_SECURE_PCAP_WRITE 1 +#define XDCFG_SECURE_PCAP_WRITE 2 +#define XDCFG_PCAP_READBACK 3 +#define XDCFG_CONCURRENT_SECURE_READ_WRITE 4 +#define XDCFG_CONCURRENT_NONSEC_READ_WRITE 5 + + +/**************************** Type Definitions *******************************/ +/** +* The handler data type allows the user to define a callback function to +* respond to interrupt events in the system. This function is executed +* in interrupt context, so amount of processing should be minimized. +* +* @param CallBackRef is the callback reference passed in by the upper +* layer when setting the callback functions, and passed back to +* the upper layer when the callback is invoked. Its type is +* unimportant to the driver component, so it is a void pointer. +* @param Status is the Interrupt status of the XDcfg device. +*/ +typedef void (*XDcfg_IntrHandler) (void *CallBackRef, u32 Status); + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Base address of the device */ +} XDcfg_Config; + +/** + * The XDcfg driver instance data. + */ +typedef struct { + XDcfg_Config Config; /**< Hardware Configuration */ + u32 IsReady; /**< Device is initialized and ready */ + u32 IsStarted; /**< Device Configuration Interface + * is running + */ + XDcfg_IntrHandler StatusHandler; /* Event handler function */ + void *CallBackRef; /* Callback reference for event handler */ +} XDcfg; + +/****************************************************************************/ +/** +* +* Unlock the Device Config Interface block. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return None. +* +* @note C-style signature: +* void XDcfg_Unlock(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_Unlock(InstancePtr) \ + XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, \ + XDCFG_UNLOCK_OFFSET, XDCFG_UNLOCK_DATA) + + + +/****************************************************************************/ +/** +* +* Get the version number of the PS from the Miscellaneous Control Register. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return Version of the PS. +* +* @note C-style signature: +* void XDcfg_GetPsVersion(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_GetPsVersion(InstancePtr) \ + ((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, \ + XDCFG_MCTRL_OFFSET)) & \ + XDCFG_MCTRL_PCAP_PS_VERSION_MASK) >> \ + XDCFG_MCTRL_PCAP_PS_VERSION_SHIFT + + + +/****************************************************************************/ +/** +* +* Read the multiboot config register value. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return None. +* +* @note C-style signature: +* u32 XDcfg_ReadMultiBootConfig(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_ReadMultiBootConfig(InstancePtr) \ + XDcfg_ReadReg((InstancePtr)->Config.BaseAddr + \ + XDCFG_MULTIBOOT_ADDR_OFFSET) + + +/****************************************************************************/ +/** +* +* Selects ICAP interface for reconfiguration after the initial configuration +* of the PL. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return None. +* +* @note C-style signature: +* void XDcfg_SelectIcapInterface(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_SelectIcapInterface(InstancePtr) \ + XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET, \ + ((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET)) \ + & ( ~XDCFG_CTRL_PCAP_PR_MASK))) + +/****************************************************************************/ +/** +* +* Selects PCAP interface for reconfiguration after the initial configuration +* of the PL. +* +* @param InstancePtr is a pointer to the instance of XDcfg driver. +* +* @return None. +* +* @note C-style signature: +* void XDcfg_SelectPcapInterface(XDcfg* InstancePtr) +* +*****************************************************************************/ +#define XDcfg_SelectPcapInterface(InstancePtr) \ + XDcfg_WriteReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET, \ + ((XDcfg_ReadReg((InstancePtr)->Config.BaseAddr, XDCFG_CTRL_OFFSET)) \ + | XDCFG_CTRL_PCAP_PR_MASK)) + + + +/************************** Function Prototypes ******************************/ + +/* + * Lookup configuration in xdevcfg_sinit.c. + */ +XDcfg_Config *XDcfg_LookupConfig(u16 DeviceId); + +/* + * Selftest function in xdevcfg_selftest.c + */ +int XDcfg_SelfTest(XDcfg *InstancePtr); + +/* + * Interface functions in xdevcfg.c + */ +int XDcfg_CfgInitialize(XDcfg *InstancePtr, + XDcfg_Config *ConfigPtr, u32 EffectiveAddress); + +void XDcfg_EnablePCAP(XDcfg *InstancePtr); + +void XDcfg_DisablePCAP(XDcfg *InstancePtr); + +void XDcfg_SetControlRegister(XDcfg *InstancePtr, u32 Mask); + +u32 XDcfg_GetControlRegister(XDcfg *InstancePtr); + +void XDcfg_SetLockRegister(XDcfg *InstancePtr, u32 Data); + +u32 XDcfg_GetLockRegister(XDcfg *InstancePtr); + +void XDcfg_SetConfigRegister(XDcfg *InstancePtr, u32 Data); + +u32 XDcfg_GetConfigRegister(XDcfg *InstancePtr); + +void XDcfg_SetStatusRegister(XDcfg *InstancePtr, u32 Data); + +u32 XDcfg_GetStatusRegister(XDcfg *InstancePtr); + +void XDcfg_SetRomShadowRegister(XDcfg *InstancePtr, u32 Data); + +u32 XDcfg_GetSoftwareIdRegister(XDcfg *InstancePtr); + +void XDcfg_SetMiscControlRegister(XDcfg *InstancePtr, u32 Mask); + +u32 XDcfg_GetMiscControlRegister(XDcfg *InstancePtr); + +u32 XDcfg_IsDmaBusy(XDcfg *InstancePtr); + +void XDcfg_InitiateDma(XDcfg *InstancePtr, u32 SourcePtr, u32 DestPtr, + u32 SrcWordLength, u32 DestWordLength); + +u32 XDcfg_Transfer(XDcfg *InstancePtr, + void *SourcePtr, u32 SrcWordLength, + void *DestPtr, u32 DestWordLength, + u32 TransferType); + +/* + * Interrupt related function prototypes implemented in xdevcfg_intr.c + */ +void XDcfg_IntrEnable(XDcfg *InstancePtr, u32 Mask); + +void XDcfg_IntrDisable(XDcfg *InstancePtr, u32 Mask); + +u32 XDcfg_IntrGetEnabled(XDcfg *InstancePtr); + +u32 XDcfg_IntrGetStatus(XDcfg *InstancePtr); + +void XDcfg_IntrClear(XDcfg *InstancePtr, u32 Mask); + +void XDcfg_InterruptHandler(XDcfg *InstancePtr); + +void XDcfg_SetHandler(XDcfg *InstancePtr, void *CallBackFunc, + void *CallBackRef); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_g.c new file mode 100644 index 000000000..d7fddc455 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_g.c @@ -0,0 +1,30 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xdevcfg.h" + +/* +* The configuration table for devices +*/ + +XDcfg_Config XDcfg_ConfigTable[] = +{ + { + XPAR_PS7_DEV_CFG_0_DEVICE_ID, + XPAR_PS7_DEV_CFG_0_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_hw.c new file mode 100755 index 000000000..f24222154 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_hw.c @@ -0,0 +1,119 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_hw.c +* +* This file contains the implementation of the interface reset functionality +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 2.04a kpc 10/07/13 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xdevcfg_hw.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/*****************************************************************************/ +/** +* This function perform the reset sequence to the given devcfg interface by +* configuring the appropriate control bits in the devcfg specifc registers +* the devcfg reset squence involves the following steps +* Disable all the interuupts +* Clear the status +* Update relevant config registers with reset values +* Disbale the looopback mode and pcap rate enable +* +* @param BaseAddress of the interface +* +* @return N/A +* +* @note +* This function will not modify the slcr registers that are relavant for +* devcfg controller +******************************************************************************/ +void XDcfg_ResetHw(u32 BaseAddr) +{ + u32 Regval = 0; + + /* Mask the interrupts */ + XDcfg_WriteReg(BaseAddr, XDCFG_INT_MASK_OFFSET, + XDCFG_IXR_ALL_MASK); + /* Clear the interuupt status */ + Regval = XDcfg_ReadReg(BaseAddr, XDCFG_INT_STS_OFFSET); + XDcfg_WriteReg(BaseAddr, XDCFG_INT_STS_OFFSET, Regval); + /* Clear the source address register */ + XDcfg_WriteReg(BaseAddr, XDCFG_DMA_SRC_ADDR_OFFSET, 0x0); + /* Clear the destination address register */ + XDcfg_WriteReg(BaseAddr, XDCFG_DMA_DEST_ADDR_OFFSET, 0x0); + /* Clear the source length register */ + XDcfg_WriteReg(BaseAddr, XDCFG_DMA_SRC_LEN_OFFSET, 0x0); + /* Clear the destination length register */ + XDcfg_WriteReg(BaseAddr, XDCFG_DMA_DEST_LEN_OFFSET, 0x0); + /* Clear the loopback enable bit */ + Regval = XDcfg_ReadReg(BaseAddr, XDCFG_MCTRL_OFFSET); + Regval = Regval & ~XDCFG_MCTRL_PCAP_LPBK_MASK; + XDcfg_WriteReg(BaseAddr, XDCFG_MCTRL_OFFSET, Regval); + /*Reset the configuration register to reset value */ + XDcfg_WriteReg(BaseAddr, XDCFG_CFG_OFFSET, + XDCFG_CONFIG_RESET_VALUE); + /*Disable the PCAP rate enable bit */ + Regval = XDcfg_ReadReg(BaseAddr, XDCFG_CTRL_OFFSET); + Regval = Regval & ~XDCFG_CTRL_PCAP_RATE_EN_MASK; + XDcfg_WriteReg(BaseAddr, XDCFG_CTRL_OFFSET, Regval); + +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_hw.h new file mode 100755 index 000000000..ccac60abb --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_hw.h @@ -0,0 +1,400 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_hw.h +* +* This file contains the hardware interface to the Device Config Interface. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a hvm 02/07/11 First release +* 2.01a nm 08/01/12 Added defines for the PS Version bits, +* removed the FIFO Flush bits from the +* Miscellaneous Control Reg +* 2.03a nm 04/19/13 Fixed CR# 703728. +* Updated the register definitions as per the latest TRM +* version UG585 (v1.4) November 16, 2012. +* 2.04a kpc 10/07/13 Added function prototype. +* </pre> +* +******************************************************************************/ +#ifndef XDCFG_HW_H /* prevent circular inclusions */ +#define XDCFG_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * Offsets of registers from the start of the device + * @{ + */ + +#define XDCFG_CTRL_OFFSET 0x00 /**< Control Register */ +#define XDCFG_LOCK_OFFSET 0x04 /**< Lock Register */ +#define XDCFG_CFG_OFFSET 0x08 /**< Configuration Register */ +#define XDCFG_INT_STS_OFFSET 0x0C /**< Interrupt Status Register */ +#define XDCFG_INT_MASK_OFFSET 0x10 /**< Interrupt Mask Register */ +#define XDCFG_STATUS_OFFSET 0x14 /**< Status Register */ +#define XDCFG_DMA_SRC_ADDR_OFFSET 0x18 /**< DMA Source Address Register */ +#define XDCFG_DMA_DEST_ADDR_OFFSET 0x1C /**< DMA Destination Address Reg */ +#define XDCFG_DMA_SRC_LEN_OFFSET 0x20 /**< DMA Source Transfer Length */ +#define XDCFG_DMA_DEST_LEN_OFFSET 0x24 /**< DMA Destination Transfer */ +#define XDCFG_ROM_SHADOW_OFFSET 0x28 /**< DMA ROM Shadow Register */ +#define XDCFG_MULTIBOOT_ADDR_OFFSET 0x2C /**< Multi BootAddress Pointer */ +#define XDCFG_SW_ID_OFFSET 0x30 /**< Software ID Register */ +#define XDCFG_UNLOCK_OFFSET 0x34 /**< Unlock Register */ +#define XDCFG_MCTRL_OFFSET 0x80 /**< Miscellaneous Control Reg */ + +/* @} */ + +/** @name Control Register Bit definitions + * @{ + */ + +#define XDCFG_CTRL_FORCE_RST_MASK 0x80000000 /**< Force into + * Secure Reset + */ +#define XDCFG_CTRL_PCFG_PROG_B_MASK 0x40000000 /**< Program signal to + * Reset FPGA + */ +#define XDCFG_CTRL_PCFG_POR_CNT_4K_MASK 0x20000000 /**< Control PL POR timer */ +#define XDCFG_CTRL_PCAP_PR_MASK 0x08000000 /**< Enable PCAP for PR */ +#define XDCFG_CTRL_PCAP_MODE_MASK 0x04000000 /**< Enable PCAP */ +#define XDCFG_CTRL_PCAP_RATE_EN_MASK 0x02000000 /**< Enable PCAP send data + * to FPGA every 4 PCAP + * cycles + */ +#define XDCFG_CTRL_MULTIBOOT_EN_MASK 0x01000000 /**< Multiboot Enable */ +#define XDCFG_CTRL_JTAG_CHAIN_DIS_MASK 0x00800000 /**< JTAG Chain Disable */ +#define XDCFG_CTRL_USER_MODE_MASK 0x00008000 /**< User Mode Mask */ +#define XDCFG_CTRL_PCFG_AES_FUSE_MASK 0x00001000 /**< AES key source */ +#define XDCFG_CTRL_PCFG_AES_EN_MASK 0x00000E00 /**< AES Enable Mask */ +#define XDCFG_CTRL_SEU_EN_MASK 0x00000100 /**< SEU Enable Mask */ +#define XDCFG_CTRL_SEC_EN_MASK 0x00000080 /**< Secure/Non Secure + * Status mask + */ +#define XDCFG_CTRL_SPNIDEN_MASK 0x00000040 /**< Secure Non Invasive + * Debug Enable + */ +#define XDCFG_CTRL_SPIDEN_MASK 0x00000020 /**< Secure Invasive + * Debug Enable + */ +#define XDCFG_CTRL_NIDEN_MASK 0x00000010 /**< Non-Invasive Debug + * Enable + */ +#define XDCFG_CTRL_DBGEN_MASK 0x00000008 /**< Invasive Debug + * Enable + */ +#define XDCFG_CTRL_DAP_EN_MASK 0x00000007 /**< DAP Enable Mask */ + +/* @} */ + +/** @name Lock register bit definitions + * @{ + */ + +#define XDCFG_LOCK_AES_EFUSE_MASK 0x00000010 /**< Lock AES Efuse bit */ +#define XDCFG_LOCK_AES_EN_MASK 0x00000008 /**< Lock AES_EN update */ +#define XDCFG_LOCK_SEU_MASK 0x00000004 /**< Lock SEU_En update */ +#define XDCFG_LOCK_SEC_MASK 0x00000002 /**< Lock SEC_EN and + * USER_MODE + */ +#define XDCFG_LOCK_DBG_MASK 0x00000001 /**< This bit locks + * security config + * including: DAP_En, + * DBGEN,, + * NIDEN, SPNIEN + */ +/*@}*/ + + + +/** @name Config Register Bit definitions + * @{ + */ +#define XDCFG_CFG_RFIFO_TH_MASK 0x00000C00 /**< Read FIFO + * Threshold Mask + */ +#define XDCFG_CFG_WFIFO_TH_MASK 0x00000300 /**< Write FIFO Threshold + * Mask + */ +#define XDCFG_CFG_RCLK_EDGE_MASK 0x00000080 /**< Read data active + * clock edge + */ +#define XDCFG_CFG_WCLK_EDGE_MASK 0x00000040 /**< Write data active + * clock edge + */ +#define XDCFG_CFG_DISABLE_SRC_INC_MASK 0x00000020 /**< Disable Source address + * increment mask + */ +#define XDCFG_CFG_DISABLE_DST_INC_MASK 0x00000010 /**< Disable Destination + * address increment + * mask + */ +/* @} */ + + +/** @name Interrupt Status/Mask Register Bit definitions + * @{ + */ +#define XDCFG_IXR_PSS_GTS_USR_B_MASK 0x80000000 /**< Tri-state IO during + * HIZ + */ +#define XDCFG_IXR_PSS_FST_CFG_B_MASK 0x40000000 /**< First configuration + * done + */ +#define XDCFG_IXR_PSS_GPWRDWN_B_MASK 0x20000000 /**< Global power down */ +#define XDCFG_IXR_PSS_GTS_CFG_B_MASK 0x10000000 /**< Tri-state IO during + * configuration + */ +#define XDCFG_IXR_PSS_CFG_RESET_B_MASK 0x08000000 /**< PL configuration + * reset + */ +#define XDCFG_IXR_AXI_WTO_MASK 0x00800000 /**< AXI Write Address + * or Data or response + * timeout + */ +#define XDCFG_IXR_AXI_WERR_MASK 0x00400000 /**< AXI Write response + * error + */ +#define XDCFG_IXR_AXI_RTO_MASK 0x00200000 /**< AXI Read Address or + * response timeout + */ +#define XDCFG_IXR_AXI_RERR_MASK 0x00100000 /**< AXI Read response + * error + */ +#define XDCFG_IXR_RX_FIFO_OV_MASK 0x00040000 /**< Rx FIFO Overflow */ +#define XDCFG_IXR_WR_FIFO_LVL_MASK 0x00020000 /**< Tx FIFO less than + * threshold */ +#define XDCFG_IXR_RD_FIFO_LVL_MASK 0x00010000 /**< Rx FIFO greater than + * threshold */ +#define XDCFG_IXR_DMA_CMD_ERR_MASK 0x00008000 /**< Illegal DMA command */ +#define XDCFG_IXR_DMA_Q_OV_MASK 0x00004000 /**< DMA command queue + * overflow + */ +#define XDCFG_IXR_DMA_DONE_MASK 0x00002000 /**< DMA Command Done */ +#define XDCFG_IXR_D_P_DONE_MASK 0x00001000 /**< DMA and PCAP + * transfers Done + */ +#define XDCFG_IXR_P2D_LEN_ERR_MASK 0x00000800 /**< PCAP to DMA transfer + * length error + */ +#define XDCFG_IXR_PCFG_HMAC_ERR_MASK 0x00000040 /**< HMAC error mask */ +#define XDCFG_IXR_PCFG_SEU_ERR_MASK 0x00000020 /**< SEU Error mask */ +#define XDCFG_IXR_PCFG_POR_B_MASK 0x00000010 /**< FPGA POR mask */ +#define XDCFG_IXR_PCFG_CFG_RST_MASK 0x00000008 /**< FPGA Reset mask */ +#define XDCFG_IXR_PCFG_DONE_MASK 0x00000004 /**< Done Signal Mask */ +#define XDCFG_IXR_PCFG_INIT_PE_MASK 0x00000002 /**< Detect Positive edge + * of Init Signal + */ +#define XDCFG_IXR_PCFG_INIT_NE_MASK 0x00000001 /**< Detect Negative edge + * of Init Signal + */ +#define XDCFG_IXR_ERROR_FLAGS_MASK (XDCFG_IXR_AXI_WTO_MASK | \ + XDCFG_IXR_AXI_WERR_MASK | \ + XDCFG_IXR_AXI_RTO_MASK | \ + XDCFG_IXR_AXI_RERR_MASK | \ + XDCFG_IXR_RX_FIFO_OV_MASK | \ + XDCFG_IXR_DMA_CMD_ERR_MASK |\ + XDCFG_IXR_DMA_Q_OV_MASK | \ + XDCFG_IXR_P2D_LEN_ERR_MASK |\ + XDCFG_IXR_PCFG_HMAC_ERR_MASK) + + +#define XDCFG_IXR_ALL_MASK 0x00F7F8EF + + + +/* @} */ + + +/** @name Status Register Bit definitions + * @{ + */ +#define XDCFG_STATUS_DMA_CMD_Q_F_MASK 0x80000000 /**< DMA command + * Queue full + */ +#define XDCFG_STATUS_DMA_CMD_Q_E_MASK 0x40000000 /**< DMA command + * Queue empty + */ +#define XDCFG_STATUS_DMA_DONE_CNT_MASK 0x30000000 /**< Number of + * completed DMA + * transfers + */ +#define XDCFG_STATUS_RX_FIFO_LVL_MASK 0x01F000000 /**< Rx FIFO level */ +#define XDCFG_STATUS_TX_FIFO_LVL_MASK 0x0007F000 /**< Tx FIFO level */ + +#define XDCFG_STATUS_PSS_GTS_USR_B 0x00000800 /**< Tri-state IO + * during HIZ + */ +#define XDCFG_STATUS_PSS_FST_CFG_B 0x00000400 /**< First PL config + * done + */ +#define XDCFG_STATUS_PSS_GPWRDWN_B 0x00000200 /**< Global power down */ +#define XDCFG_STATUS_PSS_GTS_CFG_B 0x00000100 /**< Tri-state IO during + * config + */ +#define XDCFG_STATUS_SECURE_RST_MASK 0x00000080 /**< Secure Reset + * POR Status + */ +#define XDCFG_STATUS_ILLEGAL_APB_ACCESS_MASK 0x00000040 /**< Illegal APB + * access + */ +#define XDCFG_STATUS_PSS_CFG_RESET_B 0x00000020 /**< PL config + * reset status + */ +#define XDCFG_STATUS_PCFG_INIT_MASK 0x00000010 /**< FPGA Init + * Status + */ +#define XDCFG_STATUS_EFUSE_BBRAM_KEY_DISABLE_MASK 0x00000008 + /**< BBRAM key + * disable + */ +#define XDCFG_STATUS_EFUSE_SEC_EN_MASK 0x00000004 /**< Efuse Security + * Enable Status + */ +#define XDCFG_STATUS_EFUSE_JTAG_DIS_MASK 0x00000002 /**< EFuse JTAG + * Disable + * status + */ +/* @} */ + + +/** @name DMA Source/Destination Transfer Length Register Bit definitions + * @{ + */ +#define XDCFG_DMA_LEN_MASK 0x7FFFFFF /**< Length Mask */ +/*@}*/ + + + + +/** @name Miscellaneous Control Register Bit definitions + * @{ + */ +#define XDCFG_MCTRL_PCAP_PS_VERSION_MASK 0xF0000000 /**< PS Version Mask */ +#define XDCFG_MCTRL_PCAP_PS_VERSION_SHIFT 28 /**< PS Version Shift */ +#define XDCFG_MCTRL_PCAP_LPBK_MASK 0x00000010 /**< PCAP loopback mask */ +/* @} */ + +/** @name FIFO Threshold Bit definitions + * @{ + */ + +#define XDCFG_CFG_FIFO_QUARTER 0x0 /**< Quarter empty */ +#define XDCFG_CFG_FIFO_HALF 0x1 /**< Half empty */ +#define XDCFG_CFG_FIFO_3QUARTER 0x2 /**< 3/4 empty */ +#define XDCFG_CFG_FIFO_EMPTY 0x4 /**< Empty */ +/* @}*/ + + +/* Miscellaneous constant values */ +#define XDCFG_DMA_INVALID_ADDRESS 0xFFFFFFFF /**< Invalid DMA address */ +#define XDCFG_UNLOCK_DATA 0x757BDF0D /**< First APB access data*/ +#define XDCFG_BASE_ADDRESS 0xFE007000 /**< Device Config base + * address + */ +#define XDCFG_CONFIG_RESET_VALUE 0x508 /**< Config reg reset value */ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Read the given register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note C-style signature: +* u32 XDcfg_ReadReg(u32 BaseAddr, u32 RegOffset) +* +*****************************************************************************/ +#define XDcfg_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (RegOffset)) + +/****************************************************************************/ +/** +* +* Write to the given register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note C-style signature: +* void XDcfg_WriteReg(u32 BaseAddr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XDcfg_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (RegOffset), (Data)) + +/************************** Function Prototypes ******************************/ +/* + * Perform reset operation to the devcfg interface + */ +void XDcfg_ResetHw(u32 BaseAddr); +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_intr.c new file mode 100755 index 000000000..0ca44616e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_intr.c @@ -0,0 +1,316 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_intr.c +* +* Contains the implementation of interrupt related functions of the XDcfg +* driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a hvm 02/07/11 First release +* 2.01a nm 07/07/12 Updated the XDcfg_IntrClear function to directly +* set the mask instead of oring it with the +* value read from the interrupt status register +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xdevcfg.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/****************************************************************************/ +/** +* +* This function enables the specified interrupts in the device. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Mask is the bit-mask of the interrupts to be enabled. +* Bit positions of 1 will be enabled. Bit positions of 0 will +* keep the previous setting. This mask is formed by OR'ing +* XDCFG_INT_* bits defined in xdevcfg_hw.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_IntrEnable(XDcfg *InstancePtr, u32 Mask) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Enable the specified interrupts in the Interrupt Mask Register. + */ + RegValue = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_MASK_OFFSET); + RegValue &= ~(Mask & XDCFG_IXR_ALL_MASK); + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_MASK_OFFSET, + RegValue); +} + + +/****************************************************************************/ +/** +* +* This function disables the specified interrupts in the device. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Mask is the bit-mask of the interrupts to be disabled. +* Bit positions of 1 will be disabled. Bit positions of 0 will +* keep the previous setting. This mask is formed by OR'ing +* XDCFG_INT_* bits defined in xdevcfg_hw.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_IntrDisable(XDcfg *InstancePtr, u32 Mask) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Disable the specified interrupts in the Interrupt Mask Register. + */ + RegValue = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_MASK_OFFSET); + RegValue |= (Mask & XDCFG_IXR_ALL_MASK); + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_MASK_OFFSET, + RegValue); +} +/****************************************************************************/ +/** +* +* This function returns the enabled interrupts read from the Interrupt Mask +* Register. Use the XDCFG_INT_* constants defined in xdevcfg_hw.h +* to interpret the returned value. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return A 32-bit value representing the contents of the IMR. +* +* @note None. +* +*****************************************************************************/ +u32 XDcfg_IntrGetEnabled(XDcfg *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Return the value read from the Interrupt Mask Register. + */ + return (~ XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_MASK_OFFSET)); +} + +/****************************************************************************/ +/** +* +* This function returns the interrupt status read from Interrupt Status +* Register. Use the XDCFG_INT_* constants defined in xdevcfg_hw.h +* to interpret the returned value. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return A 32-bit value representing the contents of the Interrupt +* Status register. +* +* @note None. +* +*****************************************************************************/ +u32 XDcfg_IntrGetStatus(XDcfg *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Return the value read from the Interrupt Status register. + */ + return XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_STS_OFFSET); +} + +/****************************************************************************/ +/** +* +* This function clears the specified interrupts in the Interrupt Status +* Register. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* @param Mask is the bit-mask of the interrupts to be cleared. +* Bit positions of 1 will be cleared. Bit positions of 0 will not +* change the previous interrupt status. This mask is formed by +* OR'ing XDCFG_INT_* bits which are defined in xdevcfg_hw.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XDcfg_IntrClear(XDcfg *InstancePtr, u32 Mask) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_STS_OFFSET, + Mask); + +} + +/*****************************************************************************/ +/** +* The interrupt handler for the Device Config Interface. +* +* Events are signaled to upper layer for proper handling. +* +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XDcfg_InterruptHandler(XDcfg *InstancePtr) +{ + u32 IntrStatusReg; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Interrupt status register. + */ + IntrStatusReg = XDcfg_ReadReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_STS_OFFSET); + + /* + * Write the status back to clear the interrupts so that no + * subsequent interrupts are missed while processing this interrupt. + * This also does the DMA acknowledgment automatically. + */ + XDcfg_WriteReg(InstancePtr->Config.BaseAddr, + XDCFG_INT_STS_OFFSET, IntrStatusReg); + + /* + * Signal application that there are events to handle. + */ + InstancePtr->StatusHandler(InstancePtr->CallBackRef, + IntrStatusReg); + +} + +/****************************************************************************/ +/** +* +* This function sets the handler that will be called when an event (interrupt) +* occurs that needs application's attention. +* +* @param InstancePtr is a pointer to the XDcfg instance +* @param CallBackFunc is the address of the callback function. +* @param CallBackRef is a user data item that will be passed to the +* callback function when it is invoked. +* +* @return None. +* +* @note None. +* +* +*****************************************************************************/ +void XDcfg_SetHandler(XDcfg *InstancePtr, void *CallBackFunc, + void *CallBackRef) +{ + /* + * Asserts validate the input arguments + * CallBackRef not checked, no way to know what is valid + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(CallBackFunc != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + InstancePtr->StatusHandler = (XDcfg_IntrHandler) CallBackFunc; + InstancePtr->CallBackRef = CallBackRef; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_selftest.c new file mode 100755 index 000000000..cdb2a0761 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_selftest.c @@ -0,0 +1,120 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license1and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdevcfg_selftest.c +* +* Contains diagnostic self-test functions for the XDcfg driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a hvm 02/07/11 First release +* 2.02a nm 02/27/13 Fixed CR# 701348. +* Peripheral test fails with Running +* DcfgSelfTestExample() in SECURE bootmode. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xdevcfg.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/****************************************************************************/ +/** +* +* Run a self-test on the Device Configuration Interface. This test does a +* control register write and reads back the same value. +* +* @param InstancePtr is a pointer to the XDcfg instance. +* +* @return +* - XST_SUCCESS if self-test was successful. +* - XST_FAILURE if fails. +* +* @note None. +* +******************************************************************************/ +int XDcfg_SelfTest(XDcfg *InstancePtr) +{ + u32 OldCfgReg; + u32 CfgReg; + int Status = XST_SUCCESS; + + /* + * Assert to ensure the inputs are valid and the instance has been + * initialized. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + OldCfgReg = XDcfg_GetControlRegister(InstancePtr); + + XDcfg_SetControlRegister(InstancePtr, XDCFG_CTRL_NIDEN_MASK); + + CfgReg = XDcfg_GetControlRegister(InstancePtr); + + if ((CfgReg & XDCFG_CTRL_NIDEN_MASK) != XDCFG_CTRL_NIDEN_MASK) { + + Status = XST_FAILURE; + } + + /* + * Restore the original values of the register + */ + XDcfg_SetControlRegister(InstancePtr, OldCfgReg); + + return Status; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_sinit.c new file mode 100755 index 000000000..8964796f0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/devcfg_v2_04_a/src/xdevcfg_sinit.c @@ -0,0 +1,99 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xdevcfg_sinit.c +* +* This file contains method for static initialization (compile-time) of the +* driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a hvm 02/07/11 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xdevcfg.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* Lookup the device configuration based on the unique device ID. The table +* contains the configuration info for each device in the system. +* +* @param DeviceId is the unique device ID of the device being looked up. +* +* @return A pointer to the configuration table entry corresponding to the +* given device ID, or NULL if no match is found. +* +* @note None. +* +******************************************************************************/ +XDcfg_Config *XDcfg_LookupConfig(u16 DeviceId) +{ + extern XDcfg_Config XDcfg_ConfigTable[]; + XDcfg_Config *CfgPtr = NULL; + int Index; + + for (Index = 0; Index < XPAR_XDCFG_NUM_INSTANCES; Index++) { + if (XDcfg_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XDcfg_ConfigTable[Index]; + break; + } + } + + return (CfgPtr); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/Makefile new file mode 100755 index 000000000..d1240c586 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xdmaps_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling dmaps" + +xdmaps_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xdmaps_includes + +xdmaps_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps.c new file mode 100755 index 000000000..838adda80 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps.c @@ -0,0 +1,2091 @@ +/***************************************************************************** +* +* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps.c +* +* This file contains the implementation of the interface functions for XDmaPs +* driver. Refer to the header file xdmaps.h for more detailed information. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00 hbm 08/19/2010 First Release +* 1.00 nm 05/25/2011 Updated for minor doxygen corrections +* 1.02a sg 05/16/2012 Made changes for doxygen and moved some function +* header from the xdmaps.h file to xdmaps.c file +* Other cleanup for coding guidelines and CR 657109 +* and CR 657898 +* 1.03a sg 07/16/2012 changed inline to __inline for CR665681 +* 1.04a nm 10/22/2012 Fixed CR# 681671. +* 1.05a nm 04/15/2013 Fixed CR# 704396. Removed warnings when compiled +* with -Wall and -Wextra option in bsp. +* 05/01/2013 Fixed CR# 700189. Changed XDmaPs_BuildDmaProg() +* function description. +* Fixed CR# 704396. Removed unused variables +* UseM2MByte & MemBurstLen from XDmaPs_BuildDmaProg() +* function. +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include <string.h> + +#include "xstatus.h" +#include "xdmaps.h" +#include "xil_io.h" +#include "xil_cache.h" + +#include "xil_printf.h" + +// #define XDMAPS_DEBUG +#undef PDBG +#ifdef XDMAPS_DEBUG +# define PDBG(fmt, args...) xil_printf(fmt, ## args) +#else +# define PDBG(fmt, args...) +#endif + +/************************** Constant Definitions ****************************/ + +/* The following constant defines the amount of error that is allowed for + * a specified baud rate. This error is the difference between the actual + * baud rate that will be generated using the specified clock and the + * desired baud rate. + */ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + + +/************************** Function Prototypes *****************************/ +static int XDmaPs_Exec_DMAKILL(u32 BaseAddr, + unsigned int Channel, + unsigned int Thread); + +static void XDmaPs_BufPool_Free(XDmaPs_ProgBuf *Pool, void *Buf); + +static int XDmaPs_Exec_DMAGO(u32 BaseAddr, unsigned int Channel, u32 DmaProg); + +static void XDmaPs_DoneISR_n(XDmaPs *InstPtr, unsigned Channel); +static void *XDmaPs_BufPool_Allocate(XDmaPs_ProgBuf *Pool); +static int XDmaPs_BuildDmaProg(unsigned Channel, XDmaPs_Cmd *Cmd, + unsigned CacheLength); + +static void XDmaPs_Print_DmaProgBuf(char *Buf, int Length); + + + +/************************** Variable Definitions ****************************/ + +/****************************************************************************/ +/** +* +* Initializes a specific XDmaPs instance such that it is ready to be used. +* The data format of the device is setup for 8 data bits, 1 stop bit, and no +* parity by default. The baud rate is set to a default value specified by +* Config->DefaultBaudRate if set, otherwise it is set to 19.2K baud. The +* receive FIFO threshold is set for 8 bytes. The default operating mode of the +* driver is polled mode. +* +* @param InstPtr is a pointer to the XDmaPs instance. +* @param Config is a reference to a structure containing information +* about a specific XDmaPs driver. +* @param EffectiveAddr is the device base address in the virtual memory +* address space. The caller is responsible for keeping the +* address mapping from EffectiveAddr to the device physical base +* address unchanged once this function is invoked. Unexpected +* errors may occur if the address mapping changes after this +* function is called. If address translation is not used, pass in +* the physical address instead. +* +* @return +* +* - XST_SUCCESS on initialization completion +* +* @note None. +* +*****************************************************************************/ +int XDmaPs_CfgInitialize(XDmaPs *InstPtr, + XDmaPs_Config *Config, + u32 EffectiveAddr) +{ + int Status = XST_SUCCESS; + unsigned int CacheLength = 0; + u32 CfgReg; + unsigned Channel; + XDmaPs_ChannelData *ChanData; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstPtr != NULL); + Xil_AssertNonvoid(Config != NULL); + + /* + * Setup the driver instance using passed in parameters + */ + InstPtr->Config.DeviceId = Config->DeviceId; + InstPtr->Config.BaseAddress = EffectiveAddr; + + CfgReg = XDmaPs_ReadReg(EffectiveAddr, XDMAPS_CR1_OFFSET); + CacheLength = CfgReg & XDMAPS_CR1_I_CACHE_LEN_MASK; + if (CacheLength < 2 || CacheLength > 5) + CacheLength = 0; + else + CacheLength = 1 << CacheLength; + + InstPtr->CacheLength = CacheLength; + + memset(InstPtr->Chans, 0, + sizeof(XDmaPs_ChannelData[XDMAPS_CHANNELS_PER_DEV])); + + for (Channel = 0; Channel < XDMAPS_CHANNELS_PER_DEV; Channel++) { + ChanData = InstPtr->Chans + Channel; + ChanData->ChanId = Channel; + ChanData->DevId = Config->DeviceId; + } + + InstPtr->IsReady = 1; + + return Status; +} + +/****************************************************************************/ +/** +* +* Reset the DMA Manager. +* +* @param InstPtr is the DMA instance. +* +* @return 0 on success, -1 on time out +* +* @note None. +* +*****************************************************************************/ +int XDmaPs_ResetManager(XDmaPs *InstPtr) +{ + int Status; + Status = XDmaPs_Exec_DMAKILL(InstPtr->Config.BaseAddress, + 0, 0); + + return Status; +} + +/****************************************************************************/ +/** +* +* Reset the specified DMA Channel. +* +* @param InstPtr is the DMA instance. +* @param Channel is the channel to be reset. +* +* @return 0 on success, -1 on time out +* +* @note None. +* +*****************************************************************************/ +int XDmaPs_ResetChannel(XDmaPs *InstPtr, unsigned int Channel) +{ + int Status; + Status = XDmaPs_Exec_DMAKILL(InstPtr->Config.BaseAddress, + Channel, 1); + + return Status; + +} + +/*****************************************************************************/ +/** +* +* Driver fault interrupt service routine +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_FaultISR(XDmaPs *InstPtr) +{ + + void *DmaProgBuf; + u32 Fsm; /* Fault status DMA manager register value */ + u32 Fsc; /* Fault status DMA channel register value */ + u32 FaultType; /* Fault type DMA manager register value */ + + u32 BaseAddr = InstPtr->Config.BaseAddress; + + u32 Pc; /* DMA Pc or channel Pc */ + XDmaPs_ChannelData *ChanData; + + unsigned Chan; + unsigned DevId; + + XDmaPs_Cmd *DmaCmd; + + PDBG("inside Fault ISR dev %d\r\n", InstPtr->Config.DeviceId); + + Fsm = XDmaPs_ReadReg(BaseAddr, XDMAPS_FSM_OFFSET) & 0x01; + Fsc = XDmaPs_ReadReg(BaseAddr, XDMAPS_FSC_OFFSET) & 0xFF; + + + DevId = InstPtr->Config.DeviceId; + + if (Fsm) { + /* + * if DMA manager is fault + */ + FaultType = XDmaPs_ReadReg(BaseAddr, XDMAPS_FTM_OFFSET); + Pc = XDmaPs_ReadReg(BaseAddr, XDMAPS_DPC_OFFSET); + + xil_printf("PL330 device %d fault with type: %x at Pc %x\n", + DevId, + FaultType, Pc); + + /* kill the DMA manager thread */ + /* Should we disable interrupt?*/ + XDmaPs_Exec_DMAKILL(BaseAddr, 0, 0); + } + + /* + * check which channel faults and kill the channel thread + */ + for (Chan = 0; + Chan < XDMAPS_CHANNELS_PER_DEV; + Chan++) { + if (Fsc & (0x01 << Chan)) { + PDBG("xdmaps_fault_isr: channel %d device %d\n", + Chan, DevId); + FaultType = + XDmaPs_ReadReg(BaseAddr, + XDmaPs_FTCn_OFFSET(Chan)); + Pc = XDmaPs_ReadReg(BaseAddr, + XDmaPs_CPCn_OFFSET(Chan)); + + PDBG("xdmaps_fault_isr: fault type %#x Pc %#x\n", + FaultType, Pc); + + /* kill the channel thread */ + PDBG("xdmaps_fault_isr: " + "killing channel %d for device %d\n", + Chan, + InstPtr->Config.DeviceId); + + /* Should we disable interrupt? */ + XDmaPs_Exec_DMAKILL(BaseAddr, Chan, 1); + + /* + * get the fault type and fault Pc and invoke the + * fault callback. + */ + ChanData = InstPtr->Chans + Chan; + + DmaCmd = ChanData->DmaCmdToHw; + + /* Should we check DmaCmd is not null */ + DmaCmd->DmaStatus = -1; + DmaCmd->ChanFaultType = FaultType; + DmaCmd->ChanFaultPCAddr = Pc; + ChanData->DmaCmdFromHw = DmaCmd; + ChanData->DmaCmdToHw = NULL; + + if (!ChanData->HoldDmaProg) { + DmaProgBuf = (void *)DmaCmd->GeneratedDmaProg; + if (DmaProgBuf) + XDmaPs_BufPool_Free(ChanData->ProgBufPool, + DmaProgBuf); + DmaCmd->GeneratedDmaProg = NULL; + } + + if (InstPtr->FaultHandler) + InstPtr->FaultHandler(Chan, + DmaCmd, + InstPtr->FaultRef); + + } + } + +} + +/*****************************************************************************/ +/** +* +* Set the done handler for a channel. +* +* @param InstPtr is the DMA instance. +* @param Channel is the channel number. +* @param DoneHandler is the done interrupt handler. +* @param CallbackRef is the callback reference data. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +int XDmaPs_SetDoneHandler(XDmaPs *InstPtr, + unsigned Channel, + XDmaPsDoneHandler DoneHandler, + void *CallbackRef) +{ + XDmaPs_ChannelData *ChanData; + + Xil_AssertNonvoid(InstPtr != NULL); + + if (Channel >= XDMAPS_CHANNELS_PER_DEV) + return XST_FAILURE; + + + ChanData = InstPtr->Chans + Channel; + + ChanData->DoneHandler = DoneHandler; + ChanData->DoneRef = CallbackRef; + + return 0; +} + +/*****************************************************************************/ +/** +* +* Set the fault handler for a channel. +* +* @param InstPtr is the DMA instance. +* @param FaultHandler is the fault interrupt handler. +* @param CallbackRef is the callback reference data. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +int XDmaPs_SetFaultHandler(XDmaPs *InstPtr, + XDmaPsFaultHandler FaultHandler, + void *CallbackRef) +{ + Xil_AssertNonvoid(InstPtr != NULL); + + InstPtr->FaultHandler = FaultHandler; + InstPtr->FaultRef = CallbackRef; + + return XST_SUCCESS; +} + + + +/****************************************************************************/ +/** +* Construction function for DMAEND instruction. This function fills the program +* buffer with the constructed instruction. +* +* @param DmaProg the DMA program buffer, it's the starting address for +* the instruction being constructed +* +* @return The number of bytes for this instruction which is 1. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMAEND(char *DmaProg) +{ + /* + * DMAEND encoding: + * 7 6 5 4 3 2 1 0 + * 0 0 0 0 0 0 0 0 + */ + *DmaProg = 0x0; + + return 1; +} + + +__inline void XDmaPs_Memcpy4(char *Dst, char *Src) +{ + *Dst = *Src; + *(Dst + 1) = *(Src + 1); + *(Dst + 2) = *(Src + 2); + *(Dst + 3) = *(Src + 3); +} + +/****************************************************************************/ +/** +* +* Construction function for DMAGO instruction. This function fills the program +* buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* @param Cn is the Channel number, 0 - 7 +* @param Imm is 32-bit immediate number written to the Channel Program +* Counter. +* @param Ns is Non-secure flag. If Ns is 1, the DMA channel operates in +* the Non-secure state. If Ns is 0, the execution depends on the +* security state of the DMA manager: +* DMA manager is in the Secure state, DMA channel operates in the +* Secure state. +* DMA manager is in the Non-secure state, DMAC aborts. +* +* @return The number of bytes for this instruction which is 6. +* +* @note None +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMAGO(char *DmaProg, unsigned int Cn, + u32 Imm, unsigned int Ns) +{ + PDBG("entering XDmaPs_Instr_DMAGO(%x, %d, %x, %d)\r\n", + (unsigned int)DmaProg, Cn, Imm, Ns); + /* + * DMAGO encoding: + * 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 + * 0 0 0 0 0 |cn[2:0]| 1 0 1 0 0 0 ns 0 + * + * 47 ... 16 + * imm[32:0] + */ + *DmaProg = 0xA0 | ((Ns << 1) & 0x02); + + *(DmaProg + 1) = (u8)(Cn & 0x07); + + // *((u32 *)(DmaProg + 2)) = Imm; + XDmaPs_Memcpy4(DmaProg + 2, (char *)&Imm); + + /* success */ + return 6; +} + +/****************************************************************************/ +/** +* +* Construction function for DMALD instruction. This function fills the program +* buffer with the constructed instruction. +* +* @param DmaProg the DMA program buffer, it's the starting address for the +* instruction being constructed +* +* @return The number of bytes for this instruction which is 1. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMALD(char *DmaProg) +{ + /* + * DMALD encoding + * 7 6 5 4 3 2 1 0 + * 0 0 0 0 0 1 bs x + * + * Note: this driver doesn't support conditional load or store, + * so the bs bit is 0 and x bit is 0. + */ + *DmaProg = 0x04; + return 1; +} + +/****************************************************************************/ +/** +* +* Construction function for DMALP instruction. This function fills the program +* buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* @param Lc is the Loop counter register, can either be 0 or 1. +* @param LoopIterations: the number of interations, LoopInterations - 1 +* will be encoded in the DMALP instruction. +* +* @return The number of bytes for this instruction which is 2. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMALP(char *DmaProg, unsigned Lc, + unsigned LoopIterations) +{ + /* + * DMALP encoding + * 15 ... 8 7 6 5 4 3 2 1 0 + * | iter[7:0] |0 0 1 0 0 0 lc 0 + */ + *DmaProg = (u8)(0x20 | ((Lc & 1) << 1)); + *(DmaProg + 1) = (u8)(LoopIterations - 1); + return 2; +} + +/****************************************************************************/ +/** +* +* Construction function for DMALPEND instruction. This function fills the +* program buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* @param BodyStart is the starting address of the loop body. It is used +* to calculate the bytes of backward jump. +* @param Lc is the Loop counter register, can either be 0 or 1. +* +* @return The number of bytes for this instruction which is 2. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMALPEND(char *DmaProg, char *BodyStart, unsigned Lc) +{ + /* + * DMALPEND encoding + * 15 ... 8 7 6 5 4 3 2 1 0 + * | backward_jump[7:0] |0 0 1 nf 1 lc bs x + * + * lc: loop counter + * nf is for loop forever. The driver does not support loop forever, + * so nf is 1. + * The driver does not support conditional LPEND, so bs is 0, x is 0. + */ + *DmaProg = 0x38 | ((Lc & 1) << 2); + *(DmaProg + 1) = (u8)(DmaProg - BodyStart); + + return 2; +} + +/* + * Register number for the DMAMOV instruction + */ +#define XDMAPS_MOV_SAR 0x0 +#define XDMAPS_MOV_CCR 0x1 +#define XDMAPS_MOV_DAR 0x2 + +/****************************************************************************/ +/** +* +* Construction function for DMAMOV instruction. This function fills the +* program buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* @param Rd is the register id, 0 for SAR, 1 for CCR, and 2 for DAR +* @param Imm is the 32-bit immediate number +* +* @return The number of bytes for this instruction which is 6. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMAMOV(char *DmaProg, unsigned Rd, u32 Imm) +{ + /* + * DMAMOV encoding + * 15 4 3 2 1 10 ... 8 7 6 5 4 3 2 1 0 + * 0 0 0 0 0 |rd[2:0]|1 0 1 1 1 1 0 0 + * + * 47 ... 16 + * imm[32:0] + * + * rd: b000 for SAR, b001 CCR, b010 DAR + */ + *DmaProg = 0xBC; + *(DmaProg + 1) = Rd & 0x7; + // *((u32 *)(DmaProg + 2)) = Imm; + XDmaPs_Memcpy4(DmaProg + 2, (char *)&Imm); + + return 6; +} + +/****************************************************************************/ +/** +* +* Construction function for DMANOP instruction. This function fills the +* program buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* @return The number of bytes for this instruction which is 1. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMANOP(char *DmaProg) +{ + /* + * DMANOP encoding + * 7 6 5 4 3 2 1 0 + * 0 0 0 1 1 0 0 0 + */ + *DmaProg = 0x18; + return 1; +} + +/****************************************************************************/ +/** +* +* Construction function for DMARMB instruction. This function fills the +* program buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* +* @return The number of bytes for this instruction which is 1. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMARMB(char *DmaProg) +{ + /* + * DMARMB encoding + * 7 6 5 4 3 2 1 0 + * 0 0 0 1 0 0 1 0 + */ + *DmaProg = 0x12; + return 1; +} + +/****************************************************************************/ +/** +* +* Construction function for DMASEV instruction. This function fills the +* program buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* @param EventNumber is the Event number to signal. +* +* @return The number of bytes for this instruction which is 2. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMASEV(char *DmaProg, unsigned int EventNumber) +{ + /* + * DMASEV encoding + * 15 4 3 2 1 10 9 8 7 6 5 4 3 2 1 0 + * |event[4:0]| 0 0 0 0 0 1 1 0 1 0 0 + */ + *DmaProg = 0x34; + *(DmaProg + 1) = (u8)(EventNumber << 3); + + return 2; +} + + +/****************************************************************************/ +/** +* +* Construction function for DMAST instruction. This function fills the +* program buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* +* @return The number of bytes for this instruction which is 1. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMAST(char *DmaProg) +{ + /* + * DMAST encoding + * 7 6 5 4 3 2 1 0 + * 0 0 0 0 1 0 bs x + * + * Note: this driver doesn't support conditional load or store, + * so the bs bit is 0 and x bit is 0. + */ + *DmaProg = 0x08; + return 1; +} + + +/****************************************************************************/ +/** +* +* Construction function for DMAWMB instruction. This function fills the +* program buffer with the constructed instruction. +* +* @param DmaProg is the DMA program buffer, it's the starting address +* for the instruction being constructed +* +* @return The number of bytes for this instruction which is 1. +* +* @note None. +* +*****************************************************************************/ +__inline int XDmaPs_Instr_DMAWMB(char *DmaProg) +{ + /* + * DMAWMB encoding + * 7 6 5 4 3 2 1 0 + * 0 0 0 1 0 0 1 0 + */ + *DmaProg = 0x13; + return 1; +} + +/****************************************************************************/ +/** +* +* Conversion function from the endian swap size to the bit encoding of the CCR +* +* @param EndianSwapSize is the endian swap size, in terms of bits, it +* could be 8, 16, 32, 64, or 128(We are using DMA assembly syntax) +* +* @return The endian swap size bit encoding for the CCR. +* +* @note None. +* +*****************************************************************************/ +__inline unsigned XDmaPs_ToEndianSwapSizeBits(unsigned int EndianSwapSize) +{ + switch (EndianSwapSize) { + case 0: + case 8: + return 0; + case 16: + return 1; + case 32: + return 2; + case 64: + return 3; + case 128: + return 4; + default: + return 0; + } + +} + +/****************************************************************************/ +/** +* +* Conversion function from the burst size to the bit encoding of the CCR +* +* @param BurstSize is the burst size. It's the data width. +* In terms of bytes, it could be 1, 2, 4, 8, 16, 32, 64, or 128. +* It must be no larger than the bus width. +* (We are using DMA assembly syntax.) +* +* @note None. +* +*****************************************************************************/ +__inline unsigned XDmaPs_ToBurstSizeBits(unsigned BurstSize) +{ + switch (BurstSize) { + case 1: + return 0; + case 2: + return 1; + case 4: + return 2; + case 8: + return 3; + case 16: + return 4; + case 32: + return 5; + case 64: + return 6; + case 128: + return 7; + default: + return 0; + } +} + + +/****************************************************************************/ +/** +* +* Conversion function from PL330 bus transfer descriptors to CCR value. All the +* values passed to the functions are in terms of assembly languages, not in +* terms of the register bit encoding. +* +* @param ChanCtrl is the Instance of XDmaPs_ChanCtrl. +* +* @return The 32-bit CCR value. +* +* @note None. +* +*****************************************************************************/ +u32 XDmaPs_ToCCRValue(XDmaPs_ChanCtrl *ChanCtrl) +{ + /* + * Channel Control Register encoding + * [31:28] - endian_swap_size + * [27:25] - dst_cache_ctrl + * [24:22] - dst_prot_ctrl + * [21:18] - dst_burst_len + * [17:15] - dst_burst_size + * [14] - dst_inc + * [13:11] - src_cache_ctrl + * [10:8] - src_prot_ctrl + * [7:4] - src_burst_len + * [3:1] - src_burst_size + * [0] - src_inc + */ + + unsigned es = + XDmaPs_ToEndianSwapSizeBits(ChanCtrl->EndianSwapSize); + + unsigned dst_burst_size = + XDmaPs_ToBurstSizeBits(ChanCtrl->DstBurstSize); + unsigned dst_burst_len = (ChanCtrl->DstBurstLen - 1) & 0x0F; + unsigned dst_cache_ctrl = (ChanCtrl->DstCacheCtrl & 0x03) + | ((ChanCtrl->DstCacheCtrl & 0x08) >> 1); + unsigned dst_prot_ctrl = ChanCtrl->DstProtCtrl & 0x07; + unsigned dst_inc_bit = ChanCtrl->DstInc & 1; + + unsigned src_burst_size = + XDmaPs_ToBurstSizeBits(ChanCtrl->SrcBurstSize); + unsigned src_burst_len = (ChanCtrl->SrcBurstLen - 1) & 0x0F; + unsigned src_cache_ctrl = (ChanCtrl->SrcCacheCtrl & 0x03) + | ((ChanCtrl->SrcCacheCtrl & 0x08) >> 1); + unsigned src_prot_ctrl = ChanCtrl->SrcProtCtrl & 0x07; + unsigned src_inc_bit = ChanCtrl->SrcInc & 1; + + u32 ccr_value = (es << 28) + | (dst_cache_ctrl << 25) + | (dst_prot_ctrl << 22) + | (dst_burst_len << 18) + | (dst_burst_size << 15) + | (dst_inc_bit << 14) + | (src_cache_ctrl << 11) + | (src_prot_ctrl << 8) + | (src_burst_len << 4) + | (src_burst_size << 1) + | (src_inc_bit); + + PDBG("CCR: es %x\r\n", es); + PDBG("CCR: dca %x, dpr %x, dbl %x, dbs %x, di %x\r\n", + dst_cache_ctrl, dst_prot_ctrl, + dst_burst_len, dst_burst_size, dst_inc_bit); + PDBG("CCR: sca %x, spr %x, sbl %x, sbs %x, si %x\r\n", + src_cache_ctrl, src_prot_ctrl, + src_burst_len, src_burst_size, src_inc_bit); + + return ccr_value; +} + +/****************************************************************************/ +/** +* Construct a loop with only DMALD and DMAST as the body using loop counter 0. +* The function also makes sure the loop body and the lpend is in the same +* cache line. +* +* @param DmaProgStart is the very start address of the DMA program. +* This is used to calculate whether the loop is in a cache line. +* @param CacheLength is the icache line length, in terms of bytes. +* If it's zero, the performance enhancement feature will be +* turned off. +* @param DmaProgLoopStart The starting address of the loop (DMALP). +* @param LoopCount The inner loop count. Loop count - 1 will be used to +* initialize the loop counter. +* +* @return The number of bytes the loop has. +* +* @note None. +* +*****************************************************************************/ +int XDmaPs_ConstructSingleLoop(char *DmaProgStart, + int CacheLength, + char *DmaProgLoopStart, + int LoopCount) +{ + int CacheStartOffset; + int CacheEndOffset; + int NumNops; + char *DmaProgBuf = DmaProgLoopStart; + + PDBG("Contructing single loop: loop count %d\r\n", LoopCount); + + DmaProgBuf += XDmaPs_Instr_DMALP(DmaProgBuf, 0, LoopCount); + + if (CacheLength > 0) { + /* + * the CacheLength > 0 switch is ued to turn on/off nop + * insertion + */ + CacheStartOffset = DmaProgBuf - DmaProgStart; + CacheEndOffset = CacheStartOffset + 3; + + /* + * check whether the body and lpend fit in one cache line + */ + if (CacheStartOffset / CacheLength + != CacheEndOffset / CacheLength) { + /* insert the nops */ + NumNops = CacheLength + - CacheStartOffset % CacheLength; + while (NumNops--) { + DmaProgBuf += + XDmaPs_Instr_DMANOP(DmaProgBuf); + } + } + } + + DmaProgBuf += XDmaPs_Instr_DMALD(DmaProgBuf); + DmaProgBuf += XDmaPs_Instr_DMAST(DmaProgBuf); + DmaProgBuf += XDmaPs_Instr_DMALPEND(DmaProgBuf, + DmaProgBuf - 2, 0); + + return DmaProgBuf - DmaProgLoopStart; +} + +/****************************************************************************/ +/** +* Construct a nested loop with only DMALD and DMAST in the inner loop body. +* It uses loop counter 1 for the outer loop and loop counter 0 for the +* inner loop. +* +* @param DmaProgStart is the very start address of the DMA program. +* This is used to calculate whether the loop is in a cache line. +* @param CacheLength is the icache line length, in terms of bytes. +* If it's zero, the performance enhancement feature will be +* turned off. +* @param DmaProgLoopStart The starting address of the loop (DMALP). +* @param LoopCountOuter The outer loop count. Loop count - 1 will be +* used to initialize the loop counter. +* @param LoopCountInner The inner loop count. Loop count - 1 will be +* used to initialize the loop counter. +* +* @return The number byes the nested loop program has. +* +* @note None. +* +*****************************************************************************/ +int XDmaPs_ConstructNestedLoop(char *DmaProgStart, + int CacheLength, + char *DmaProgLoopStart, + unsigned int LoopCountOuter, + unsigned int LoopCountInner) +{ + int CacheStartOffset; + int CacheEndOffset; + int NumNops; + char *InnerLoopStart; + char *DmaProgBuf = DmaProgLoopStart; + + PDBG("Contructing nested loop outer %d, inner %d\r\n", + LoopCountOuter, LoopCountInner); + + DmaProgBuf += XDmaPs_Instr_DMALP(DmaProgBuf, 1, LoopCountOuter); + InnerLoopStart = DmaProgBuf; + + if (CacheLength > 0) { + /* + * the CacheLength > 0 switch is ued to turn on/off nop + * insertion + */ + if (CacheLength < 8) { + /* + * if the cache line is too small to fit both loops + * just align the inner loop + */ + DmaProgBuf += + XDmaPs_ConstructSingleLoop(DmaProgStart, + CacheLength, + DmaProgBuf, + LoopCountInner); + /* outer loop end */ + DmaProgBuf += + XDmaPs_Instr_DMALPEND(DmaProgBuf, + InnerLoopStart, + 1); + + /* + * the nested loop is constructed for + * smaller cache line + */ + return DmaProgBuf - DmaProgLoopStart; + } + + /* + * Now let's handle the case where a cache line can + * fit the nested loops. + */ + CacheStartOffset = DmaProgBuf - DmaProgStart; + CacheEndOffset = CacheStartOffset + 7; + + /* + * check whether the body and lpend fit in one cache line + */ + if (CacheStartOffset / CacheLength + != CacheEndOffset / CacheLength) { + /* insert the nops */ + NumNops = CacheLength + - CacheStartOffset % CacheLength; + while (NumNops--) { + DmaProgBuf += + XDmaPs_Instr_DMANOP(DmaProgBuf); + } + } + } + + /* insert the inner DMALP */ + DmaProgBuf += XDmaPs_Instr_DMALP(DmaProgBuf, 0, LoopCountInner); + + /* DMALD and DMAST instructions */ + DmaProgBuf += XDmaPs_Instr_DMALD(DmaProgBuf); + DmaProgBuf += XDmaPs_Instr_DMAST(DmaProgBuf); + + /* inner DMALPEND */ + DmaProgBuf += XDmaPs_Instr_DMALPEND(DmaProgBuf, + DmaProgBuf - 2, 0); + /* outer DMALPEND */ + DmaProgBuf += XDmaPs_Instr_DMALPEND(DmaProgBuf, + InnerLoopStart, 1); + + /* return the number of bytes */ + return DmaProgBuf - DmaProgLoopStart; +} + +/* + * [31:28] endian_swap_size b0000 + * [27:25] dst_cache_ctrl b000 + * [24:22] dst_prot_ctrl b000 + * [21:18] dst_burst_len b0000 + * [17:15] dst_burst_size b000 + * [14] dst_inc b0 + * [27:25] src_cache_ctrl b000 + * [24:22] src_prot_ctrl b000 + * [21:18] src_burst_len b0000 + * [17:15] src_burst_size b000 + * [14] src_inc b0 + */ +#define XDMAPS_CCR_SINGLE_BYTE (0x0) +#define XDMAPS_CCR_M2M_SINGLE_BYTE ((0x1 << 14) | 0x1) + + +/****************************************************************************/ +/** +* +* Construct the DMA program based on the descriptions of the DMA transfer. +* The function handles memory to memory DMA transfers. +* It also handles unalgined head and small amount of residue tail. +* +* @param Channel DMA channel number +* @param Cmd is the DMA command. +* @param CacheLength is the icache line length, in terms of bytes. +* If it's zero, the performance enhancement feature will be +* turned off. +* +* @returns The number of bytes for the program. +* +* @note None. +* +*****************************************************************************/ +static int XDmaPs_BuildDmaProg(unsigned Channel, XDmaPs_Cmd *Cmd, + unsigned CacheLength) +{ + /* + * unpack arguments + */ + char *DmaProgBuf = (char *)Cmd->GeneratedDmaProg; + unsigned DevChan = Channel; + unsigned long DmaLength = Cmd->BD.Length; + u32 SrcAddr = Cmd->BD.SrcAddr; + + unsigned SrcInc = Cmd->ChanCtrl.SrcInc; + u32 DstAddr = Cmd->BD.DstAddr; + unsigned DstInc = Cmd->ChanCtrl.DstInc; + + char *DmaProgStart = DmaProgBuf; + + unsigned int BurstBytes; + unsigned int LoopCount; + unsigned int LoopCount1 = 0; + unsigned int LoopResidue = 0; + unsigned int TailBytes; + unsigned int TailWords; + int DmaProgBytes; + u32 CCRValue; + unsigned int Unaligned; + unsigned int UnalignedCount; + unsigned int MemBurstSize = 1; + u32 MemAddr = 0; + unsigned int Index; + unsigned int SrcUnaligned = 0; + unsigned int DstUnaligned = 0; + + XDmaPs_ChanCtrl *ChanCtrl; + XDmaPs_ChanCtrl WordChanCtrl; + static XDmaPs_ChanCtrl Mem2MemByteCC; + + Mem2MemByteCC.EndianSwapSize = 0; + Mem2MemByteCC.DstCacheCtrl = 0; + Mem2MemByteCC.DstProtCtrl = 0; + Mem2MemByteCC.DstBurstLen = 1; + Mem2MemByteCC.DstBurstSize = 1; + Mem2MemByteCC.DstInc = 1; + Mem2MemByteCC.SrcCacheCtrl = 0; + Mem2MemByteCC.SrcProtCtrl = 0; + Mem2MemByteCC.SrcBurstLen = 1; + Mem2MemByteCC.SrcBurstSize = 1; + Mem2MemByteCC.SrcInc = 1; + + ChanCtrl = &Cmd->ChanCtrl; + + /* insert DMAMOV for SAR and DAR */ + DmaProgBuf += XDmaPs_Instr_DMAMOV(DmaProgBuf, + XDMAPS_MOV_SAR, + SrcAddr); + DmaProgBuf += XDmaPs_Instr_DMAMOV(DmaProgBuf, + XDMAPS_MOV_DAR, + DstAddr); + + + if (ChanCtrl->SrcInc) + SrcUnaligned = SrcAddr % ChanCtrl->SrcBurstSize; + + if (ChanCtrl->DstInc) + DstUnaligned = DstAddr % ChanCtrl->DstBurstSize; + + if ((SrcUnaligned && DstInc) || (DstUnaligned && SrcInc)) { + ChanCtrl = &Mem2MemByteCC; + } + + if (ChanCtrl->SrcInc) { + MemBurstSize = ChanCtrl->SrcBurstSize; + MemAddr = SrcAddr; + + } else if (ChanCtrl->DstInc) { + MemBurstSize = ChanCtrl->DstBurstSize; + MemAddr = DstAddr; + } + + /* check whether the head is aligned or not */ + Unaligned = MemAddr % MemBurstSize; + + if (Unaligned) { + /* if head is unaligned, transfer head in bytes */ + UnalignedCount = MemBurstSize - Unaligned; + CCRValue = XDMAPS_CCR_SINGLE_BYTE + | (SrcInc & 1) + | ((DstInc & 1) << 14); + + DmaProgBuf += XDmaPs_Instr_DMAMOV(DmaProgBuf, + XDMAPS_MOV_CCR, + CCRValue); + + PDBG("unaligned head count %d\r\n", + UnalignedCount); + for (Index = 0; Index < UnalignedCount; Index++) { + DmaProgBuf += XDmaPs_Instr_DMALD(DmaProgBuf); + DmaProgBuf += XDmaPs_Instr_DMAST(DmaProgBuf); + } + + DmaLength -= UnalignedCount; + } + + /* now the burst transfer part */ + CCRValue = XDmaPs_ToCCRValue(ChanCtrl); + DmaProgBuf += XDmaPs_Instr_DMAMOV(DmaProgBuf, + XDMAPS_MOV_CCR, + CCRValue); + + BurstBytes = ChanCtrl->SrcBurstSize * ChanCtrl->SrcBurstLen; + + LoopCount = DmaLength / BurstBytes; + TailBytes = DmaLength % BurstBytes; + + /* + * the loop count register is 8-bit wide, so if we need + * a larger loop, we need to have nested loops + */ + if (LoopCount > 256) { + LoopCount1 = LoopCount / 256; + if (LoopCount1 > 256) { + xil_printf("DMA operation cannot fit in a 2-level " + "loop for channel %d, please reduce the " + "DMA length or increase the burst size or " + "length", + Channel); + return 0; + } + LoopResidue = LoopCount % 256; + + PDBG("loop count %d is greater than 256\r\n", LoopCount); + if (LoopCount1 > 1) + DmaProgBuf += + XDmaPs_ConstructNestedLoop(DmaProgStart, + CacheLength, + DmaProgBuf, + LoopCount1, + 256); + else + DmaProgBuf += + XDmaPs_ConstructSingleLoop(DmaProgStart, + CacheLength, + DmaProgBuf, + 256); + + /* there will be some that cannot be covered by + * nested loops + */ + LoopCount = LoopResidue; + } + + if (LoopCount > 0) { + PDBG("now loop count is %d \r\n", LoopCount); + DmaProgBuf += XDmaPs_ConstructSingleLoop(DmaProgStart, + CacheLength, + DmaProgBuf, + LoopCount); + } + + if (TailBytes) { + /* handle the tail */ + TailWords = TailBytes / MemBurstSize; + TailBytes = TailBytes % MemBurstSize; + + if (TailWords) { + PDBG("tail words is %d \r\n", TailWords); + WordChanCtrl = *ChanCtrl; + /* + * if we can transfer the tail in words, we will + * transfer words as much as possible + */ + WordChanCtrl.SrcBurstSize = MemBurstSize; + WordChanCtrl.SrcBurstLen = 1; + WordChanCtrl.DstBurstSize = MemBurstSize; + WordChanCtrl.DstBurstLen = 1; + + + /* + * the burst length is 1 + */ + CCRValue = XDmaPs_ToCCRValue(&WordChanCtrl); + + DmaProgBuf += + XDmaPs_Instr_DMAMOV(DmaProgBuf, + XDMAPS_MOV_CCR, + CCRValue); + DmaProgBuf += + XDmaPs_ConstructSingleLoop(DmaProgStart, + CacheLength, + DmaProgBuf, + TailWords); + + } + + if (TailBytes) { + /* + * for the rest, we'll tranfer in bytes + */ + /* + * So far just to be safe, the tail bytes + * are transfered in a loop. We can optimize a little + * to perform a burst. + */ + CCRValue = XDMAPS_CCR_SINGLE_BYTE + | (SrcInc & 1) + | ((DstInc & 1) << 14); + + DmaProgBuf += + XDmaPs_Instr_DMAMOV(DmaProgBuf, + XDMAPS_MOV_CCR, + CCRValue); + + PDBG("tail bytes is %d \r\n", TailBytes); + DmaProgBuf += + XDmaPs_ConstructSingleLoop(DmaProgStart, + CacheLength, + DmaProgBuf, + TailBytes); + + } + } + + DmaProgBuf += XDmaPs_Instr_DMASEV(DmaProgBuf, DevChan); + DmaProgBuf += XDmaPs_Instr_DMAEND(DmaProgBuf); + + DmaProgBytes = DmaProgBuf - DmaProgStart; + + Xil_DCacheFlushRange((u32)DmaProgStart, DmaProgBytes); + + return DmaProgBytes; + +} + + +/****************************************************************************/ +/** +* +* Generate a DMA program based for the DMA command, the buffer will be pointed +* by the GeneratedDmaProg field of the command. +* +* @param InstPtr is then DMA instance. +* @param Channel is the DMA channel number. +* @param Cmd is the DMA command. +* +* @return - XST_SUCCESS on success. +* - XST_FAILURE if it fails +* +* @note None. +* +*****************************************************************************/ +int XDmaPs_GenDmaProg(XDmaPs *InstPtr, unsigned int Channel, XDmaPs_Cmd *Cmd) +{ + void *Buf; + int ProgLen; + XDmaPs_ChannelData *ChanData; + XDmaPs_ChanCtrl *ChanCtrl; + + Xil_AssertNonvoid(InstPtr != NULL); + Xil_AssertNonvoid(Cmd != NULL); + + PDBG("Inside XdmaPs_GenDmaProg\r\n"); + + if (Channel > XDMAPS_CHANNELS_PER_DEV) + return XST_FAILURE; + + ChanData = InstPtr->Chans + Channel; + ChanCtrl = &Cmd->ChanCtrl; + + if (ChanCtrl->SrcBurstSize * ChanCtrl->SrcBurstLen + != ChanCtrl->DstBurstSize * ChanCtrl->DstBurstLen) { + xil_printf("source burst_size * burst_len does not match " + "that of destination\r\n"); + return XST_FAILURE; + } + + + /* + * unaligned fixed address is not supported + */ + if (!ChanCtrl->SrcInc && Cmd->BD.SrcAddr % ChanCtrl->SrcBurstSize) { + xil_printf("source address is fixed but is unaligned\r\n"); + return XST_FAILURE; + } + + if (!ChanCtrl->DstInc && Cmd->BD.DstAddr % ChanCtrl->DstBurstSize) { + xil_printf("destination address is fixed but is " + "unaligned\r\n"); + return XST_FAILURE; + } + + Buf = XDmaPs_BufPool_Allocate(ChanData->ProgBufPool); + if (Buf == NULL) { + xil_printf("failed to allocate program buffer\r\n"); + return XST_FAILURE; + } + PDBG("Buf allocated %x\r\n", (u32)Buf); + + + Cmd->GeneratedDmaProg = Buf; + ProgLen = XDmaPs_BuildDmaProg(Channel, Cmd, + InstPtr->CacheLength); + Cmd->GeneratedDmaProgLength = ProgLen; + + PDBG("Generated DMA Prog length is %d\r\n", ProgLen); + +#ifdef XDMAPS_DEBUG + XDmaPs_Print_DmaProg(Cmd); +#endif + + if (ProgLen <= 0) { + /* something wrong, release the buffer */ + XDmaPs_BufPool_Free(ChanData->ProgBufPool, Buf); + Cmd->GeneratedDmaProgLength = 0; + Cmd->GeneratedDmaProg = NULL; + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/****************************************************************************/ +/** + * Free the DMA program buffer that is pointed by the GeneratedDmaProg field + * of the command. + * + * @param InstPtr is then DMA instance. + * @param Channel is the DMA channel number. + * @param Cmd is the DMA command. + * + * @return XST_SUCCESS on success. + * XST_FAILURE if there is any error. + * + * @note None. + * + ****************************************************************************/ +int XDmaPs_FreeDmaProg(XDmaPs *InstPtr, unsigned int Channel, XDmaPs_Cmd *Cmd) +{ + + void *Buf; + XDmaPs_ChannelData *ChanData; + + Xil_AssertNonvoid(InstPtr != NULL); + Xil_AssertNonvoid(Cmd != NULL); + + if (Channel > XDMAPS_CHANNELS_PER_DEV) + return XST_FAILURE; + + Buf = (void *)Cmd->GeneratedDmaProg; + ChanData = InstPtr->Chans + Channel; + + if (Buf) { + XDmaPs_BufPool_Free(ChanData->ProgBufPool, Buf); + Cmd->GeneratedDmaProg = 0; + Cmd->GeneratedDmaProgLength = 0; + } + + return XST_SUCCESS; +} + + +/****************************************************************************/ +/** +* +* Start a DMA command. The command can only be invoked when the channel +* is idle. The driver takes the command, generates DMA program if needed, +* then pass the program to DMAC to execute. +* +* @param InstPtr is then DMA instance. +* @param Channel is the DMA channel number. +* @param Cmd is the DMA command. +* @param HoldDmaProg is tag indicating whether the driver can release +* the allocated DMA buffer or not. If a user wants to examine the +* generated DMA program, the flag should be set to 1. After the +* DMA program is finished, a user needs to explicity free the +* buffer. +* +* @return +* - XST_SUCCESS on success +* - XST_DEVICE_BUSY if DMA is busy +* - XST_FAILURE on other failures +* +* @note None. +* +****************************************************************************/ +int XDmaPs_Start(XDmaPs *InstPtr, unsigned int Channel, + XDmaPs_Cmd *Cmd, + int HoldDmaProg) +{ + int Status; + u32 DmaProg = 0; + u32 Inten; + + Xil_AssertNonvoid(InstPtr != NULL); + Xil_AssertNonvoid(Cmd != NULL); + + PDBG("Inside XDmaPs_Start\r\n"); + + Cmd->DmaStatus = XST_FAILURE; + + if (XDmaPs_IsActive(InstPtr, Channel)) + return XST_DEVICE_BUSY; + + if (!Cmd->UserDmaProg && !Cmd->GeneratedDmaProg) { + Status = XDmaPs_GenDmaProg(InstPtr, Channel, Cmd); + if (Status) + return XST_FAILURE; + } + + InstPtr->Chans[Channel].HoldDmaProg = HoldDmaProg; + + if (Cmd->UserDmaProg) + DmaProg = (u32)Cmd->UserDmaProg; + else if (Cmd->GeneratedDmaProg) + DmaProg = (u32)Cmd->GeneratedDmaProg; + + if (DmaProg) { + /* enable the interrupt */ + // PDBG("enable_dma: enabling interrupt\r\n"); + PDBG("enable_dma: enabling interrupt\r\n"); + Inten = XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTEN_OFFSET); + Inten |= 0x01 << Channel; /* set the correpsonding bit */ + PDBG("enable_dma: writing inten %x\r\n", Inten); + XDmaPs_WriteReg(InstPtr->Config.BaseAddress, + XDMAPS_INTEN_OFFSET, + Inten); + + PDBG("pl330 interrupt enabled for channel %d\r\n", Channel); + Inten = XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTEN_OFFSET); + if ((Inten & (0x01 << Channel)) == 0) { + PDBG("Trouble enabling Intr, INTEN Reg: %x\r\n", + XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTEN_OFFSET)); + } + else { + PDBG("pl330 interrupt enabled for channel %d\r\n", + Channel); + } + + InstPtr->Chans[Channel].DmaCmdToHw = Cmd; + + PDBG("Src %x, Dst %x, Len %x\r\n", + Cmd->BD.SrcAddr, + Cmd->BD.DstAddr, + Cmd->BD.Length); + + if (Cmd->ChanCtrl.SrcInc) { + PDBG("DCachFlushRange for Src 0x%x, Len 0x%x \r\n", + Cmd->BD.SrcAddr, Cmd->BD.Length); + Xil_DCacheFlushRange(Cmd->BD.SrcAddr, Cmd->BD.Length); + } + if (Cmd->ChanCtrl.DstInc) { + PDBG("DCachInvalidateRange for Dst 0x%x, Len 0x%x \r\n", + Cmd->BD.DstAddr, Cmd->BD.Length); + Xil_DCacheInvalidateRange(Cmd->BD.DstAddr, + Cmd->BD.Length); + } + + Status = XDmaPs_Exec_DMAGO(InstPtr->Config.BaseAddress, + Channel, DmaProg); + } + else { + InstPtr->Chans[Channel].DmaCmdToHw = NULL; + Status = XST_FAILURE; + } + + return Status; +} + +/****************************************************************************/ +/** +* +* Checks whether the DMA channel is active or idle. +* +* @param InstPtr is the DMA instance. +* @param Channel is the DMA channel number. +* +* @return 0: if the channel is idle +* 1: otherwise +* +* @note None. +* +*****************************************************************************/ +int XDmaPs_IsActive(XDmaPs *InstPtr, unsigned int Channel) +{ + Xil_AssertNonvoid(InstPtr != NULL); + + /* Need to assert Channel is in range */ + if (Channel > XDMAPS_CHANNELS_PER_DEV) + return 0; + + return InstPtr->Chans[Channel].DmaCmdToHw != NULL; +} + + + +/****************************************************************************/ +/** +* +* Allocate a buffer of the DMA program buffer from the pool. +* +* @param Pool the DMA program pool. +* +* @return The allocated buffer, NULL if there is any error. +* +* @note None. +* +*****************************************************************************/ +static void *XDmaPs_BufPool_Allocate(XDmaPs_ProgBuf *Pool) +{ + int Index; + + Xil_AssertNonvoid(Pool != NULL); + + for (Index = 0; Index < XDMAPS_MAX_CHAN_BUFS; Index++) { + if (!Pool[Index].Allocated) { + PDBG("Allocate buf %d\r\n", Index); + Pool[Index].Allocated = 1; + return Pool[Index].Buf; + } + } + + return NULL; + +} + +/*****************************************************************************/ +/** +* +* Driver done interrupt service routine for channel 0. We need this done ISR +* mainly because the driver needs to release the DMA program buffer. +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_DoneISR_0(XDmaPs *InstPtr) +{ + XDmaPs_DoneISR_n(InstPtr, 0); +} + +/*****************************************************************************/ +/** +* +* Driver done interrupt service routine for channel 1. We need this done ISR +* mainly because the driver needs to release the DMA program buffer. +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_DoneISR_1(XDmaPs *InstPtr) +{ + XDmaPs_DoneISR_n(InstPtr, 1); +} + +/*****************************************************************************/ +/** +* +* Driver done interrupt service routine for channel 2. We need this done ISR +* mainly because the driver needs to release the DMA program buffer. +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_DoneISR_2(XDmaPs *InstPtr) +{ + XDmaPs_DoneISR_n(InstPtr, 2); +} + +/*****************************************************************************/ +/** +* +* Driver done interrupt service routine for channel 3. We need this done ISR +* mainly because the driver needs to release the DMA program buffer. +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_DoneISR_3(XDmaPs *InstPtr) +{ + XDmaPs_DoneISR_n(InstPtr, 3); +} + +/*****************************************************************************/ +/** +* +* Driver done interrupt service routine for channel 4. We need this done ISR +* mainly because the driver needs to release the DMA program buffer. +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_DoneISR_4(XDmaPs *InstPtr) +{ + XDmaPs_DoneISR_n(InstPtr, 4); +} + +/*****************************************************************************/ +/** +* +* Driver done interrupt service routine for channel 5. We need this done ISR +* mainly because the driver needs to release the DMA program buffer. +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_DoneISR_5(XDmaPs *InstPtr) +{ + XDmaPs_DoneISR_n(InstPtr, 5); +} + +/*****************************************************************************/ +/** +* +* Driver done interrupt service routine for channel 6. We need this done ISR +* mainly because the driver needs to release the DMA program buffer. +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_DoneISR_6(XDmaPs *InstPtr) +{ + XDmaPs_DoneISR_n(InstPtr, 6); +} + +/*****************************************************************************/ +/** +* +* Driver done interrupt service routine for channel 7. We need this done ISR +* mainly because the driver needs to release the DMA program buffer. +* This is the one that connects the GIC +* +* @param InstPtr is the DMA instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XDmaPs_DoneISR_7(XDmaPs *InstPtr) +{ + XDmaPs_DoneISR_n(InstPtr, 7); +} + +#ifndef XDMAPS_MAX_WAIT +#define XDMAPS_MAX_WAIT 4000 +#endif + +/****************************************************************************/ +/** +* Use the debug registers to kill the DMA thread. +* +* @param BaseAddr is DMA device base address. +* @param Channel is the DMA channel number. +* @param Thread is Debug thread encoding. +* 0: DMA manager thread, 1: DMA channel. +* +* @return 0 on success, -1 on time out +* +* @note None. +* +*****************************************************************************/ +static int XDmaPs_Exec_DMAKILL(u32 BaseAddr, + unsigned int Channel, + unsigned int Thread) +{ + u32 DbgInst0; + int WaitCount; + + PDBG("Inside XDmaPs_Exec_DMAKILL\r\n"); + + DbgInst0 = XDmaPs_DBGINST0(0, 0x01, Channel, Thread); + + /* wait while debug status is busy */ + WaitCount = 0; + PDBG("Checking DBGSTATUS\r\n"); + while ((XDmaPs_ReadReg(BaseAddr, XDMAPS_DBGSTATUS_OFFSET) + & XDMAPS_DBGSTATUS_BUSY) + && (WaitCount < XDMAPS_MAX_WAIT)) + WaitCount++; + + if (WaitCount >= XDMAPS_MAX_WAIT) { + /* wait time out */ + xil_printf("PL330 device at %x debug status busy time out\n", + BaseAddr); + + return -1; + } + + /* write debug instruction 0 */ + PDBG("XDmaPs_Exec_DMAKILL: writing DbgInst0 %#08x\n", DbgInst0); + XDmaPs_WriteReg(BaseAddr, XDMAPS_DBGINST0_OFFSET, DbgInst0); + + PDBG("pl330_exec_dmakill: writing DbgInst1 %#08x\n", 0); + XDmaPs_WriteReg(BaseAddr, XDMAPS_DBGINST1_OFFSET, 0); + + + /* run the command in DbgInst0 and DbgInst1 */ + XDmaPs_WriteReg(BaseAddr, XDMAPS_DBGCMD_OFFSET, 0); + + return 0; +} + +/****************************************************************************/ +/** +* +* +* Free a buffer of the DMA program buffer. +* @param Pool the DMA program pool. +* @param Buf the DMA program buffer to be release. +* +* @return None +* +* @note None. +* +*****************************************************************************/ +static void XDmaPs_BufPool_Free(XDmaPs_ProgBuf *Pool, void *Buf) +{ + int Index; + int Found = 0; + + Xil_AssertVoid(Pool != NULL); + + for (Index = 0; Index < XDMAPS_MAX_CHAN_BUFS; Index++) { + if (Pool[Index].Buf == Buf) { + if (Pool[Index].Allocated) { + PDBG("Freed buf %d\r\n", Index); + Pool[Index].Allocated = 0; + } else { + PDBG("Trying to free a free buf %d\r\n", Index); + } + Found = 1; + } + } + + if (!Found) { + PDBG("Trying to free a buf that is not in the pool\r\n"); + } +} + +/*****************************************************************************/ +/** +* XDmaPs_Exec_DMAGO - Execute the DMAGO to start a channel. +* +* @param BaseAddr PL330 device base address +* @param Channel Channel number for the device +* @param DmaProg DMA program starting address, this should be DMA address +* +* @return 0 on success, -1 on time out +* +* @note None. +* +****************************************************************************/ +static int XDmaPs_Exec_DMAGO(u32 BaseAddr, unsigned int Channel, u32 DmaProg) +{ + char DmaGoProg[8]; + u32 DbgInst0; + u32 DbgInst1; + + int WaitCount; + + PDBG("XDmaPs_Exec_DMAGO: entering\r\n"); + + XDmaPs_Instr_DMAGO(DmaGoProg, Channel, DmaProg, 0); + + DbgInst0 = XDmaPs_DBGINST0(*(DmaGoProg + 1), *DmaGoProg, 0, 0); + DbgInst1 = (u32)DmaProg; + + PDBG("inside XDmaPs_Exec_DMAGO: base %x, Channel %d, DmaProg %x\r\n", + BaseAddr, Channel, DmaProg); + PDBG("inside XDmaPs_Exec_DMAGO: DbgInst0 %x, DbgInst1 %x\r\n", + DbgInst0, DbgInst1); + + /* wait while debug status is busy */ + WaitCount = 0; + PDBG("Checking DBGSTATUS\r\n"); + while ((XDmaPs_ReadReg(BaseAddr, XDMAPS_DBGSTATUS_OFFSET) + & XDMAPS_DBGSTATUS_BUSY) + && (WaitCount < XDMAPS_MAX_WAIT)) { + PDBG("dbgstatus %x\r\n", + XDmaPs_ReadReg(BaseAddr, XDMAPS_DBGSTATUS_OFFSET)); + + WaitCount++; + } + + if (WaitCount >= XDMAPS_MAX_WAIT) { + xil_printf("PL330 device at %x debug status busy time out\r\n", + BaseAddr); + return -1; + } + + PDBG("dbgstatus idle\r\n"); + + /* write debug instruction 0 */ + XDmaPs_WriteReg(BaseAddr, XDMAPS_DBGINST0_OFFSET, DbgInst0); + /* write debug instruction 1 */ + XDmaPs_WriteReg(BaseAddr, XDMAPS_DBGINST1_OFFSET, DbgInst1); + + + /* wait while the DMA Manager is busy */ + WaitCount = 0; + while ((XDmaPs_ReadReg(BaseAddr, + XDMAPS_DS_OFFSET) & XDMAPS_DS_DMA_STATUS) + != XDMAPS_DS_DMA_STATUS_STOPPED + && WaitCount <= XDMAPS_MAX_WAIT) { + PDBG("ds %x\r\n", + XDmaPs_ReadReg(BaseAddr, XDMAPS_DS_OFFSET)); + WaitCount++; + } + + if (WaitCount >= XDMAPS_MAX_WAIT) { + xil_printf("PL330 device at %x debug status busy time out\r\n", + BaseAddr); + return -1; + } + + /* run the command in DbgInst0 and DbgInst1 */ + XDmaPs_WriteReg(BaseAddr, XDMAPS_DBGCMD_OFFSET, 0); + PDBG("XDmaPs_Exec_DMAGO done\r\n"); + + return 0; +} + + +/****************************************************************************/ +/** +* +* It's the generic Done ISR. +* @param InstPtr is the DMA instance. +* @param Channel is the DMA channel numer. +* +* @return None.* +* +* @note None. +* +*****************************************************************************/ +static void XDmaPs_DoneISR_n(XDmaPs *InstPtr, unsigned Channel) +{ + + void *DmaProgBuf; + XDmaPs_ChannelData *ChanData; + XDmaPs_Cmd *DmaCmd; + u32 Value; + + ChanData = InstPtr->Chans + Channel; + + PDBG("inside Done ISR Channel %d\r\n", ChanData->ChanId); + + Value = XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTSTATUS_OFFSET); + PDBG("Interrupt status before clearing %x\r\n", Value); + + + /* clear the interrupt status */ + PDBG("Clear the interrupt status %x\r\n", 1<< ChanData->ChanId); + XDmaPs_WriteReg(InstPtr->Config.BaseAddress, + XDMAPS_INTCLR_OFFSET, + 1 << ChanData->ChanId); + + Value = XDmaPs_ReadReg(InstPtr->Config.BaseAddress, + XDMAPS_INTSTATUS_OFFSET); + PDBG("Interrupt status after clearing %x\r\n", Value); + + if (Value) { + PDBG("Interrupt status %x\r\n", Value); + } + + if ((DmaCmd = ChanData->DmaCmdToHw)) { + if (!ChanData->HoldDmaProg) { + DmaProgBuf = (void *)DmaCmd->GeneratedDmaProg; + if (DmaProgBuf) + XDmaPs_BufPool_Free(ChanData->ProgBufPool, + DmaProgBuf); + DmaCmd->GeneratedDmaProg = NULL; + } + + DmaCmd->DmaStatus = 0; + ChanData->DmaCmdToHw = NULL; + ChanData->DmaCmdFromHw = DmaCmd; + + if (ChanData->DoneHandler) + ChanData->DoneHandler(Channel, DmaCmd, + ChanData->DoneRef); + } + +} + + +/****************************************************************************/ +/** +* Prints the content of the buffer in bytes +* @param Buf is the buffer. +* @param Length is the length of the DMA program. +* +* @return None. +* +* @note None. +****************************************************************************/ +static void XDmaPs_Print_DmaProgBuf(char *Buf, int Length) +{ + int Index; + for (Index = 0; Index < Length; Index++) + xil_printf("[%x] %x\r\n", Index, Buf[Index]); + +} +/****************************************************************************/ +/** +* Print the Dma Prog Contents. +* +* @param Cmd is the command buffer. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ + void XDmaPs_Print_DmaProg(XDmaPs_Cmd *Cmd) +{ + if (Cmd->GeneratedDmaProg && Cmd->GeneratedDmaProgLength) { + xil_printf("Generated DMA program (%d):\r\n", + Cmd->GeneratedDmaProgLength); + XDmaPs_Print_DmaProgBuf((char *)Cmd->GeneratedDmaProg, + Cmd->GeneratedDmaProgLength); + } + + if (Cmd->UserDmaProg && Cmd->UserDmaProgLength) { + xil_printf("User defined DMA program (%d):\r\n", + Cmd->UserDmaProgLength); + XDmaPs_Print_DmaProgBuf((char *)Cmd->UserDmaProg, + Cmd->UserDmaProgLength); + } +} + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps.h new file mode 100755 index 000000000..f44608a07 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps.h @@ -0,0 +1,317 @@ +/***************************************************************************** +* +* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps.h +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00 hbm 08/19/10 First Release +* 1.01a nm 12/20/12 Added definition XDMAPS_CHANNELS_PER_DEV which specifies +* the maximum number of channels. +* Replaced the usage of XPAR_XDMAPS_CHANNELS_PER_DEV +* with XDMAPS_CHANNELS_PER_DEV defined in xdmaps_hw.h. +* Added the tcl file to automatically generate the +* xparameters.h +* 1.02a sg 05/16/12 Made changes for doxygen and moved some function +* header from the xdmaps.h file to xdmaps.c file +* Other cleanup for coding guidelines and CR 657109 +* and CR 657898 +* The xdmaps_example_no_intr.c example is removed +* as it is using interrupts and is similar to +* the interrupt example - CR 652477 +* 1.03a sg 07/16/2012 changed inline to __inline for CR665681 +* 1.04a nm 10/22/2012 Fixed CR# 681671. +* 1.05a nm 04/15/2013 Fixed CR# 704396. Removed warnings when compiled +* with -Wall and -Wextra option in bsp. +* 05/01/2013 Fixed CR# 700189. Changed XDmaPs_BuildDmaProg() +* function description. +* Fixed CR# 704396. Removed unused variables +* UseM2MByte & MemBurstLen from XDmaPs_BuildDmaProg() +* function. +* </pre> +* +*****************************************************************************/ + +#ifndef XDMAPS_H /* prevent circular inclusions */ +#define XDMAPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xparameters.h" +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" + +#include "xdmaps_hw.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Base address of device (IPIF) */ +} XDmaPs_Config; + + +/** DMA channle control structure. It's for AXI bus transaction. + * This struct will be translated into a 32-bit channel control register value. + */ +typedef struct { + unsigned int EndianSwapSize; /**< Endian swap size. */ + unsigned int DstCacheCtrl; /**< Destination cache control */ + unsigned int DstProtCtrl; /**< Destination protection control */ + unsigned int DstBurstLen; /**< Destination burst length */ + unsigned int DstBurstSize; /**< Destination burst size */ + unsigned int DstInc; /**< Destination incrementing or fixed + * address */ + unsigned int SrcCacheCtrl; /**< Source cache control */ + unsigned int SrcProtCtrl; /**< Source protection control */ + unsigned int SrcBurstLen; /**< Source burst length */ + unsigned int SrcBurstSize; /**< Source burst size */ + unsigned int SrcInc; /**< Source incrementing or fixed + * address */ +} XDmaPs_ChanCtrl; + +/** DMA block descriptor stucture. + */ +typedef struct { + u32 SrcAddr; /**< Source starting address */ + u32 DstAddr; /**< Destination starting address */ + unsigned int Length; /**< Number of bytes for the block */ +} XDmaPs_BD; + +/** + * A DMA command consisits of a channel control struct, a block descriptor, + * a user defined program, a pointer pointing to generated DMA program, and + * execution result. + * + */ +typedef struct { + XDmaPs_ChanCtrl ChanCtrl; /**< Channel Control Struct */ + XDmaPs_BD BD; /**< Together with SgLength field, + * it's a scatter-gather list. + */ + void *UserDmaProg; /**< If user wants the driver to + * execute their own DMA program, + * this field points to the DMA + * program. + */ + int UserDmaProgLength; /**< The length of user defined + * DMA program. + */ + + void *GeneratedDmaProg; /**< The DMA program genreated + * by the driver. This field will be + * set if a user invokes the DMA + * program generation function. Or + * the DMA command is finished and + * a user informs the driver not to + * release the program buffer. + * This field has two purposes, one + * is to ask the driver to generate + * a DMA program while the DMAC is + * performaning DMA transactions. The + * other purpose is to debug the + * driver. + */ + int GeneratedDmaProgLength; /**< The length of the DMA program + * generated by the driver + */ + int DmaStatus; /**< 0 on success, otherwise error code + */ + u32 ChanFaultType; /**< Channel fault type in case of fault + */ + u32 ChanFaultPCAddr; /**< Channel fault PC address + */ +} XDmaPs_Cmd; + +/** + * It's the done handler a user can set for a channel + */ +typedef void (*XDmaPsDoneHandler) (unsigned int Channel, + XDmaPs_Cmd *DmaCmd, + void *CallbackRef); + +/** + * It's the fault handler a user can set for a channel + */ +typedef void (*XDmaPsFaultHandler) (unsigned int Channel, + XDmaPs_Cmd *DmaCmd, + void *CallbackRef); + +#define XDMAPS_MAX_CHAN_BUFS 2 +#define XDMAPS_CHAN_BUF_LEN 128 + +/** + * The XDmaPs_ProgBuf is the struct for a DMA program buffer. + */ +typedef struct { + char Buf[XDMAPS_CHAN_BUF_LEN]; /**< The actual buffer the holds the + * content */ + unsigned Len; /**< The actual length of the DMA + * program in bytes. */ + int Allocated; /**< A tag indicating whether the + * buffer is allocated or not */ +} XDmaPs_ProgBuf; + +/** + * The XDmaPs_ChannelData is a struct to book keep individual channel of + * the DMAC. + */ +typedef struct { + unsigned DevId; /**< Device id indicating which DMAC */ + unsigned ChanId; /**< Channel number of the DMAC */ + XDmaPs_ProgBuf ProgBufPool[XDMAPS_MAX_CHAN_BUFS]; /**< A pool of + program buffers*/ + XDmaPsDoneHandler DoneHandler; /**< Done interrupt handler */ + void *DoneRef; /**< Done interrupt callback data */ + XDmaPs_Cmd *DmaCmdToHw; /**< DMA command being executed */ + XDmaPs_Cmd *DmaCmdFromHw; /**< DMA command that is finished. + * This field is for debugging purpose + */ + int HoldDmaProg; /**< A tag indicating whether to hold the + * DMA program after the DMA is done. + */ + +} XDmaPs_ChannelData; + +/** + * The XDmaPs driver instance data structure. A pointer to an instance data + * structure is passed around by functions to refer to a specific driver + * instance. + */ +typedef struct { + XDmaPs_Config Config; /**< Configuration data structure */ + int IsReady; /**< Device is Ready */ + int CacheLength; /**< icache length */ + XDmaPsFaultHandler FaultHandler; /**< fault interrupt handler */ + void *FaultRef; /**< fault call back data */ + XDmaPs_ChannelData Chans[XDMAPS_CHANNELS_PER_DEV]; + /**< + * channel data + */ +} XDmaPs; + +/* + * Functions implemented in xdmaps.c + */ +int XDmaPs_CfgInitialize(XDmaPs *InstPtr, + XDmaPs_Config *Config, + u32 EffectiveAddr); + +int XDmaPs_Start(XDmaPs *InstPtr, unsigned int Channel, + XDmaPs_Cmd *Cmd, + int HoldDmaProg); + +int XDmaPs_IsActive(XDmaPs *InstPtr, unsigned int Channel); +int XDmaPs_GenDmaProg(XDmaPs *InstPtr, unsigned int Channel, + XDmaPs_Cmd *Cmd); +int XDmaPs_FreeDmaProg(XDmaPs *InstPtr, unsigned int Channel, + XDmaPs_Cmd *Cmd); +void XDmaPs_Print_DmaProg(XDmaPs_Cmd *Cmd); + + +int XDmaPs_ResetManager(XDmaPs *InstPtr); +int XDmaPs_ResetChannel(XDmaPs *InstPtr, unsigned int Channel); + + +int XDmaPs_SetDoneHandler(XDmaPs *InstPtr, + unsigned Channel, + XDmaPsDoneHandler DoneHandler, + void *CallbackRef); + +int XDmaPs_SetFaultHandler(XDmaPs *InstPtr, + XDmaPsFaultHandler FaultHandler, + void *CallbackRef); + +void XDmaPs_Print_DmaProg(XDmaPs_Cmd *Cmd); + +/** + * Driver done interrupt service routines for the channels. + * We need this done ISR mainly because the driver needs to release the + * DMA program buffer. This is the one that connects the GIC + */ +void XDmaPs_DoneISR_0(XDmaPs *InstPtr); +void XDmaPs_DoneISR_1(XDmaPs *InstPtr); +void XDmaPs_DoneISR_2(XDmaPs *InstPtr); +void XDmaPs_DoneISR_3(XDmaPs *InstPtr); +void XDmaPs_DoneISR_4(XDmaPs *InstPtr); +void XDmaPs_DoneISR_5(XDmaPs *InstPtr); +void XDmaPs_DoneISR_6(XDmaPs *InstPtr); +void XDmaPs_DoneISR_7(XDmaPs *InstPtr); + +/** + * Driver fault interrupt service routine + */ +void XDmaPs_FaultISR(XDmaPs *InstPtr); + + +/* + * Static loopup function implemented in xdmaps_sinit.c + */ +XDmaPs_Config *XDmaPs_LookupConfig(u16 DeviceId); + + +/* + * self-test functions in xdmaps_selftest.c + */ +int XDmaPs_SelfTest(XDmaPs *InstPtr); + + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_g.c new file mode 100644 index 000000000..f1e83ecbc --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_g.c @@ -0,0 +1,34 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xdmaps.h" + +/* +* The configuration table for devices +*/ + +XDmaPs_Config XDmaPs_ConfigTable[] = +{ + { + XPAR_PS7_DMA_NS_DEVICE_ID, + XPAR_PS7_DMA_NS_BASEADDR + }, + { + XPAR_PS7_DMA_S_DEVICE_ID, + XPAR_PS7_DMA_S_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_hw.c new file mode 100755 index 000000000..98fbabd8c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_hw.c @@ -0,0 +1,122 @@ +/***************************************************************************** +* +* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps_hw.c +* +* This file contains the implementation of the interface reset functionality +* for XDmaPs driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.06a kpc 10/07/13 First release +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ +#include "xdmaps_hw.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ +#ifndef XDMAPS_MAX_WAIT +#define XDMAPS_MAX_WAIT 4000 +#endif +/************************** Function Prototypes *****************************/ + +/************************** Variable Definitions ****************************/ + +/*****************************************************************************/ +/** +* This function perform the reset sequence to the given dmaps interface by +* configuring the appropriate control bits in the dmaps specifc registers +* the dmaps reset squence involves the following steps +* Disable all the interuupts +* Clear the pending interrupts +* Kill all the active channel threads +* Kill the manager thread +* +* @param BaseAddress of the interface +* +* @return N/A +* +* @note +* This function will not modify the slcr registers that are relavant for +* dmaps controller +******************************************************************************/ +void XDmaPs_ResetHw(u32 BaseAddress) +{ + u32 DbgInst; + u32 WaitCount = 0; + u32 ChanIndex; + + /* Disable all the interrupts */ + XDmaPs_WriteReg(BaseAddress, XDMAPS_INTEN_OFFSET, 0x00); + /* Clear the interrupts */ + XDmaPs_WriteReg(BaseAddress, XDMAPS_INTCLR_OFFSET, XDMAPS_INTCLR_ALL_MASK); + /* Kill the dma channel threads */ + for (ChanIndex=0; ChanIndex < XDMAPS_CHANNELS_PER_DEV; ChanIndex++) { + while ((XDmaPs_ReadReg(BaseAddress, XDMAPS_DBGSTATUS_OFFSET) + & XDMAPS_DBGSTATUS_BUSY) + && (WaitCount < XDMAPS_MAX_WAIT)) + WaitCount++; + + DbgInst = XDmaPs_DBGINST0(0, 0x01, ChanIndex, 1); + XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGINST0_OFFSET, DbgInst); + XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGINST1_OFFSET, 0x0); + XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGCMD_OFFSET, 0x0); + } + /* Kill the manager thread */ + DbgInst = XDmaPs_DBGINST0(0, 0x01, 0, 0); + XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGINST0_OFFSET, DbgInst); + XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGINST1_OFFSET, 0x0); + XDmaPs_WriteReg(BaseAddress, XDMAPS_DBGCMD_OFFSET, 0x0); +} + + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_hw.h new file mode 100755 index 000000000..1fc33e547 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_hw.h @@ -0,0 +1,299 @@ +/****************************************************************************** +* +* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xdmaps_hw.h +* +* This header file contains the hardware interface of an XDmaPs device. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ---------------------------------------------- +* 1.00a hbm 08/18/10 First Release +* 1.01a nm 12/20/12 Added definition XDMAPS_CHANNELS_PER_DEV which specifies +* the maximum number of channels. +* Replaced the usage of XPAR_XDMAPS_CHANNELS_PER_DEV +* with XDMAPS_CHANNELS_PER_DEV defined in xdmaps_hw.h +* 1.02a sg 05/16/12 Made changes for doxygen +* 1.06a kpc 07/10/13 Added function prototype +* </pre> +* +******************************************************************************/ + +#ifndef XDMAPS_HW_H /* prevent circular inclusions */ +#define XDMAPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * + * Register offsets for the DMAC. + * @{ + */ + +#define XDMAPS_DS_OFFSET 0x000 /* DMA Status Register */ +#define XDMAPS_DPC_OFFSET 0x004 /* DMA Program Counter Rregister */ +#define XDMAPS_INTEN_OFFSET 0X020 /* DMA Interrupt Enable Register */ +#define XDMAPS_ES_OFFSET 0x024 /* DMA Event Status Register */ +#define XDMAPS_INTSTATUS_OFFSET 0x028 /* DMA Interrupt Status Register + */ +#define XDMAPS_INTCLR_OFFSET 0x02c /* DMA Interrupt Clear Register */ +#define XDMAPS_FSM_OFFSET 0x030 /* DMA Fault Status DMA Manager + * Register + */ +#define XDMAPS_FSC_OFFSET 0x034 /* DMA Fault Status DMA Chanel Register + */ +#define XDMAPS_FTM_OFFSET 0x038 /* DMA Fault Type DMA Manager Register */ + +#define XDMAPS_FTC0_OFFSET 0x040 /* DMA Fault Type for DMA Channel 0 */ +/* + * The offset for the rest of the FTC registers is calculated as + * FTC0 + dev_chan_num * 4 + */ +#define XDmaPs_FTCn_OFFSET(ch) (XDMAPS_FTC0_OFFSET + (ch) * 4) + +#define XDMAPS_CS0_OFFSET 0x100 /* Channel Status for DMA Channel 0 */ +/* + * The offset for the rest of the CS registers is calculated as + * CS0 + * dev_chan_num * 0x08 + */ +#define XDmaPs_CSn_OFFSET(ch) (XDMAPS_CS0_OFFSET + (ch) * 8) + +#define XDMAPS_CPC0_OFFSET 0x104 /* Channel Program Counter for DMA + * Channel 0 + */ +/* + * The offset for the rest of the CPC registers is calculated as + * CPC0 + dev_chan_num * 0x08 + */ +#define XDmaPs_CPCn_OFFSET(ch) (XDMAPS_CPC0_OFFSET + (ch) * 8) + +#define XDMAPS_SA_0_OFFSET 0x400 /* Source Address Register for DMA + * Channel 0 + */ +/* The offset for the rest of the SA registers is calculated as + * SA_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_SA_n_OFFSET(ch) (XDMAPS_SA_0_OFFSET + (ch) * 0x20) + +#define XDMAPS_DA_0_OFFSET 0x404 /* Destination Address Register for + * DMA Channel 0 + */ +/* The offset for the rest of the DA registers is calculated as + * DA_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_DA_n_OFFSET(ch) (XDMAPS_DA_0_OFFSET + (ch) * 0x20) + +#define XDMAPS_CC_0_OFFSET 0x408 /* Channel Control Register for + * DMA Channel 0 + */ +/* + * The offset for the rest of the CC registers is calculated as + * CC_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_CC_n_OFFSET(ch) (XDMAPS_CC_0_OFFSET + (ch) * 0x20) + +#define XDMAPS_LC0_0_OFFSET 0x40C /* Loop Counter 0 for DMA Channel 0 */ +/* + * The offset for the rest of the LC0 registers is calculated as + * LC_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_LC0_n_OFFSET(ch) (XDMAPS_LC0_0_OFFSET + (ch) * 0x20) +#define XDMAPS_LC1_0_OFFSET 0x410 /* Loop Counter 1 for DMA Channel 0 */ +/* + * The offset for the rest of the LC1 registers is calculated as + * LC_0 + dev_chan_num * 0x20 + */ +#define XDmaPs_LC1_n_OFFSET(ch) (XDMAPS_LC1_0_OFFSET + (ch) * 0x20) + +#define XDMAPS_DBGSTATUS_OFFSET 0xD00 /* Debug Status Register */ +#define XDMAPS_DBGCMD_OFFSET 0xD04 /* Debug Command Register */ +#define XDMAPS_DBGINST0_OFFSET 0xD08 /* Debug Instruction 0 Register */ +#define XDMAPS_DBGINST1_OFFSET 0xD0C /* Debug Instruction 1 Register */ + +#define XDMAPS_CR0_OFFSET 0xE00 /* Configuration Register 0 */ +#define XDMAPS_CR1_OFFSET 0xE04 /* Configuration Register 1 */ +#define XDMAPS_CR2_OFFSET 0xE08 /* Configuration Register 2 */ +#define XDMAPS_CR3_OFFSET 0xE0C /* Configuration Register 3 */ +#define XDMAPS_CR4_OFFSET 0xE10 /* Configuration Register 4 */ +#define XDMAPS_CRDN_OFFSET 0xE14 /* Configuration Register Dn */ + +#define XDMAPS_PERIPH_ID_0_OFFSET 0xFE0 /* Peripheral Identification + * Register 0 + */ +#define XDMAPS_PERIPH_ID_1_OFFSET 0xFE4 /* Peripheral Identification + * Register 1 + */ +#define XDMAPS_PERIPH_ID_2_OFFSET 0xFE8 /* Peripheral Identification + * Register 2 + */ +#define XDMAPS_PERIPH_ID_3_OFFSET 0xFEC /* Peripheral Identification + * Register 3 + */ +#define XDMAPS_PCELL_ID_0_OFFSET 0xFF0 /* PrimeCell Identification + * Register 0 + */ +#define XDMAPS_PCELL_ID_1_OFFSET 0xFF4 /* PrimeCell Identification + * Register 1 + */ +#define XDMAPS_PCELL_ID_2_OFFSET 0xFF8 /* PrimeCell Identification + * Register 2 + */ +#define XDMAPS_PCELL_ID_3_OFFSET 0xFFC /* PrimeCell Identification + * Register 3 + */ + +/* + * Some useful register masks + */ +#define XDMAPS_DS_DMA_STATUS 0x0F /* DMA status mask */ +#define XDMAPS_DS_DMA_STATUS_STOPPED 0x00 /* debug status busy mask */ + +#define XDMAPS_DBGSTATUS_BUSY 0x01 /* debug status busy mask */ + +#define XDMAPS_CS_ACTIVE_MASK 0x07 /* channel status active mask, + * llast 3 bits of CS register + */ + +#define XDMAPS_CR1_I_CACHE_LEN_MASK 0x07 /* i_cache_len mask */ + + +/* + * XDMAPS_DBGINST0 - constructs the word for the Debug Instruction-0 Register. + * @b1: Instruction byte 1 + * @b0: Instruction byte 0 + * @ch: Channel number + * @dbg_th: Debug thread encoding: 0 = DMA manager thread, 1 = DMA channel + */ +#define XDmaPs_DBGINST0(b1, b0, ch, dbg_th) \ + (((b1) << 24) | ((b0) << 16) | (((ch) & 0x7) << 8) | ((dbg_th & 0x1))) + +/* @} */ + +/** @name Control Register + * + * The Control register (CR) controls the major functions of the device. + * + * Control Register Bit Definition + */ + +/* @}*/ + + +#define XDMAPS_CHANNELS_PER_DEV 8 + + +/** @name Mode Register + * + * The mode register (MR) defines the mode of transfer as well as the data + * format. If this register is modified during transmission or reception, + * data validity cannot be guaranteed. + * + * Mode Register Bit Definition + * @{ + */ + +/* @} */ + + +/** @name Interrupt Registers + * + * Interrupt control logic uses the interrupt enable register (IER) and the + * interrupt disable register (IDR) to set the value of the bits in the + * interrupt mask register (IMR). The IMR determines whether to pass an + * interrupt to the interrupt status register (ISR). + * Writing a 1 to IER Enbables an interrupt, writing a 1 to IDR disables an + * interrupt. IMR and ISR are read only, and IER and IDR are write only. + * Reading either IER or IDR returns 0x00. + * + * All four registers have the same bit definitions. + * + * @{ + */ + +/* @} */ +#define XDMAPS_INTCLR_ALL_MASK 0xFF + +#define XDmaPs_ReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/***************************************************************************/ +/** +* Write a DMAC register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the base address of the device. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note +* C-Style signature: +* void XDmaPs_WriteReg(u32 BaseAddress, int RegOffset, +* u32 RegisterValue) +******************************************************************************/ +#define XDmaPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + Xil_Out32((BaseAddress) + (RegOffset), (RegisterValue)) +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes *****************************/ +/* + * Perform reset operation to the dmaps interface + */ +void XDmaPs_ResetHw(u32 BaseAddr); +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_selftest.c new file mode 100755 index 000000000..cafbd7dfb --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_selftest.c @@ -0,0 +1,116 @@ +/***************************************************************************** +* +* (c) Copyright 2009-2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps_selftest.c +* +* This file contains the self-test functions for the XDmaPs driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00 hbm 03/29/2010 First Release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xdmaps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Variable Definitions *****************************/ + + +/************************** Function Prototypes ******************************/ + + +/****************************************************************************/ +/** +* +* This function runs a self-test on the driver and hardware device. This self +* test performs a local loopback and verifies data can be sent and received. +* +* The time for this test is proportional to the baud rate that has been set +* prior to calling this function. +* +* The mode and control registers are restored before return. +* +* @param InstPtr is a pointer to the XDmaPs instance +* +* @return +* +* - XST_SUCCESS if the test was successful +* - XST_FAILURE if the test failed +* +* @note +* +* This function can hang if the hardware is not functioning properly. +* +******************************************************************************/ +int XDmaPs_SelfTest(XDmaPs *InstPtr) +{ + u32 BaseAddr = InstPtr->Config.BaseAddress; + int i; + + if (XDmaPs_ReadReg(BaseAddr, XDMAPS_DBGSTATUS_OFFSET) + & XDMAPS_DBGSTATUS_BUSY) + return XST_FAILURE; + + for (i = 0; i < XDMAPS_CHANNELS_PER_DEV; i++) { + if (XDmaPs_ReadReg(BaseAddr, + XDmaPs_CSn_OFFSET(i))) + return XST_FAILURE; + } + return XST_SUCCESS; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_sinit.c new file mode 100755 index 000000000..447624e36 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/dmaps_v1_06_a/src/xdmaps_sinit.c @@ -0,0 +1,110 @@ +/***************************************************************************** +* +* (c) Copyright 2009-2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xdmaps_sinit.c +* +* The implementation of the XDmaPs driver's static initialzation +* functionality. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00 hbm 08/13/10 First Release +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xstatus.h" +#include "xparameters.h" +#include "xdmaps.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + + +/***************** Macros (Inline Functions) Definitions ********************/ + + +/************************** Variable Definitions ****************************/ +extern XDmaPs_Config XDmaPs_ConfigTable[]; + +/************************** Function Prototypes *****************************/ + +/****************************************************************************/ +/** +* +* Looks up the device configuration based on the unique device ID. The table +* contains the configuration info for each device in the system. +* +* @param DeviceId contains the ID of the device +* +* @return +* +* A pointer to the configuration structure or NULL if the specified device +* is not in the system. +* +* @note +* +* None. +* +******************************************************************************/ +XDmaPs_Config *XDmaPs_LookupConfig(u16 DeviceId) +{ + XDmaPs_Config *CfgPtr = NULL; + + int i; + + for (i = 0; i < XPAR_XDMAPS_NUM_INSTANCES; i++) { + if (XDmaPs_ConfigTable[i].DeviceId == DeviceId) { + CfgPtr = &XDmaPs_ConfigTable[i]; + break; + } + } + + return CfgPtr; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/Makefile new file mode 100755 index 000000000..ba187001d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xemacps_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling emacps" + +xemacps_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xemacps_includes + +xemacps_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps.c new file mode 100755 index 000000000..8064f7aef --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps.c @@ -0,0 +1,401 @@ +/* $Id: xemacps.c,v 1.1.2.3 2011/05/17 12:00:33 anirudh Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps.c +* +* The XEmacPs driver. Functions in this file are the minimum required functions +* for this driver. See xemacps.h for a detailed description of the driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a wsy 01/10/10 First release +* </pre> +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xemacps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +void XEmacPs_StubHandler(void); /* Default handler routine */ + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* Initialize a specific XEmacPs instance/driver. The initialization entails: +* - Initialize fields of the XEmacPs instance structure +* - Reset hardware and apply default options +* - Configure the DMA channels +* +* The PHY is setup independently from the device. Use the MII or whatever other +* interface may be present for setup. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param CfgPtr is the device configuration structure containing required +* hardware build data. +* @param EffectiveAddress is the base address of the device. If address +* translation is not utilized, this parameter can be passed in using +* CfgPtr->Config.BaseAddress to specify the physical base address. +* +* @return +* - XST_SUCCESS if initialization was successful +* +******************************************************************************/ +int XEmacPs_CfgInitialize(XEmacPs *InstancePtr, XEmacPs_Config * CfgPtr, + u32 EffectiveAddress) +{ + /* Verify arguments */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(CfgPtr != NULL); + + /* Set device base address and ID */ + InstancePtr->Config.DeviceId = CfgPtr->DeviceId; + InstancePtr->Config.BaseAddress = EffectiveAddress; + + /* Set callbacks to an initial stub routine */ + InstancePtr->SendHandler = (XEmacPs_Handler) XEmacPs_StubHandler; + InstancePtr->RecvHandler = (XEmacPs_Handler) XEmacPs_StubHandler; + InstancePtr->ErrorHandler = (XEmacPs_ErrHandler) XEmacPs_StubHandler; + + /* Reset the hardware and set default options */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + XEmacPs_Reset(InstancePtr); + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** +* Start the Ethernet controller as follows: +* - Enable transmitter if XTE_TRANSMIT_ENABLE_OPTION is set +* - Enable receiver if XTE_RECEIVER_ENABLE_OPTION is set +* - Start the SG DMA send and receive channels and enable the device +* interrupt +* +* @param InstancePtr is a pointer to the instance to be worked on. +* +* @return N/A +* +* @note +* Hardware is configured with scatter-gather DMA, the driver expects to start +* the scatter-gather channels and expects that the user has previously set up +* the buffer descriptor lists. +* +* This function makes use of internal resources that are shared between the +* Start, Stop, and Set/ClearOptions functions. So if one task might be setting +* device options while another is trying to start the device, the user is +* required to provide protection of this shared data (typically using a +* semaphore). +* +* This function must not be preempted by an interrupt that may service the +* device. +* +******************************************************************************/ +void XEmacPs_Start(XEmacPs *InstancePtr) +{ + u32 Reg; + + /* Assert bad arguments and conditions */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(InstancePtr->RxBdRing.BaseBdAddr != 0); + Xil_AssertVoid(InstancePtr->TxBdRing.BaseBdAddr != 0); + + /* If already started, then there is nothing to do */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return; + } + + /* Start DMA */ + /* When starting the DMA channels, both transmit and receive sides + * need an initialized BD list. + */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXQBASE_OFFSET, + InstancePtr->RxBdRing.BaseBdAddr); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXQBASE_OFFSET, + InstancePtr->TxBdRing.BaseBdAddr); + + /* clear any existed int status */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_ISR_OFFSET, + XEMACPS_IXR_ALL_MASK); + + /* Enable transmitter if not already enabled */ + if (InstancePtr->Options & XEMACPS_TRANSMITTER_ENABLE_OPTION) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + if (!(Reg & XEMACPS_NWCTRL_TXEN_MASK)) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, + Reg | XEMACPS_NWCTRL_TXEN_MASK); + } + } + + /* Enable receiver if not already enabled */ + if (InstancePtr->Options & XEMACPS_RECEIVER_ENABLE_OPTION) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + if (!(Reg & XEMACPS_NWCTRL_RXEN_MASK)) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, + Reg | XEMACPS_NWCTRL_RXEN_MASK); + } + } + + /* Enable TX and RX interrupts */ + XEmacPs_IntEnable(InstancePtr, (XEMACPS_IXR_TX_ERR_MASK | + XEMACPS_IXR_RX_ERR_MASK | XEMACPS_IXR_FRAMERX_MASK | + XEMACPS_IXR_TXCOMPL_MASK)); + + /* Mark as started */ + InstancePtr->IsStarted = XIL_COMPONENT_IS_STARTED; + + return; +} + + +/*****************************************************************************/ +/** +* Gracefully stop the Ethernet MAC as follows: +* - Disable all interrupts from this device +* - Stop DMA channels +* - Disable the tansmitter and receiver +* +* Device options currently in effect are not changed. +* +* This function will disable all interrupts. Default interrupts settings that +* had been enabled will be restored when XEmacPs_Start() is called. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* +* @note +* This function makes use of internal resources that are shared between the +* Start, Stop, SetOptions, and ClearOptions functions. So if one task might be +* setting device options while another is trying to start the device, the user +* is required to provide protection of this shared data (typically using a +* semaphore). +* +* Stopping the DMA channels causes this function to block until the DMA +* operation is complete. +* +******************************************************************************/ +void XEmacPs_Stop(XEmacPs *InstancePtr) +{ + u32 Reg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Disable all interrupts */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_IDR_OFFSET, + XEMACPS_IXR_ALL_MASK); + + /* Disable the receiver & transmitter */ + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg &= ~XEMACPS_NWCTRL_RXEN_MASK; + Reg &= ~XEMACPS_NWCTRL_TXEN_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + + /* Mark as stopped */ + InstancePtr->IsStarted = 0; +} + + +/*****************************************************************************/ +/** +* Perform a graceful reset of the Ethernet MAC. Resets the DMA channels, the +* transmitter, and the receiver. +* +* Steps to reset +* - Stops transmit and receive channels +* - Stops DMA +* - Configure transmit and receive buffer size to default +* - Clear transmit and receive status register and counters +* - Clear all interrupt sources +* - Clear phy (if there is any previously detected) address +* - Clear MAC addresses (1-4) as well as Type IDs and hash value +* +* All options are placed in their default state. Any frames in the +* descriptor lists will remain in the lists. The side effect of doing +* this is that after a reset and following a restart of the device, frames +* were in the list before the reset may be transmitted or received. +* +* The upper layer software is responsible for re-configuring (if necessary) +* and restarting the MAC after the reset. Note also that driver statistics +* are not cleared on reset. It is up to the upper layer software to clear the +* statistics if needed. +* +* When a reset is required, the driver notifies the upper layer software of +* this need through the ErrorHandler callback and specific status codes. +* The upper layer software is responsible for calling this Reset function +* and then re-configuring the device. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* +******************************************************************************/ +void XEmacPs_Reset(XEmacPs *InstancePtr) +{ + u32 Reg; + u8 i; + char EmacPs_zero_MAC[6] = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Stop the device and reset hardware */ + XEmacPs_Stop(InstancePtr); + InstancePtr->Options = XEMACPS_DEFAULT_OPTIONS; + + /* Setup hardware with default values */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, + (XEMACPS_NWCTRL_STATCLR_MASK | + XEMACPS_NWCTRL_MDEN_MASK) & + ~XEMACPS_NWCTRL_LOOPEN_MASK); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET, + XEMACPS_NWCFG_100_MASK | + XEMACPS_NWCFG_FDEN_MASK | + XEMACPS_NWCFG_UCASTHASHEN_MASK); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET, + ((((XEMACPS_RX_BUF_SIZE / XEMACPS_RX_BUF_UNIT) + + ((XEMACPS_RX_BUF_SIZE % + XEMACPS_RX_BUF_UNIT) ? 1 : 0)) << + XEMACPS_DMACR_RXBUF_SHIFT) & + XEMACPS_DMACR_RXBUF_MASK) | + XEMACPS_DMACR_RXSIZE_MASK | + XEMACPS_DMACR_TXSIZE_MASK); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXSR_OFFSET, 0x0); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXQBASE_OFFSET, 0x0); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXQBASE_OFFSET, 0x0); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXSR_OFFSET, 0x0); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_IDR_OFFSET, + XEMACPS_IXR_ALL_MASK); + + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_ISR_OFFSET); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_ISR_OFFSET, + Reg); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_PHYMNTNC_OFFSET, 0x0); + + XEmacPs_ClearHash(InstancePtr); + + for (i = 1; i < 5; i++) { + XEmacPs_SetMacAddress(InstancePtr, EmacPs_zero_MAC, i); + XEmacPs_SetTypeIdCheck(InstancePtr, 0x0, i); + } + + /* clear all counters */ + for (i = 0; i < (XEMACPS_LAST_OFFSET - XEMACPS_OCTTXL_OFFSET) / 4; + i++) { + XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_OCTTXL_OFFSET + i * 4); + } + + /* Disable the receiver */ + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg &= ~XEMACPS_NWCTRL_RXEN_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + + /* Sync default options with hardware but leave receiver and + * transmitter disabled. They get enabled with XEmacPs_Start() if + * XEMACPS_TRANSMITTER_ENABLE_OPTION and + * XEMACPS_RECEIVER_ENABLE_OPTION are set. + */ + XEmacPs_SetOptions(InstancePtr, InstancePtr->Options & + ~(XEMACPS_TRANSMITTER_ENABLE_OPTION | + XEMACPS_RECEIVER_ENABLE_OPTION)); + + XEmacPs_ClearOptions(InstancePtr, ~InstancePtr->Options); +} + + +/******************************************************************************/ +/** + * This is a stub for the asynchronous callbacks. The stub is here in case the + * upper layer forgot to set the handler(s). On initialization, all handlers are + * set to this callback. It is considered an error for this handler to be + * invoked. + * + ******************************************************************************/ +void XEmacPs_StubHandler(void) +{ + Xil_AssertVoidAlways(); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps.h new file mode 100755 index 000000000..81e750c06 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps.h @@ -0,0 +1,716 @@ +/***************************************************************************** +* +* (c) Copyright 2010-11 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** + * + * @file xemacps.h + * + * The Xilinx Embedded Processor Block Ethernet driver. + * + * For a full description of XEMACPS features, please see the hardware spec. + * This driver supports the following features: + * - Memory mapped access to host interface registers + * - Statistics counter registers for RMON/MIB + * - API for interrupt driven frame transfers for hardware configured DMA + * - Virtual memory support + * - Unicast, broadcast, and multicast receive address filtering + * - Full and half duplex operation + * - Automatic PAD & FCS insertion and stripping + * - Flow control + * - Support up to four 48bit addresses + * - Address checking for four specific 48bit addresses + * - VLAN frame support + * - Pause frame support + * - Large frame support up to 1536 bytes + * - Checksum offload + * + * <b>Driver Description</b> + * + * The device driver enables higher layer software (e.g., an application) to + * communicate to the XEmacPs. The driver handles transmission and reception + * of Ethernet frames, as well as configuration and control. No pre or post + * processing of frame data is performed. The driver does not validate the + * contents of an incoming frame in addition to what has already occurred in + * hardware. + * A single device driver can support multiple devices even when those devices + * have significantly different configurations. + * + * <b>Initialization & Configuration</b> + * + * The XEmacPs_Config structure is used by the driver to configure itself. + * This configuration structure is typically created by the tool-chain based + * on hardware build properties. + * + * The driver instance can be initialized in + * + * - XEmacPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddress): Uses a + * configuration structure provided by the caller. If running in a system + * with address translation, the provided virtual memory base address + * replaces the physical address present in the configuration structure. + * + * The device supports DMA only as current development plan. No FIFO mode is + * supported. The driver expects to start the DMA channels and expects that + * the user has set up the buffer descriptor lists. + * + * <b>Interrupts and Asynchronous Callbacks</b> + * + * The driver has no dependencies on the interrupt controller. When an + * interrupt occurs, the handler will perform a small amount of + * housekeeping work, determine the source of the interrupt, and call the + * appropriate callback function. All callbacks are registered by the user + * level application. + * + * <b>Virtual Memory</b> + * + * All virtual to physical memory mappings must occur prior to accessing the + * driver API. + * + * For DMA transactions, user buffers supplied to the driver must be in terms + * of their physical address. + * + * <b>DMA</b> + * + * The DMA engine uses buffer descriptors (BDs) to describe Ethernet frames. + * These BDs are typically chained together into a list the hardware follows + * when transferring data in and out of the packet buffers. Each BD describes + * a memory region containing either a full or partial Ethernet packet. + * + * Interrupt coalescing is not suppoted from this built-in DMA engine. + * + * This API requires the user to understand how the DMA operates. The + * following paragraphs provide some explanation, but the user is encouraged + * to read documentation in xemacps_bdring.h as well as study example code + * that accompanies this driver. + * + * The API is designed to get BDs to and from the DMA engine in the most + * efficient means possible. The first step is to establish a memory region + * to contain all BDs for a specific channel. This is done with + * XEmacPs_BdRingCreate(). This function sets up a BD ring that hardware will + * follow as BDs are processed. The ring will consist of a user defined number + * of BDs which will all be partially initialized. For example on the transmit + * channel, the driver will initialize all BDs' so that they are configured + * for transmit. The more fields that can be permanently setup at + * initialization, then the fewer accesses will be needed to each BD while + * the DMA engine is in operation resulting in better throughput and CPU + * utilization. The best case initialization would require the user to set + * only a frame buffer address and length prior to submitting the BD to the + * engine. + * + * BDs move through the engine with the help of functions + * XEmacPs_BdRingAlloc(), XEmacPs_BdRingToHw(), XEmacPs_BdRingFromHw(), + * and XEmacPs_BdRingFree(). + * All these functions handle BDs that are in place. That is, there are no + * copies of BDs kept anywhere and any BD the user interacts with is an actual + * BD from the same ring hardware accesses. + * + * BDs in the ring go through a series of states as follows: + * 1. Idle. The driver controls BDs in this state. + * 2. The user has data to transfer. XEmacPs_BdRingAlloc() is called to + * reserve BD(s). Once allocated, the user may setup the BD(s) with + * frame buffer address, length, and other attributes. The user controls + * BDs in this state. + * 3. The user submits BDs to the DMA engine with XEmacPs_BdRingToHw. BDs + * in this state are either waiting to be processed by hardware, are in + * process, or have been processed. The DMA engine controls BDs in this + * state. + * 4. Processed BDs are retrieved with XEmacEpv_BdRingFromHw() by the + * user. Once retrieved, the user can examine each BD for the outcome of + * the DMA transfer. The user controls BDs in this state. After examining + * the BDs the user calls XEmacPs_BdRingFree() which places the BDs back + * into state 1. + * + * Each of the four BD accessor functions operate on a set of BDs. A set is + * defined as a segment of the BD ring consisting of one or more BDs. The user + * views the set as a pointer to the first BD along with the number of BDs for + * that set. The set can be navigated by using macros XEmacPs_BdNext(). The + * user must exercise extreme caution when changing BDs in a set as there is + * nothing to prevent doing a mBdNext past the end of the set and modifying a + * BD out of bounds. + * + * XEmacPs_BdRingAlloc() + XEmacPs_BdRingToHw(), as well as + * XEmacPs_BdRingFromHw() + XEmacPs_BdRingFree() are designed to be used in + * tandem. The same BD set retrieved with BdRingAlloc should be the same one + * provided to hardware with BdRingToHw. Same goes with BdRingFromHw and + * BdRIngFree. + * + * <b>Alignment & Data Cache Restrictions</b> + * + * Due to the design of the hardware, all RX buffers, BDs need to be 4-byte + * aligned. Please reference xemacps_bd.h for cache related macros. + * + * DMA Tx: + * + * - If frame buffers exist in cached memory, then they must be flushed + * prior to committing them to hardware. + * + * DMA Rx: + * + * - If frame buffers exist in cached memory, then the cache must be + * invalidated for the memory region containing the frame prior to data + * access + * + * Both cache invalidate/flush are taken care of in driver code. + * + * <b>Buffer Copying</b> + * + * The driver is designed for a zero-copy buffer scheme. That is, the driver + * will not copy buffers. This avoids potential throughput bottlenecks within + * the driver. If byte copying is required, then the transfer will take longer + * to complete. + * + * <b>Checksum Offloading</b> + * + * The Embedded Processor Block Ethernet can be configured to perform IP, TCP + * and UDP checksum offloading in both receive and transmit directions. + * + * IP packets contain a 16-bit checksum field, which is the 16-bit 1s + * complement of the 1s complement sum of all 16-bit words in the header. + * TCP and UDP packets contain a 16-bit checksum field, which is the 16-bit + * 1s complement of the 1s complement sum of all 16-bit words in the header, + * the data and a conceptual pseudo header. + * + * To calculate these checksums in software requires each byte of the packet + * to be read. For TCP and UDP this can use a large amount of processing power. + * Offloading the checksum calculation to hardware can result in significant + * performance improvements. + * + * The transmit checksum offload is only available to use DMA in packet buffer + * mode. This is because the complete frame to be transmitted must be read + * into the packet buffer memory before the checksum can be calculated and + * written to the header at the beginning of the frame. + * + * For IP, TCP or UDP receive checksum offload to be useful, the operating + * system containing the protocol stack must be aware that this offload is + * available so that it can make use of the fact that the hardware has verified + * the checksum. + * + * When receive checksum offloading is enabled in the hardware, the IP header + * checksum is checked, where the packet meets the following criteria: + * + * 1. If present, the VLAN header must be four octets long and the CFI bit + * must not be set. + * 2. Encapsulation must be RFC 894 Ethernet Type Encoding or RFC 1042 SNAP + * encoding. + * 3. IP v4 packet. + * 4. IP header is of a valid length. + * 5. Good IP header checksum. + * 6. No IP fragmentation. + * 7. TCP or UDP packet. + * + * When an IP, TCP or UDP frame is received, the receive buffer descriptor + * gives an indication if the hardware was able to verify the checksums. + * There is also an indication if the frame had SNAP encapsulation. These + * indication bits will replace the type ID match indication bits when the + * receive checksum offload is enabled. + * + * If any of the checksums are verified incorrect by the hardware, the packet + * is discarded and the appropriate statistics counter incremented. + * + * <b>PHY Interfaces</b> + * + * RGMII 1.3 is the only interface supported. + * + * <b>Asserts</b> + * + * Asserts are used within all Xilinx drivers to enforce constraints on + * parameters. Asserts can be turned off on a system-wide basis by defining, + * at compile time, the NDEBUG identifier. By default, asserts are turned on + * and it is recommended that users leave asserts on during development. For + * deployment use -DNDEBUG compiler switch to remove assert code. + * + * @note + * + * Xilinx drivers are typically composed of two parts, one is the driver + * and the other is the adapter. The driver is independent of OS and processor + * and is intended to be highly portable. The adapter is OS-specific and + * facilitates communication between the driver and an OS. + * This driver is intended to be RTOS and processor independent. Any needs for + * dynamic memory management, threads or thread mutual exclusion, or cache + * control must be satisfied bythe layer above this driver. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ------------------------------------------------------- + * 1.00a wsy 01/10/10 First release + * 1.00a asa 11/21/11 The function XEmacPs_BdRingFromHwTx in file + * xemacps_bdring.c is modified. Earlier it was checking for + * "BdLimit"(passed argument) number of BDs for finding out + * which BDs are successfully processed. Now one more check + * is added. It looks for BDs till the current BD pointer + * reaches HwTail. By doing this processing time is saved. + * 1.00a asa 01/24/12 The function XEmacPs_BdRingFromHwTx in file + * xemacps_bdring.c is modified. Now start of packet is + * searched for returning the number of BDs processed. + * 1.02a asa 11/05/12 Added a new API for deleting an entry from the HASH + * registers. Added a new API to set the bust length. + * Added some new hash-defines. + * 1.03a asa 01/23/12 Fix for CR #692702 which updates error handling for + * Rx errors. Under heavy Rx traffic, there will be a large + * number of errors related to receive buffer not available. + * Because of a HW bug (SI #692601), under such heavy errors, + * the Rx data path can become unresponsive. To reduce the + * probabilities for hitting this HW bug, the SW writes to + * bit 18 to flush a packet from Rx DPRAM immediately. The + * changes for it are done in the function + * XEmacPs_IntrHandler. + * 1.05a asa 09/23/13 Cache operations on BDs are not required and hence + * removed. It is expected that all BDs are allocated in + * from uncached area. + * </pre> + * + ****************************************************************************/ + +#ifndef XEMACPS_H /* prevent circular inclusions */ +#define XEMACPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xemacps_hw.h" +#include "xemacps_bd.h" +#include "xemacps_bdring.h" + +/************************** Constant Definitions ****************************/ + +/* + * Device information + */ +#define XEMACPS_DEVICE_NAME "xemacps" +#define XEMACPS_DEVICE_DESC "Xilinx PS 10/100/1000 MAC" + + +/** @name Configuration options + * + * Device configuration options. See the XEmacPs_SetOptions(), + * XEmacPs_ClearOptions() and XEmacPs_GetOptions() for information on how to + * use options. + * + * The default state of the options are noted and are what the device and + * driver will be set to after calling XEmacPs_Reset() or + * XEmacPs_Initialize(). + * + * @{ + */ + +#define XEMACPS_PROMISC_OPTION 0x00000001 +/**< Accept all incoming packets. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_FRAME1536_OPTION 0x00000002 +/**< Frame larger than 1516 support for Tx & Rx. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_VLAN_OPTION 0x00000004 +/**< VLAN Rx & Tx frame support. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_FLOW_CONTROL_OPTION 0x00000010 +/**< Enable recognition of flow control frames on Rx + * This option defaults to enabled (set) */ + +#define XEMACPS_FCS_STRIP_OPTION 0x00000020 +/**< Strip FCS and PAD from incoming frames. Note: PAD from VLAN frames is not + * stripped. + * This option defaults to enabled (set) */ + +#define XEMACPS_FCS_INSERT_OPTION 0x00000040 +/**< Generate FCS field and add PAD automatically for outgoing frames. + * This option defaults to disabled (cleared) */ + +#define XEMACPS_LENTYPE_ERR_OPTION 0x00000080 +/**< Enable Length/Type error checking for incoming frames. When this option is + * set, the MAC will filter frames that have a mismatched type/length field + * and if XEMACPS_REPORT_RXERR_OPTION is set, the user is notified when these + * types of frames are encountered. When this option is cleared, the MAC will + * allow these types of frames to be received. + * + * This option defaults to disabled (cleared) */ + +#define XEMACPS_TRANSMITTER_ENABLE_OPTION 0x00000100 +/**< Enable the transmitter. + * This option defaults to enabled (set) */ + +#define XEMACPS_RECEIVER_ENABLE_OPTION 0x00000200 +/**< Enable the receiver + * This option defaults to enabled (set) */ + +#define XEMACPS_BROADCAST_OPTION 0x00000400 +/**< Allow reception of the broadcast address + * This option defaults to enabled (set) */ + +#define XEMACPS_MULTICAST_OPTION 0x00000800 +/**< Allows reception of multicast addresses programmed into hash + * This option defaults to disabled (clear) */ + +#define XEMACPS_RX_CHKSUM_ENABLE_OPTION 0x00001000 +/**< Enable the RX checksum offload + * This option defaults to enabled (set) */ + +#define XEMACPS_TX_CHKSUM_ENABLE_OPTION 0x00002000 +/**< Enable the TX checksum offload + * This option defaults to enabled (set) */ + + +#define XEMACPS_DEFAULT_OPTIONS \ + (XEMACPS_FLOW_CONTROL_OPTION | \ + XEMACPS_FCS_INSERT_OPTION | \ + XEMACPS_FCS_STRIP_OPTION | \ + XEMACPS_BROADCAST_OPTION | \ + XEMACPS_LENTYPE_ERR_OPTION | \ + XEMACPS_TRANSMITTER_ENABLE_OPTION | \ + XEMACPS_RECEIVER_ENABLE_OPTION | \ + XEMACPS_RX_CHKSUM_ENABLE_OPTION | \ + XEMACPS_TX_CHKSUM_ENABLE_OPTION) + +/**< Default options set when device is initialized or reset */ +/*@}*/ + +/** @name Callback identifiers + * + * These constants are used as parameters to XEmacPs_SetHandler() + * @{ + */ +#define XEMACPS_HANDLER_DMASEND 1 +#define XEMACPS_HANDLER_DMARECV 2 +#define XEMACPS_HANDLER_ERROR 3 +/*@}*/ + +/* Constants to determine the configuration of the hardware device. They are + * used to allow the driver to verify it can operate with the hardware. + */ +#define XEMACPS_MDIO_DIV_DFT MDC_DIV_32 /**< Default MDIO clock divisor */ + +/* The next few constants help upper layers determine the size of memory + * pools used for Ethernet buffers and descriptor lists. + */ +#define XEMACPS_MAC_ADDR_SIZE 6 /* size of Ethernet header */ + +#define XEMACPS_MTU 1500 /* max MTU size of Ethernet frame */ +#define XEMACPS_HDR_SIZE 14 /* size of Ethernet header */ +#define XEMACPS_HDR_VLAN_SIZE 18 /* size of Ethernet header with VLAN */ +#define XEMACPS_TRL_SIZE 4 /* size of Ethernet trailer (FCS) */ +#define XEMACPS_MAX_FRAME_SIZE (XEMACPS_MTU + XEMACPS_HDR_SIZE + \ + XEMACPS_TRL_SIZE) +#define XEMACPS_MAX_VLAN_FRAME_SIZE (XEMACPS_MTU + XEMACPS_HDR_SIZE + \ + XEMACPS_HDR_VLAN_SIZE + XEMACPS_TRL_SIZE) + +/* DMACR Bust length hash defines */ + +#define XEMACPS_SINGLE_BURST 1 +#define XEMACPS_4BYTE_BURST 4 +#define XEMACPS_8BYTE_BURST 8 +#define XEMACPS_16BYTE_BURST 16 + + +/**************************** Type Definitions ******************************/ +/** @name Typedefs for callback functions + * + * These callbacks are invoked in interrupt context. + * @{ + */ +/** + * Callback invoked when frame(s) have been sent or received in interrupt + * driven DMA mode. To set the send callback, invoke XEmacPs_SetHandler(). + * + * @param CallBackRef is user data assigned when the callback was set. + * + * @note + * See xemacps_hw.h for bitmasks definitions and the device hardware spec for + * further information on their meaning. + * + */ +typedef void (*XEmacPs_Handler) (void *CallBackRef); + +/** + * Callback when an asynchronous error occurs. To set this callback, invoke + * XEmacPs_SetHandler() with XEMACPS_HANDLER_ERROR in the HandlerType + * paramter. + * + * @param CallBackRef is user data assigned when the callback was set. + * @param Direction defines either receive or transmit error(s) has occurred. + * @param ErrorWord definition varies with Direction + * + */ +typedef void (*XEmacPs_ErrHandler) (void *CallBackRef, u8 Direction, + u32 ErrorWord); + +/*@}*/ + +/** + * This typedef contains configuration information for a device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress;/**< Physical base address of IPIF registers */ +} XEmacPs_Config; + + +/** + * The XEmacPs driver instance data. The user is required to allocate a + * structure of this type for every XEmacPs device in the system. A pointer + * to a structure of this type is then passed to the driver API functions. + */ +typedef struct XEmacPs { + XEmacPs_Config Config; /* Hardware configuration */ + u32 IsStarted; /* Device is currently started */ + u32 IsReady; /* Device is initialized and ready */ + u32 Options; /* Current options word */ + + XEmacPs_BdRing TxBdRing; /* Transmit BD ring */ + XEmacPs_BdRing RxBdRing; /* Receive BD ring */ + + XEmacPs_Handler SendHandler; + XEmacPs_Handler RecvHandler; + void *SendRef; + void *RecvRef; + + XEmacPs_ErrHandler ErrorHandler; + void *ErrorRef; + +} XEmacPs; + + +/***************** Macros (Inline Functions) Definitions ********************/ + +/****************************************************************************/ +/** +* Retrieve the Tx ring object. This object can be used in the various Ring +* API functions. +* +* @param InstancePtr is the DMA channel to operate on. +* +* @return TxBdRing attribute +* +* @note +* C-style signature: +* XEmacPs_BdRing XEmacPs_GetTxRing(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_GetTxRing(InstancePtr) ((InstancePtr)->TxBdRing) + +/****************************************************************************/ +/** +* Retrieve the Rx ring object. This object can be used in the various Ring +* API functions. +* +* @param InstancePtr is the DMA channel to operate on. +* +* @return RxBdRing attribute +* +* @note +* C-style signature: +* XEmacPs_BdRing XEmacPs_GetRxRing(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_GetRxRing(InstancePtr) ((InstancePtr)->RxBdRing) + +/****************************************************************************/ +/** +* +* Enable interrupts specified in <i>Mask</i>. The corresponding interrupt for +* each bit set to 1 in <i>Mask</i>, will be enabled. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Mask contains a bit mask of interrupts to enable. The mask can +* be formed using a set of bitwise or'd values. +* +* @note +* The state of the transmitter and receiver are not modified by this function. +* C-style signature +* void XEmacPs_IntEnable(XEmacPs *InstancePtr, u32 Mask) +* +*****************************************************************************/ +#define XEmacPs_IntEnable(InstancePtr, Mask) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_IER_OFFSET, \ + (Mask & XEMACPS_IXR_ALL_MASK)); + +/****************************************************************************/ +/** +* +* Disable interrupts specified in <i>Mask</i>. The corresponding interrupt for +* each bit set to 1 in <i>Mask</i>, will be enabled. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Mask contains a bit mask of interrupts to disable. The mask can +* be formed using a set of bitwise or'd values. +* +* @note +* The state of the transmitter and receiver are not modified by this function. +* C-style signature +* void XEmacPs_IntDisable(XEmacPs *InstancePtr, u32 Mask) +* +*****************************************************************************/ +#define XEmacPs_IntDisable(InstancePtr, Mask) \ + XEmacPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_IDR_OFFSET, \ + (Mask & XEMACPS_IXR_ALL_MASK)); + +/****************************************************************************/ +/** +* +* This macro triggers trasmit circuit to send data currently in TX buffer(s). +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* +* @return +* +* @note +* +* Signature: void XEmacPs_Transmit(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_Transmit(InstancePtr) \ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, \ + XEMACPS_NWCTRL_OFFSET, \ + (XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, \ + XEMACPS_NWCTRL_OFFSET) | XEMACPS_NWCTRL_STARTTX_MASK)) + +/****************************************************************************/ +/** +* +* This macro determines if the device is configured with checksum offloading +* on the receive channel +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* +* @return +* +* Boolean TRUE if the device is configured with checksum offloading, or +* FALSE otherwise. +* +* @note +* +* Signature: u32 XEmacPs_IsRxCsum(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_IsRxCsum(InstancePtr) \ + ((XEmacPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_NWCFG_OFFSET) & XEMACPS_NWCFG_RXCHKSUMEN_MASK) \ + ? TRUE : FALSE) + +/****************************************************************************/ +/** +* +* This macro determines if the device is configured with checksum offloading +* on the transmit channel +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* +* @return +* +* Boolean TRUE if the device is configured with checksum offloading, or +* FALSE otherwise. +* +* @note +* +* Signature: u32 XEmacPs_IsTxCsum(XEmacPs *InstancePtr) +* +*****************************************************************************/ +#define XEmacPs_IsTxCsum(InstancePtr) \ + ((XEmacPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XEMACPS_DMACR_OFFSET) & XEMACPS_DMACR_TCPCKSUM_MASK) \ + ? TRUE : FALSE) + +/************************** Function Prototypes *****************************/ + +/* + * Initialization functions in xemacps.c + */ +int XEmacPs_CfgInitialize(XEmacPs *InstancePtr, XEmacPs_Config *CfgPtr, + u32 EffectiveAddress); +void XEmacPs_Start(XEmacPs *InstancePtr); +void XEmacPs_Stop(XEmacPs *InstancePtr); +void XEmacPs_Reset(XEmacPs *InstancePtr); + +/* + * Lookup configuration in xemacps_sinit.c + */ +XEmacPs_Config *XEmacPs_LookupConfig(u16 DeviceId); + +/* + * Interrupt-related functions in xemacps_intr.c + * DMA only and FIFO is not supported. This DMA does not support coalescing. + */ +int XEmacPs_SetHandler(XEmacPs *InstancePtr, u32 HandlerType, + void *FuncPtr, void *CallBackRef); +void XEmacPs_IntrHandler(void *InstancePtr); + +/* + * MAC configuration/control functions in XEmacPs_control.c + */ +int XEmacPs_SetOptions(XEmacPs *InstancePtr, u32 Options); +int XEmacPs_ClearOptions(XEmacPs *InstancePtr, u32 Options); +u32 XEmacPs_GetOptions(XEmacPs *InstancePtr); + +int XEmacPs_SetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index); +void XEmacPs_GetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index); + +int XEmacPs_SetHash(XEmacPs *InstancePtr, void *AddressPtr); +void XEmacPs_ClearHash(XEmacPs *InstancePtr); +void XEmacPs_GetHash(XEmacPs *InstancePtr, void *AddressPtr); + +void XEmacPs_SetMdioDivisor(XEmacPs *InstancePtr, + XEmacPs_MdcDiv Divisor); +void XEmacPs_SetOperatingSpeed(XEmacPs *InstancePtr, u16 Speed); +u16 XEmacPs_GetOperatingSpeed(XEmacPs *InstancePtr); +int XEmacPs_PhyRead(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 *PhyDataPtr); +int XEmacPs_PhyWrite(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 PhyData); +int XEmacPs_SetTypeIdCheck(XEmacPs *InstancePtr, u32 Id_Check, u8 Index); + +int XEmacPs_SendPausePacket(XEmacPs *InstancePtr); +void XEmacPs_DMABLengthUpdate(XEmacPs *InstancePtr, int BLength); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bd.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bd.h new file mode 100755 index 000000000..8bf33cfa5 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bd.h @@ -0,0 +1,737 @@ +/* $Id: xemacps_bd.h,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xemacps_bd.h + * + * This header provides operations to manage buffer descriptors in support + * of scatter-gather DMA. + * + * The API exported by this header defines abstracted macros that allow the + * user to read/write specific BD fields. + * + * <b>Buffer Descriptors</b> + * + * A buffer descriptor (BD) defines a DMA transaction. The macros defined by + * this header file allow access to most fields within a BD to tailor a DMA + * transaction according to user and hardware requirements. See the hardware + * IP DMA spec for more information on BD fields and how they affect transfers. + * + * The XEmacPs_Bd structure defines a BD. The organization of this structure + * is driven mainly by the hardware for use in scatter-gather DMA transfers. + * + * <b>Performance</b> + * + * Limiting I/O to BDs can improve overall performance of the DMA channel. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ------------------------------------------------------- + * 1.00a wsy 01/10/10 First release + * </pre> + * + * *************************************************************************** + */ + +#ifndef XEMACPS_BD_H /* prevent circular inclusions */ +#define XEMACPS_BD_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include <string.h> +#include "xil_types.h" +#include "xil_assert.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/* Minimum BD alignment */ +#define XEMACPS_DMABD_MINIMUM_ALIGNMENT 4 + +/** + * The XEmacPs_Bd is the type for buffer descriptors (BDs). + */ +#define XEMACPS_BD_NUM_WORDS 2 +typedef u32 XEmacPs_Bd[XEMACPS_BD_NUM_WORDS]; + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** + * Zero out BD fields + * + * @param BdPtr is the BD pointer to operate on + * + * @return Nothing + * + * @note + * C-style signature: + * void XEmacPs_BdClear(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClear(BdPtr) \ + memset((BdPtr), 0, sizeof(XEmacPs_Bd)) + +/****************************************************************************/ +/** +* +* Read the given Buffer Descriptor word. +* +* @param BaseAddress is the base address of the BD to read +* @param Offset is the word offset to be read +* +* @return The 32-bit value of the field +* +* @note +* C-style signature: +* u32 XEmacPs_BdRead(u32 BaseAddress, u32 Offset) +* +*****************************************************************************/ +#define XEmacPs_BdRead(BaseAddress, Offset) \ + (*(u32*)((u32)(BaseAddress) + (u32)(Offset))) + +/****************************************************************************/ +/** +* +* Write the given Buffer Descriptor word. +* +* @param BaseAddress is the base address of the BD to write +* @param Offset is the word offset to be written +* @param Data is the 32-bit value to write to the field +* +* @return None. +* +* @note +* C-style signature: +* void XEmacPs_BdWrite(u32 BaseAddress, u32 Offset, u32 Data) +* +*****************************************************************************/ +#define XEmacPs_BdWrite(BaseAddress, Offset, Data) \ + (*(u32*)((u32)(BaseAddress) + (u32)(Offset)) = (Data)) + +/*****************************************************************************/ +/** + * Set the BD's Address field (word 0). + * + * @param BdPtr is the BD pointer to operate on + * @param Addr is the value to write to BD's status field. + * + * @note : + * + * C-style signature: + * void XEmacPs_BdSetAddressTx(XEmacPs_Bd* BdPtr, u32 Addr) + * + *****************************************************************************/ +#define XEmacPs_BdSetAddressTx(BdPtr, Addr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, (u32)(Addr))) + + +/*****************************************************************************/ +/** + * Set the BD's Address field (word 0). + * + * @param BdPtr is the BD pointer to operate on + * @param Addr is the value to write to BD's status field. + * + * @note : Due to some bits are mixed within recevie BD's address field, + * read-modify-write is performed. + * + * C-style signature: + * void XEmacPs_BdSetAddressRx(XEmacPs_Bd* BdPtr, u32 Addr) + * + *****************************************************************************/ +#define XEmacPs_BdSetAddressRx(BdPtr, Addr) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + ~XEMACPS_RXBUF_ADD_MASK) | (u32)(Addr))) + + +/*****************************************************************************/ +/** + * Set the BD's Status field (word 1). + * + * @param BdPtr is the BD pointer to operate on + * @param Data is the value to write to BD's status field. + * + * @note + * C-style signature: + * void XEmacPs_BdSetStatus(XEmacPs_Bd* BdPtr, u32 Data) + * + *****************************************************************************/ +#define XEmacPs_BdSetStatus(BdPtr, Data) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | Data) + + +/*****************************************************************************/ +/** + * Retrieve the BD's Packet DMA transfer status word (word 1). + * + * @param BdPtr is the BD pointer to operate on + * + * @return Status word + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetStatus(XEmacPs_Bd* BdPtr) + * + * Due to the BD bit layout differences in transmit and receive. User's + * caution is required. + *****************************************************************************/ +#define XEmacPs_BdGetStatus(BdPtr) \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) + + +/*****************************************************************************/ +/** + * Get the address (bits 0..31) of the BD's buffer address (word 0) + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetBufAddr(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdGetBufAddr(BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET)) + + +/*****************************************************************************/ +/** + * Set transfer length in bytes for the given BD. The length must be set each + * time a BD is submitted to hardware. + * + * @param BdPtr is the BD pointer to operate on + * @param LenBytes is the number of bytes to transfer. + * + * @note + * C-style signature: + * void XEmacPs_BdSetLength(XEmacPs_Bd* BdPtr, u32 LenBytes) + * + *****************************************************************************/ +#define XEmacPs_BdSetLength(BdPtr, LenBytes) \ + XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + ~XEMACPS_TXBUF_LEN_MASK) | (LenBytes))) + + +/*****************************************************************************/ +/** + * Retrieve the BD length field. + * + * For Tx channels, the returned value is the same as that written with + * XEmacPs_BdSetLength(). + * + * For Rx channels, the returned value is the size of the received packet. + * + * @param BdPtr is the BD pointer to operate on + * + * @return Length field processed by hardware or set by + * XEmacPs_BdSetLength(). + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetLength(XEmacPs_Bd* BdPtr) + * XEAMCPS_RXBUF_LEN_MASK is same as XEMACPS_TXBUF_LEN_MASK. + * + *****************************************************************************/ +#define XEmacPs_BdGetLength(BdPtr) \ + (XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_LEN_MASK) + + +/*****************************************************************************/ +/** + * Test whether the given BD has been marked as the last BD of a packet. + * + * @param BdPtr is the BD pointer to operate on + * + * @return TRUE if BD represents the "Last" BD of a packet, FALSE otherwise + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsLast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsLast(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_EOF_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Tell the DMA engine that the given transmit BD marks the end of the current + * packet to be processed. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdSetLast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetLast(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | \ + XEMACPS_TXBUF_LAST_MASK)) + + +/*****************************************************************************/ +/** + * Tell the DMA engine that the current packet does not end with the given + * BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdClearLast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClearLast(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + ~XEMACPS_TXBUF_LAST_MASK)) + + +/*****************************************************************************/ +/** + * Set this bit to mark the last descriptor in the receive buffer descriptor + * list. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdSetRxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetRxWrap(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) | \ + XEMACPS_RXBUF_WRAP_MASK)) + + +/*****************************************************************************/ +/** + * Determine the wrap bit of the receive BD which indicates end of the + * BD list. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxWrap(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + XEMACPS_RXBUF_WRAP_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Sets this bit to mark the last descriptor in the transmit buffer + * descriptor list. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdSetTxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetTxWrap(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | \ + XEMACPS_TXBUF_WRAP_MASK)) + + +/*****************************************************************************/ +/** + * Determine the wrap bit of the transmit BD which indicates end of the + * BD list. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetTxWrap(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxWrap(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_WRAP_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/* + * Must clear this bit to enable the MAC to write data to the receive + * buffer. Hardware sets this bit once it has successfully written a frame to + * memory. Once set, software has to clear the bit before the buffer can be + * used again. This macro clear the new bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdClearRxNew(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClearRxNew(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_ADDR_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + ~XEMACPS_RXBUF_NEW_MASK)) + + +/*****************************************************************************/ +/** + * Determine the new bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxNew(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxNew(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_ADDR_OFFSET) & \ + XEMACPS_RXBUF_NEW_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Software sets this bit to disable the buffer to be read by the hardware. + * Hardware sets this bit for the first buffer of a frame once it has been + * successfully transmitted. This macro sets this bit of transmit BD to avoid + * confusion. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdSetTxUsed(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetTxUsed(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | \ + XEMACPS_TXBUF_USED_MASK)) + + +/*****************************************************************************/ +/** + * Software clears this bit to enable the buffer to be read by the hardware. + * Hardware sets this bit for the first buffer of a frame once it has been + * successfully transmitted. This macro clears this bit of transmit BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * void XEmacPs_BdClearTxUsed(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClearTxUsed(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + ~XEMACPS_TXBUF_USED_MASK)) + + +/*****************************************************************************/ +/** + * Determine the used bit of the transmit BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsTxUsed(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxUsed(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_USED_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if a frame fails to be transmitted due to too many retries. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsTxRetry(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxRetry(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_RETRY_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if a frame fails to be transmitted due to data can not be + * feteched in time or buffers are exhausted. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsTxUrun(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxUrun(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_URUN_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if a frame fails to be transmitted due to buffer is exhausted + * mid-frame. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsTxExh(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsTxExh(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_TXBUF_EXH_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Sets this bit, no CRC will be appended to the current frame. This control + * bit must be set for the first buffer in a frame and will be ignored for + * the subsequent buffers of a frame. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * This bit must be clear when using the transmit checksum generation offload, + * otherwise checksum generation and substitution will not occur. + * + * C-style signature: + * u32 XEmacPs_BdSetTxNoCRC(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdSetTxNoCRC(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) | \ + XEMACPS_TXBUF_NOCRC_MASK)) + + +/*****************************************************************************/ +/** + * Clear this bit, CRC will be appended to the current frame. This control + * bit must be set for the first buffer in a frame and will be ignored for + * the subsequent buffers of a frame. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * This bit must be clear when using the transmit checksum generation offload, + * otherwise checksum generation and substitution will not occur. + * + * C-style signature: + * u32 XEmacPs_BdClearTxNoCRC(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdClearTxNoCRC(BdPtr) \ + (XEmacPs_BdWrite((BdPtr), XEMACPS_BD_STAT_OFFSET, \ + XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + ~XEMACPS_TXBUF_NOCRC_MASK)) + + +/*****************************************************************************/ +/** + * Determine the broadcast bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxBcast(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxBcast(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_BCAST_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the multicast hash bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxMultiHash(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxMultiHash(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_MULTIHASH_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the unicast hash bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxUniHash(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxUniHash(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_UNIHASH_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if the received frame is a VLAN Tagged frame. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxVlan(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxVlan(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_VLAN_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if the received frame has Type ID of 8100h and null VLAN + * identifier(Priority tag). + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxPri(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxPri(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_PRI_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine if the received frame's Concatenation Format Indicator (CFI) of + * the frames VLANTCI field was set. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdIsRxCFI(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxCFI(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_CFI_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the End Of Frame (EOF) bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetRxEOF(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxEOF(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_EOF_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * Determine the Start Of Frame (SOF) bit of the receive BD. + * + * @param BdPtr is the BD pointer to operate on + * + * @note + * C-style signature: + * u32 XEmacPs_BdGetRxSOF(XEmacPs_Bd* BdPtr) + * + *****************************************************************************/ +#define XEmacPs_BdIsRxSOF(BdPtr) \ + ((XEmacPs_BdRead((BdPtr), XEMACPS_BD_STAT_OFFSET) & \ + XEMACPS_RXBUF_SOF_MASK) ? TRUE : FALSE) + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bdring.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bdring.c new file mode 100755 index 000000000..40c1e35dc --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bdring.c @@ -0,0 +1,1010 @@ +/* $Id: xemacps_bdring.c,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_bdring.c +* +* This file implements buffer descriptor ring related functions. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a wsy 01/10/10 First release +* 1.00a asa 11/21/11 The function XEmacPs_BdRingFromHwTx is modified. +* Earlier it used to search in "BdLimit" number of BDs to +* know which BDs are processed. Now one more check is +* added. It looks for BDs till the current BD pointer +* reaches HwTail. By doing this processing time is saved. +* 1.00a asa 01/24/12 The function XEmacPs_BdRingFromHwTx in file +* xemacps_bdring.c is modified. Now start of packet is +* searched for returning the number of BDs processed. +* 1.05a asa 09/23/13 Cache operations on BDs are not required and hence +* removed. It is expected that all BDs are allocated in +* from uncached area. Fix for CR #663885. +* </pre> +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xil_cache.h" +#include "xemacps_hw.h" +#include "xemacps_bd.h" +#include "xemacps_bdring.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************************************************************** + * Compute the virtual address of a descriptor from its physical address + * + * @param BdPtr is the physical address of the BD + * + * @returns Virtual address of BdPtr + * + * @note Assume BdPtr is always a valid BD in the ring + ****************************************************************************/ +#define XEMACPS_PHYS_TO_VIRT(BdPtr) \ + ((u32)BdPtr + (RingPtr->BaseBdAddr - RingPtr->PhysBaseAddr)) + +/**************************************************************************** + * Compute the physical address of a descriptor from its virtual address + * + * @param BdPtr is the physical address of the BD + * + * @returns Physical address of BdPtr + * + * @note Assume BdPtr is always a valid BD in the ring + ****************************************************************************/ +#define XEMACPS_VIRT_TO_PHYS(BdPtr) \ + ((u32)BdPtr - (RingPtr->BaseBdAddr - RingPtr->PhysBaseAddr)) + +/**************************************************************************** + * Move the BdPtr argument ahead an arbitrary number of BDs wrapping around + * to the beginning of the ring if needed. + * + * We know if a wrapaound should occur if the new BdPtr is greater than + * the high address in the ring OR if the new BdPtr crosses over the + * 0xFFFFFFFF to 0 boundary. The latter test is a valid one since we do not + * allow a BD space to span this boundary. + * + * @param RingPtr is the ring BdPtr appears in + * @param BdPtr on input is the starting BD position and on output is the + * final BD position + * @param NumBd is the number of BD spaces to increment + * + ****************************************************************************/ +#define XEMACPS_RING_SEEKAHEAD(RingPtr, BdPtr, NumBd) \ + { \ + u32 Addr = (u32)BdPtr; \ + \ + Addr += ((RingPtr)->Separation * NumBd); \ + if ((Addr > (RingPtr)->HighBdAddr) || ((u32)BdPtr > Addr)) \ + { \ + Addr -= (RingPtr)->Length; \ + } \ + \ + BdPtr = (XEmacPs_Bd*)Addr; \ + } + +/**************************************************************************** + * Move the BdPtr argument backwards an arbitrary number of BDs wrapping + * around to the end of the ring if needed. + * + * We know if a wrapaound should occur if the new BdPtr is less than + * the base address in the ring OR if the new BdPtr crosses over the + * 0xFFFFFFFF to 0 boundary. The latter test is a valid one since we do not + * allow a BD space to span this boundary. + * + * @param RingPtr is the ring BdPtr appears in + * @param BdPtr on input is the starting BD position and on output is the + * final BD position + * @param NumBd is the number of BD spaces to increment + * + ****************************************************************************/ +#define XEMACPS_RING_SEEKBACK(RingPtr, BdPtr, NumBd) \ + { \ + u32 Addr = (u32)BdPtr; \ + \ + Addr -= ((RingPtr)->Separation * NumBd); \ + if ((Addr < (RingPtr)->BaseBdAddr) || ((u32)BdPtr < Addr)) \ + { \ + Addr += (RingPtr)->Length; \ + } \ + \ + BdPtr = (XEmacPs_Bd*)Addr; \ + } + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + +/*****************************************************************************/ +/** + * Using a memory segment allocated by the caller, create and setup the BD list + * for the given DMA channel. + * + * @param RingPtr is the instance to be worked on. + * @param PhysAddr is the physical base address of user memory region. + * @param VirtAddr is the virtual base address of the user memory region. If + * address translation is not being utilized, then VirtAddr should be + * equivalent to PhysAddr. + * @param Alignment governs the byte alignment of individual BDs. This function + * will enforce a minimum alignment of 4 bytes with no maximum as long + * as it is specified as a power of 2. + * @param BdCount is the number of BDs to setup in the user memory region. It + * is assumed the region is large enough to contain the BDs. + * + * @return + * + * - XST_SUCCESS if initialization was successful + * - XST_NO_FEATURE if the provided instance is a non DMA type + * channel. + * - XST_INVALID_PARAM under any of the following conditions: + * 1) PhysAddr and/or VirtAddr are not aligned to the given Alignment + * parameter; + * 2) Alignment parameter does not meet minimum requirements or is not a + * power of 2 value; + * 3) BdCount is 0. + * - XST_DMA_SG_LIST_ERROR if the memory segment containing the list spans + * over address 0x00000000 in virtual address space. + * + * @note + * Make sure to pass in the right alignment value. + *****************************************************************************/ +int XEmacPs_BdRingCreate(XEmacPs_BdRing * RingPtr, u32 PhysAddr, + u32 VirtAddr, u32 Alignment, unsigned BdCount) +{ + unsigned i; + u32 BdVirtAddr; + u32 BdPhyAddr; + + /* In case there is a failure prior to creating list, make sure the + * following attributes are 0 to prevent calls to other functions + * from doing anything. + */ + RingPtr->AllCnt = 0; + RingPtr->FreeCnt = 0; + RingPtr->HwCnt = 0; + RingPtr->PreCnt = 0; + RingPtr->PostCnt = 0; + + /* Make sure Alignment parameter meets minimum requirements */ + if (Alignment < XEMACPS_DMABD_MINIMUM_ALIGNMENT) { + return (XST_INVALID_PARAM); + } + + /* Make sure Alignment is a power of 2 */ + if ((Alignment - 1) & Alignment) { + return (XST_INVALID_PARAM); + } + + /* Make sure PhysAddr and VirtAddr are on same Alignment */ + if ((PhysAddr % Alignment) || (VirtAddr % Alignment)) { + return (XST_INVALID_PARAM); + } + + /* Is BdCount reasonable? */ + if (BdCount == 0) { + return (XST_INVALID_PARAM); + } + + /* Figure out how many bytes will be between the start of adjacent BDs */ + RingPtr->Separation = + (sizeof(XEmacPs_Bd) + (Alignment - 1)) & ~(Alignment - 1); + + /* Must make sure the ring doesn't span address 0x00000000. If it does, + * then the next/prev BD traversal macros will fail. + */ + if (VirtAddr > (VirtAddr + (RingPtr->Separation * BdCount) - 1)) { + return (XST_DMA_SG_LIST_ERROR); + } + + /* Initial ring setup: + * - Clear the entire space + * - Setup each BD's BDA field with the physical address of the next BD + */ + memset((void *) VirtAddr, 0, (RingPtr->Separation * BdCount)); + + BdVirtAddr = VirtAddr; + BdPhyAddr = PhysAddr + RingPtr->Separation; + for (i = 1; i < BdCount; i++) { + BdVirtAddr += RingPtr->Separation; + BdPhyAddr += RingPtr->Separation; + } + + /* Setup and initialize pointers and counters */ + RingPtr->RunState = XST_DMA_SG_IS_STOPPED; + RingPtr->BaseBdAddr = VirtAddr; + RingPtr->PhysBaseAddr = PhysAddr; + RingPtr->HighBdAddr = BdVirtAddr; + RingPtr->Length = + RingPtr->HighBdAddr - RingPtr->BaseBdAddr + RingPtr->Separation; + RingPtr->AllCnt = BdCount; + RingPtr->FreeCnt = BdCount; + RingPtr->FreeHead = (XEmacPs_Bd *) VirtAddr; + RingPtr->PreHead = (XEmacPs_Bd *) VirtAddr; + RingPtr->HwHead = (XEmacPs_Bd *) VirtAddr; + RingPtr->HwTail = (XEmacPs_Bd *) VirtAddr; + RingPtr->PostHead = (XEmacPs_Bd *) VirtAddr; + RingPtr->BdaRestart = (XEmacPs_Bd *) PhysAddr; + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Clone the given BD into every BD in the list. + * every field of the source BD is replicated in every BD of the list. + * + * This function can be called only when all BDs are in the free group such as + * they are immediately after initialization with XEmacPs_BdRingCreate(). + * This prevents modification of BDs while they are in use by hardware or the + * user. + * + * @param RingPtr is the pointer of BD ring instance to be worked on. + * @param SrcBdPtr is the source BD template to be cloned into the list. This + * BD will be modified. + * @param Direction is either XEMACPS_SEND or XEMACPS_RECV that indicates + * which direction. + * + * @return + * - XST_SUCCESS if the list was modified. + * - XST_DMA_SG_NO_LIST if a list has not been created. + * - XST_DMA_SG_LIST_ERROR if some of the BDs in this channel are under + * hardware or user control. + * - XST_DEVICE_IS_STARTED if the DMA channel has not been stopped. + * + *****************************************************************************/ +int XEmacPs_BdRingClone(XEmacPs_BdRing * RingPtr, XEmacPs_Bd * SrcBdPtr, + u8 Direction) +{ + unsigned i; + u32 CurBd; + + /* Can't do this function if there isn't a ring */ + if (RingPtr->AllCnt == 0) { + return (XST_DMA_SG_NO_LIST); + } + + /* Can't do this function with the channel running */ + if (RingPtr->RunState == XST_DMA_SG_IS_STARTED) { + return (XST_DEVICE_IS_STARTED); + } + + /* Can't do this function with some of the BDs in use */ + if (RingPtr->FreeCnt != RingPtr->AllCnt) { + return (XST_DMA_SG_LIST_ERROR); + } + + if ((Direction != XEMACPS_SEND) && (Direction != XEMACPS_RECV)) { + return (XST_INVALID_PARAM); + } + + /* Starting from the top of the ring, save BD.Next, overwrite the entire + * BD with the template, then restore BD.Next + */ + for (i = 0, CurBd = (u32) RingPtr->BaseBdAddr; + i < RingPtr->AllCnt; i++, CurBd += RingPtr->Separation) { + memcpy((void *)CurBd, SrcBdPtr, sizeof(XEmacPs_Bd)); + } + + CurBd -= RingPtr->Separation; + + if (Direction == XEMACPS_RECV) { + XEmacPs_BdSetRxWrap(CurBd); + } + else { + XEmacPs_BdSetTxWrap(CurBd); + } + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Reserve locations in the BD list. The set of returned BDs may be modified + * in preparation for future DMA transaction(s). Once the BDs are ready to be + * submitted to hardware, the user must call XEmacPs_BdRingToHw() in the same + * order which they were allocated here. Example: + * + * <pre> + * NumBd = 2; + * Status = XEmacPs_BdRingAlloc(MyRingPtr, NumBd, &MyBdSet); + * + * if (Status != XST_SUCCESS) + * { + * // Not enough BDs available for the request + * } + * + * CurBd = MyBdSet; + * for (i=0; i<NumBd; i++) + * { + * // Prepare CurBd..... + * + * // Onto next BD + * CurBd = XEmacPs_BdRingNext(MyRingPtr, CurBd); + * } + * + * // Give list to hardware + * Status = XEmacPs_BdRingToHw(MyRingPtr, NumBd, MyBdSet); + * </pre> + * + * A more advanced use of this function may allocate multiple sets of BDs. + * They must be allocated and given to hardware in the correct sequence: + * <pre> + * // Legal + * XEmacPs_BdRingAlloc(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingToHw(MyRingPtr, NumBd1, MySet1); + * + * // Legal + * XEmacPs_BdRingAlloc(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingAlloc(MyRingPtr, NumBd2, &MySet2); + * XEmacPs_BdRingToHw(MyRingPtr, NumBd1, MySet1); + * XEmacPs_BdRingToHw(MyRingPtr, NumBd2, MySet2); + * + * // Not legal + * XEmacPs_BdRingAlloc(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingAlloc(MyRingPtr, NumBd2, &MySet2); + * XEmacPs_BdRingToHw(MyRingPtr, NumBd2, MySet2); + * XEmacPs_BdRingToHw(MyRingPtr, NumBd1, MySet1); + * </pre> + * + * Use the API defined in xemacps_bd.h to modify individual BDs. Traversal + * of the BD set can be done using XEmacPs_BdRingNext() and + * XEmacPs_BdRingPrev(). + * + * @param RingPtr is a pointer to the BD ring instance to be worked on. + * @param NumBd is the number of BDs to allocate + * @param BdSetPtr is an output parameter, it points to the first BD available + * for modification. + * + * @return + * - XST_SUCCESS if the requested number of BDs was returned in the BdSetPtr + * parameter. + * - XST_FAILURE if there were not enough free BDs to satisfy the request. + * + * @note This function should not be preempted by another XEmacPs_Bd function + * call that modifies the BD space. It is the caller's responsibility to + * provide a mutual exclusion mechanism. + * + * @note Do not modify more BDs than the number requested with the NumBd + * parameter. Doing so will lead to data corruption and system + * instability. + * + *****************************************************************************/ +int XEmacPs_BdRingAlloc(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd ** BdSetPtr) +{ + /* Enough free BDs available for the request? */ + if (RingPtr->FreeCnt < NumBd) { + return (XST_FAILURE); + } + + /* Set the return argument and move FreeHead forward */ + *BdSetPtr = RingPtr->FreeHead; + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->FreeHead, NumBd); + RingPtr->FreeCnt -= NumBd; + RingPtr->PreCnt += NumBd; + return (XST_SUCCESS); +} + +/*****************************************************************************/ +/** + * Fully or partially undo an XEmacPs_BdRingAlloc() operation. Use this + * function if all the BDs allocated by XEmacPs_BdRingAlloc() could not be + * transferred to hardware with XEmacPs_BdRingToHw(). + * + * This function helps out in situations when an unrelated error occurs after + * BDs have been allocated but before they have been given to hardware. + * An example of this type of error would be an OS running out of resources. + * + * This function is not the same as XEmacPs_BdRingFree(). The Free function + * returns BDs to the free list after they have been processed by hardware, + * while UnAlloc returns them before being processed by hardware. + * + * There are two scenarios where this function can be used. Full UnAlloc or + * Partial UnAlloc. A Full UnAlloc means all the BDs Alloc'd will be returned: + * + * <pre> + * Status = XEmacPs_BdRingAlloc(MyRingPtr, 10, &BdPtr); + * ... + * if (Error) + * { + * Status = XEmacPs_BdRingUnAlloc(MyRingPtr, 10, &BdPtr); + * } + * </pre> + * + * A partial UnAlloc means some of the BDs Alloc'd will be returned: + * + * <pre> + * Status = XEmacPs_BdRingAlloc(MyRingPtr, 10, &BdPtr); + * BdsLeft = 10; + * CurBdPtr = BdPtr; + * + * while (BdsLeft) + * { + * if (Error) + * { + * Status = XEmacPs_BdRingUnAlloc(MyRingPtr, BdsLeft, CurBdPtr); + * } + * + * CurBdPtr = XEmacPs_BdRingNext(MyRingPtr, CurBdPtr); + * BdsLeft--; + * } + * </pre> + * + * A partial UnAlloc must include the last BD in the list that was Alloc'd. + * + * @param RingPtr is a pointer to the instance to be worked on. + * @param NumBd is the number of BDs to allocate + * @param BdSetPtr is an output parameter, it points to the first BD available + * for modification. + * + * @return + * - XST_SUCCESS if the BDs were unallocated. + * - XST_FAILURE if NumBd parameter was greater that the number of BDs in + * the preprocessing state. + * + * @note This function should not be preempted by another XEmacPs_Bd function + * call that modifies the BD space. It is the caller's responsibility to + * provide a mutual exclusion mechanism. + * + *****************************************************************************/ +int XEmacPs_BdRingUnAlloc(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr) +{ + (void)BdSetPtr; + + /* Enough BDs in the free state for the request? */ + if (RingPtr->PreCnt < NumBd) { + return (XST_FAILURE); + } + + /* Set the return argument and move FreeHead backward */ + XEMACPS_RING_SEEKBACK(RingPtr, RingPtr->FreeHead, NumBd); + RingPtr->FreeCnt += NumBd; + RingPtr->PreCnt -= NumBd; + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Enqueue a set of BDs to hardware that were previously allocated by + * XEmacPs_BdRingAlloc(). Once this function returns, the argument BD set goes + * under hardware control. Any changes made to these BDs after this point will + * corrupt the BD list leading to data corruption and system instability. + * + * The set will be rejected if the last BD of the set does not mark the end of + * a packet (see XEmacPs_BdSetLast()). + * + * @param RingPtr is a pointer to the instance to be worked on. + * @param NumBd is the number of BDs in the set. + * @param BdSetPtr is the first BD of the set to commit to hardware. + * + * @return + * - XST_SUCCESS if the set of BDs was accepted and enqueued to hardware. + * - XST_FAILURE if the set of BDs was rejected because the last BD of the set + * did not have its "last" bit set. + * - XST_DMA_SG_LIST_ERROR if this function was called out of sequence with + * XEmacPs_BdRingAlloc(). + * + * @note This function should not be preempted by another XEmacPs_Bd function + * call that modifies the BD space. It is the caller's responsibility to + * provide a mutual exclusion mechanism. + * + *****************************************************************************/ +int XEmacPs_BdRingToHw(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr) +{ + XEmacPs_Bd *CurBdPtr; + unsigned i; + + /* if no bds to process, simply return. */ + if (0 == NumBd) + return (XST_SUCCESS); + + /* Make sure we are in sync with XEmacPs_BdRingAlloc() */ + if ((RingPtr->PreCnt < NumBd) || (RingPtr->PreHead != BdSetPtr)) { + return (XST_DMA_SG_LIST_ERROR); + } + + CurBdPtr = BdSetPtr; + for (i = 0; i < NumBd; i++) { + CurBdPtr = XEmacPs_BdRingNext(RingPtr, CurBdPtr); + } + + /* Adjust ring pointers & counters */ + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->PreHead, NumBd); + RingPtr->PreCnt -= NumBd; + + RingPtr->HwTail = CurBdPtr; + RingPtr->HwCnt += NumBd; + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Returns a set of BD(s) that have been processed by hardware. The returned + * BDs may be examined to determine the outcome of the DMA transaction(s). + * Once the BDs have been examined, the user must call XEmacPs_BdRingFree() + * in the same order which they were retrieved here. Example: + * + * <pre> + * NumBd = XEmacPs_BdRingFromHwTx(MyRingPtr, MaxBd, &MyBdSet); + * + * if (NumBd == 0) + * { + * // hardware has nothing ready for us yet + * } + * + * CurBd = MyBdSet; + * for (i=0; i<NumBd; i++) + * { + * // Examine CurBd for post processing..... + * + * // Onto next BD + * CurBd = XEmacPs_BdRingNext(MyRingPtr, CurBd); + * } + * + * XEmacPs_BdRingFree(MyRingPtr, NumBd, MyBdSet); // Return list + * } + * </pre> + * + * A more advanced use of this function may allocate multiple sets of BDs. + * They must be retrieved from hardware and freed in the correct sequence: + * <pre> + * // Legal + * XEmacPs_BdRingFromHwTx(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingFree(MyRingPtr, NumBd1, MySet1); + * + * // Legal + * XEmacPs_BdRingFromHwTx(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingFromHwTx(MyRingPtr, NumBd2, &MySet2); + * XEmacPs_BdRingFree(MyRingPtr, NumBd1, MySet1); + * XEmacPs_BdRingFree(MyRingPtr, NumBd2, MySet2); + * + * // Not legal + * XEmacPs_BdRingFromHwTx(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingFromHwTx(MyRingPtr, NumBd2, &MySet2); + * XEmacPs_BdRingFree(MyRingPtr, NumBd2, MySet2); + * XEmacPs_BdRingFree(MyRingPtr, NumBd1, MySet1); + * </pre> + * + * If hardware has only partially completed a packet spanning multiple BDs, + * then none of the BDs for that packet will be included in the results. + * + * @param RingPtr is a pointer to the instance to be worked on. + * @param BdLimit is the maximum number of BDs to return in the set. + * @param BdSetPtr is an output parameter, it points to the first BD available + * for examination. + * + * @return + * The number of BDs processed by hardware. A value of 0 indicates that no + * data is available. No more than BdLimit BDs will be returned. + * + * @note Treat BDs returned by this function as read-only. + * + * @note This function should not be preempted by another XEmacPs_Bd function + * call that modifies the BD space. It is the caller's responsibility to + * provide a mutual exclusion mechanism. + * + *****************************************************************************/ +unsigned XEmacPs_BdRingFromHwTx(XEmacPs_BdRing * RingPtr, unsigned BdLimit, + XEmacPs_Bd ** BdSetPtr) +{ + XEmacPs_Bd *CurBdPtr; + u32 BdStr = 0; + unsigned BdCount; + unsigned BdPartialCount; + unsigned int Sop = 0; + + + CurBdPtr = RingPtr->HwHead; + BdCount = 0; + BdPartialCount = 0; + + /* If no BDs in work group, then there's nothing to search */ + if (RingPtr->HwCnt == 0) { + *BdSetPtr = NULL; + return (0); + } + + if (BdLimit > RingPtr->HwCnt) + BdLimit = RingPtr->HwCnt; + + /* Starting at HwHead, keep moving forward in the list until: + * - A BD is encountered with its new/used bit set which means + * hardware has not completed processing of that BD. + * - RingPtr->HwTail is reached and RingPtr->HwCnt is reached. + * - The number of requested BDs has been processed + */ + while (BdCount < BdLimit) { + /* Read the status */ + BdStr = XEmacPs_BdRead(CurBdPtr, XEMACPS_BD_STAT_OFFSET); + + if ((Sop == 0) && (BdStr & XEMACPS_TXBUF_USED_MASK)) + Sop = 1; + + if (Sop == 1) { + BdCount++; + BdPartialCount++; + } + + /* hardware has processed this BD so check the "last" bit. + * If it is clear, then there are more BDs for the current + * packet. Keep a count of these partial packet BDs. + */ + if ((Sop == 1) && (BdStr & XEMACPS_TXBUF_LAST_MASK)) { + Sop = 0; + BdPartialCount = 0; + } + + /* Move on to next BD in work group */ + CurBdPtr = XEmacPs_BdRingNext(RingPtr, CurBdPtr); + } + + /* Subtract off any partial packet BDs found */ + BdCount -= BdPartialCount; + + /* If BdCount is non-zero then BDs were found to return. Set return + * parameters, update pointers and counters, return success + */ + if (BdCount > 0) { + *BdSetPtr = RingPtr->HwHead; + RingPtr->HwCnt -= BdCount; + RingPtr->PostCnt += BdCount; + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->HwHead, BdCount); + return (BdCount); + } + else { + *BdSetPtr = NULL; + return (0); + } +} + + +/*****************************************************************************/ +/** + * Returns a set of BD(s) that have been processed by hardware. The returned + * BDs may be examined to determine the outcome of the DMA transaction(s). + * Once the BDs have been examined, the user must call XEmacPs_BdRingFree() + * in the same order which they were retrieved here. Example: + * + * <pre> + * NumBd = XEmacPs_BdRingFromHwRx(MyRingPtr, MaxBd, &MyBdSet); + * + * if (NumBd == 0) + * { + * // hardware has nothing ready for us yet + * } + * + * CurBd = MyBdSet; + * for (i=0; i<NumBd; i++) + * { + * // Examine CurBd for post processing..... + * + * // Onto next BD + * CurBd = XEmacPs_BdRingNext(MyRingPtr, CurBd); + * } + * + * XEmacPs_BdRingFree(MyRingPtr, NumBd, MyBdSet); // Return list + * } + * </pre> + * + * A more advanced use of this function may allocate multiple sets of BDs. + * They must be retrieved from hardware and freed in the correct sequence: + * <pre> + * // Legal + * XEmacPs_BdRingFromHwRx(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingFree(MyRingPtr, NumBd1, MySet1); + * + * // Legal + * XEmacPs_BdRingFromHwRx(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingFromHwRx(MyRingPtr, NumBd2, &MySet2); + * XEmacPs_BdRingFree(MyRingPtr, NumBd1, MySet1); + * XEmacPs_BdRingFree(MyRingPtr, NumBd2, MySet2); + * + * // Not legal + * XEmacPs_BdRingFromHwRx(MyRingPtr, NumBd1, &MySet1); + * XEmacPs_BdRingFromHwRx(MyRingPtr, NumBd2, &MySet2); + * XEmacPs_BdRingFree(MyRingPtr, NumBd2, MySet2); + * XEmacPs_BdRingFree(MyRingPtr, NumBd1, MySet1); + * </pre> + * + * If hardware has only partially completed a packet spanning multiple BDs, + * then none of the BDs for that packet will be included in the results. + * + * @param RingPtr is a pointer to the instance to be worked on. + * @param BdLimit is the maximum number of BDs to return in the set. + * @param BdSetPtr is an output parameter, it points to the first BD available + * for examination. + * + * @return + * The number of BDs processed by hardware. A value of 0 indicates that no + * data is available. No more than BdLimit BDs will be returned. + * + * @note Treat BDs returned by this function as read-only. + * + * @note This function should not be preempted by another XEmacPs_Bd function + * call that modifies the BD space. It is the caller's responsibility to + * provide a mutual exclusion mechanism. + * + *****************************************************************************/ +unsigned XEmacPs_BdRingFromHwRx(XEmacPs_BdRing * RingPtr, unsigned BdLimit, + XEmacPs_Bd ** BdSetPtr) +{ + XEmacPs_Bd *CurBdPtr; + u32 BdStr = 0; + unsigned BdCount; + unsigned BdPartialCount; + + CurBdPtr = RingPtr->HwHead; + BdCount = 0; + BdPartialCount = 0; + + /* If no BDs in work group, then there's nothing to search */ + if (RingPtr->HwCnt == 0) { + *BdSetPtr = NULL; + return (0); + } + + /* Starting at HwHead, keep moving forward in the list until: + * - A BD is encountered with its new/used bit set which means + * hardware has completed processing of that BD. + * - RingPtr->HwTail is reached and RingPtr->HwCnt is reached. + * - The number of requested BDs has been processed + */ + while (BdCount < BdLimit) { + + /* Read the status */ + BdStr = XEmacPs_BdRead(CurBdPtr, XEMACPS_BD_STAT_OFFSET); + + if (!(XEmacPs_BdIsRxNew(CurBdPtr))) { + break; + } + + BdCount++; + + /* hardware has processed this BD so check the "last" bit. If + * it is clear, then there are more BDs for the current packet. + * Keep a count of these partial packet BDs. + */ + if (BdStr & XEMACPS_RXBUF_EOF_MASK) { + BdPartialCount = 0; + } + else { + BdPartialCount++; + } + + /* Move on to next BD in work group */ + CurBdPtr = XEmacPs_BdRingNext(RingPtr, CurBdPtr); + } + + /* Subtract off any partial packet BDs found */ + BdCount -= BdPartialCount; + + /* If BdCount is non-zero then BDs were found to return. Set return + * parameters, update pointers and counters, return success + */ + if (BdCount > 0) { + *BdSetPtr = RingPtr->HwHead; + RingPtr->HwCnt -= BdCount; + RingPtr->PostCnt += BdCount; + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->HwHead, BdCount); + return (BdCount); + } + else { + *BdSetPtr = NULL; + return (0); + } +} + + +/*****************************************************************************/ +/** + * Frees a set of BDs that had been previously retrieved with + * XEmacPs_BdRingFromHw(). + * + * @param RingPtr is a pointer to the instance to be worked on. + * @param NumBd is the number of BDs to free. + * @param BdSetPtr is the head of a list of BDs returned by + * XEmacPs_BdRingFromHw(). + * + * @return + * - XST_SUCCESS if the set of BDs was freed. + * - XST_DMA_SG_LIST_ERROR if this function was called out of sequence with + * XEmacPs_BdRingFromHw(). + * + * @note This function should not be preempted by another XEmacPs_Bd function + * call that modifies the BD space. It is the caller's responsibility to + * provide a mutual exclusion mechanism. + * + *****************************************************************************/ +int XEmacPs_BdRingFree(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr) +{ + /* if no bds to process, simply return. */ + if (0 == NumBd) + return (XST_SUCCESS); + + /* Make sure we are in sync with XEmacPs_BdRingFromHw() */ + if ((RingPtr->PostCnt < NumBd) || (RingPtr->PostHead != BdSetPtr)) { + return (XST_DMA_SG_LIST_ERROR); + } + + /* Update pointers and counters */ + RingPtr->FreeCnt += NumBd; + RingPtr->PostCnt -= NumBd; + XEMACPS_RING_SEEKAHEAD(RingPtr, RingPtr->PostHead, NumBd); + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Check the internal data structures of the BD ring for the provided channel. + * The following checks are made: + * + * - Is the BD ring linked correctly in physical address space. + * - Do the internal pointers point to BDs in the ring. + * - Do the internal counters add up. + * + * The channel should be stopped prior to calling this function. + * + * @param RingPtr is a pointer to the instance to be worked on. + * @param Direction is either XEMACPS_SEND or XEMACPS_RECV that indicates + * which direction. + * + * @return + * - XST_SUCCESS if the set of BDs was freed. + * - XST_DMA_SG_NO_LIST if the list has not been created. + * - XST_IS_STARTED if the channel is not stopped. + * - XST_DMA_SG_LIST_ERROR if a problem is found with the internal data + * structures. If this value is returned, the channel should be reset to + * avoid data corruption or system instability. + * + * @note This function should not be preempted by another XEmacPs_Bd function + * call that modifies the BD space. It is the caller's responsibility to + * provide a mutual exclusion mechanism. + * + *****************************************************************************/ +int XEmacPs_BdRingCheck(XEmacPs_BdRing * RingPtr, u8 Direction) +{ + u32 AddrV, AddrP; + unsigned i; + + if ((Direction != XEMACPS_SEND) && (Direction != XEMACPS_RECV)) { + return (XST_INVALID_PARAM); + } + + /* Is the list created */ + if (RingPtr->AllCnt == 0) { + return (XST_DMA_SG_NO_LIST); + } + + /* Can't check if channel is running */ + if (RingPtr->RunState == XST_DMA_SG_IS_STARTED) { + return (XST_IS_STARTED); + } + + /* RunState doesn't make sense */ + else if (RingPtr->RunState != XST_DMA_SG_IS_STOPPED) { + return (XST_DMA_SG_LIST_ERROR); + } + + /* Verify internal pointers point to correct memory space */ + AddrV = (u32) RingPtr->FreeHead; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (XST_DMA_SG_LIST_ERROR); + } + + AddrV = (u32) RingPtr->PreHead; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (XST_DMA_SG_LIST_ERROR); + } + + AddrV = (u32) RingPtr->HwHead; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (XST_DMA_SG_LIST_ERROR); + } + + AddrV = (u32) RingPtr->HwTail; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (XST_DMA_SG_LIST_ERROR); + } + + AddrV = (u32) RingPtr->PostHead; + if ((AddrV < RingPtr->BaseBdAddr) || (AddrV > RingPtr->HighBdAddr)) { + return (XST_DMA_SG_LIST_ERROR); + } + + /* Verify internal counters add up */ + if ((RingPtr->HwCnt + RingPtr->PreCnt + RingPtr->FreeCnt + + RingPtr->PostCnt) != RingPtr->AllCnt) { + return (XST_DMA_SG_LIST_ERROR); + } + + /* Verify BDs are linked correctly */ + AddrV = RingPtr->BaseBdAddr; + AddrP = RingPtr->PhysBaseAddr + RingPtr->Separation; + + for (i = 1; i < RingPtr->AllCnt; i++) { + /* Check BDA for this BD. It should point to next physical addr */ + if (XEmacPs_BdRead(AddrV, XEMACPS_BD_ADDR_OFFSET) != AddrP) { + return (XST_DMA_SG_LIST_ERROR); + } + + /* Move on to next BD */ + AddrV += RingPtr->Separation; + AddrP += RingPtr->Separation; + } + + /* Last BD should have wrap bit set */ + if (XEMACPS_SEND == Direction) { + if (!XEmacPs_BdIsTxWrap(AddrV)) { + return (XST_DMA_SG_LIST_ERROR); + } + } + else { /* XEMACPS_RECV */ + if (!XEmacPs_BdIsRxWrap(AddrV)) { + return (XST_DMA_SG_LIST_ERROR); + } + } + + /* No problems found */ + return (XST_SUCCESS); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bdring.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bdring.h new file mode 100755 index 000000000..9c50d618e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_bdring.h @@ -0,0 +1,242 @@ +/* $Id: xemacps_bdring.h,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_bdring.h +* +* The Xiline EmacPs Buffer Descriptor ring driver. This is part of EmacPs +* DMA functionalities. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a wsy 01/10/10 First release +* </pre> +* +******************************************************************************/ + +#ifndef XEMACPS_BDRING_H /* prevent curcular inclusions */ +#define XEMACPS_BDRING_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/**************************** Type Definitions *******************************/ + +/** This is an internal structure used to maintain the DMA list */ +typedef struct { + u32 PhysBaseAddr;/**< Physical address of 1st BD in list */ + u32 BaseBdAddr; /**< Virtual address of 1st BD in list */ + u32 HighBdAddr; /**< Virtual address of last BD in the list */ + u32 Length; /**< Total size of ring in bytes */ + u32 RunState; /**< Flag to indicate DMA is started */ + u32 Separation; /**< Number of bytes between the starting address + of adjacent BDs */ + XEmacPs_Bd *FreeHead; + /**< First BD in the free group */ + XEmacPs_Bd *PreHead;/**< First BD in the pre-work group */ + XEmacPs_Bd *HwHead; /**< First BD in the work group */ + XEmacPs_Bd *HwTail; /**< Last BD in the work group */ + XEmacPs_Bd *PostHead; + /**< First BD in the post-work group */ + XEmacPs_Bd *BdaRestart; + /**< BDA to load when channel is started */ + unsigned HwCnt; /**< Number of BDs in work group */ + unsigned PreCnt; /**< Number of BDs in pre-work group */ + unsigned FreeCnt; /**< Number of allocatable BDs in the free group */ + unsigned PostCnt; /**< Number of BDs in post-work group */ + unsigned AllCnt; /**< Total Number of BDs for channel */ +} XEmacPs_BdRing; + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** +* Use this macro at initialization time to determine how many BDs will fit +* in a BD list within the given memory constraints. +* +* The results of this macro can be provided to XEmacPs_BdRingCreate(). +* +* @param Alignment specifies what byte alignment the BDs must fall on and +* must be a power of 2 to get an accurate calculation (32, 64, 128,...) +* @param Bytes is the number of bytes to be used to store BDs. +* +* @return Number of BDs that can fit in the given memory area +* +* @note +* C-style signature: +* u32 XEmacPs_BdRingCntCalc(u32 Alignment, u32 Bytes) +* +******************************************************************************/ +#define XEmacPs_BdRingCntCalc(Alignment, Bytes) \ + (u32)((Bytes) / ((sizeof(XEmacPs_Bd) + ((Alignment)-1)) & \ + ~((Alignment)-1))) + +/*****************************************************************************/ +/** +* Use this macro at initialization time to determine how many bytes of memory +* is required to contain a given number of BDs at a given alignment. +* +* @param Alignment specifies what byte alignment the BDs must fall on. This +* parameter must be a power of 2 to get an accurate calculation (32, 64, +* 128,...) +* @param NumBd is the number of BDs to calculate memory size requirements for +* +* @return The number of bytes of memory required to create a BD list with the +* given memory constraints. +* +* @note +* C-style signature: +* u32 XEmacPs_BdRingMemCalc(u32 Alignment, u32 NumBd) +* +******************************************************************************/ +#define XEmacPs_BdRingMemCalc(Alignment, NumBd) \ + (u32)((sizeof(XEmacPs_Bd) + ((Alignment)-1)) & \ + ~((Alignment)-1)) * (NumBd) + +/****************************************************************************/ +/** +* Return the total number of BDs allocated by this channel with +* XEmacPs_BdRingCreate(). +* +* @param RingPtr is the DMA channel to operate on. +* +* @return The total number of BDs allocated for this channel. +* +* @note +* C-style signature: +* u32 XEmacPs_BdRingGetCnt(XEmacPs_BdRing* RingPtr) +* +*****************************************************************************/ +#define XEmacPs_BdRingGetCnt(RingPtr) ((RingPtr)->AllCnt) + +/****************************************************************************/ +/** +* Return the number of BDs allocatable with XEmacPs_BdRingAlloc() for pre- +* processing. +* +* @param RingPtr is the DMA channel to operate on. +* +* @return The number of BDs currently allocatable. +* +* @note +* C-style signature: +* u32 XEmacPs_BdRingGetFreeCnt(XEmacPs_BdRing* RingPtr) +* +*****************************************************************************/ +#define XEmacPs_BdRingGetFreeCnt(RingPtr) ((RingPtr)->FreeCnt) + +/****************************************************************************/ +/** +* Return the next BD from BdPtr in a list. +* +* @param RingPtr is the DMA channel to operate on. +* @param BdPtr is the BD to operate on. +* +* @return The next BD in the list relative to the BdPtr parameter. +* +* @note +* C-style signature: +* XEmacPs_Bd *XEmacPs_BdRingNext(XEmacPs_BdRing* RingPtr, +* XEmacPs_Bd *BdPtr) +* +*****************************************************************************/ +#define XEmacPs_BdRingNext(RingPtr, BdPtr) \ + (((u32)(BdPtr) >= (RingPtr)->HighBdAddr) ? \ + (XEmacPs_Bd*)(RingPtr)->BaseBdAddr : \ + (XEmacPs_Bd*)((u32)(BdPtr) + (RingPtr)->Separation)) + +/****************************************************************************/ +/** +* Return the previous BD from BdPtr in the list. +* +* @param RingPtr is the DMA channel to operate on. +* @param BdPtr is the BD to operate on +* +* @return The previous BD in the list relative to the BdPtr parameter. +* +* @note +* C-style signature: +* XEmacPs_Bd *XEmacPs_BdRingPrev(XEmacPs_BdRing* RingPtr, +* XEmacPs_Bd *BdPtr) +* +*****************************************************************************/ +#define XEmacPs_BdRingPrev(RingPtr, BdPtr) \ + (((u32)(BdPtr) <= (RingPtr)->BaseBdAddr) ? \ + (XEmacPs_Bd*)(RingPtr)->HighBdAddr : \ + (XEmacPs_Bd*)((u32)(BdPtr) - (RingPtr)->Separation)) + +/************************** Function Prototypes ******************************/ + +/* + * Scatter gather DMA related functions in xemacps_bdring.c + */ +int XEmacPs_BdRingCreate(XEmacPs_BdRing * RingPtr, u32 PhysAddr, + u32 VirtAddr, u32 Alignment, unsigned BdCount); +int XEmacPs_BdRingClone(XEmacPs_BdRing * RingPtr, XEmacPs_Bd * SrcBdPtr, + u8 Direction); +int XEmacPs_BdRingAlloc(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd ** BdSetPtr); +int XEmacPs_BdRingUnAlloc(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr); +int XEmacPs_BdRingToHw(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr); +int XEmacPs_BdRingFree(XEmacPs_BdRing * RingPtr, unsigned NumBd, + XEmacPs_Bd * BdSetPtr); +unsigned XEmacPs_BdRingFromHwTx(XEmacPs_BdRing * RingPtr, unsigned BdLimit, + XEmacPs_Bd ** BdSetPtr); +unsigned XEmacPs_BdRingFromHwRx(XEmacPs_BdRing * RingPtr, unsigned BdLimit, + XEmacPs_Bd ** BdSetPtr); +int XEmacPs_BdRingCheck(XEmacPs_BdRing * RingPtr, u8 Direction); + +#ifdef __cplusplus +} +#endif + + +#endif /* end of protection macros */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_control.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_control.c new file mode 100755 index 000000000..2daf8adc3 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_control.c @@ -0,0 +1,1084 @@ +/* $Id: xemacps_control.c,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2009-2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xemacps_control.c + * + * Functions in this file implement general purpose command and control related + * functionality. See xemacps.h for a detailed description of the driver. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ------------------------------------------------------- + * 1.00a wsy 01/10/10 First release + * 1.02a asa 11/05/12 Added a new API for deleting an entry from the HASH + * register. Added a new API for setting the BURST length + * in DMACR register. + * </pre> + *****************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xemacps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** + * Set the MAC address for this driver/device. The address is a 48-bit value. + * The device must be stopped before calling this function. + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param AddressPtr is a pointer to a 6-byte MAC address. + * @param Index is a index to which MAC (1-4) address. + * + * @return + * - XST_SUCCESS if the MAC address was set successfully + * - XST_DEVICE_IS_STARTED if the device has not yet been stopped + * + *****************************************************************************/ +int XEmacPs_SetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index) +{ + u32 MacAddr; + u8 *Aptr = (u8 *) AddressPtr; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(AddressPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((Index <= XEMACPS_MAX_MAC_ADDR) && (Index > 0)); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return (XST_DEVICE_IS_STARTED); + } + + /* Index ranges 1 to 4, for offset calculation is 0 to 3. */ + Index--; + + /* Set the MAC bits [31:0] in BOT */ + MacAddr = Aptr[0]; + MacAddr |= Aptr[1] << 8; + MacAddr |= Aptr[2] << 16; + MacAddr |= Aptr[3] << 24; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + (XEMACPS_LADDR1L_OFFSET + Index * 8), MacAddr); + + /* There are reserved bits in TOP so don't affect them */ + MacAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + (XEMACPS_LADDR1H_OFFSET + (Index * 8))); + + MacAddr &= ~XEMACPS_LADDR_MACH_MASK; + + /* Set MAC bits [47:32] in TOP */ + MacAddr |= Aptr[4]; + MacAddr |= Aptr[5] << 8; + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + (XEMACPS_LADDR1H_OFFSET + (Index * 8)), MacAddr); + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Get the MAC address for this driver/device. + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param AddressPtr is an output parameter, and is a pointer to a buffer into + * which the current MAC address will be copied. + * @param Index is a index to which MAC (1-4) address. + * + *****************************************************************************/ +void XEmacPs_GetMacAddress(XEmacPs *InstancePtr, void *AddressPtr, u8 Index) +{ + u32 MacAddr; + u8 *Aptr = (u8 *) AddressPtr; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(AddressPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((Index <= XEMACPS_MAX_MAC_ADDR) && (Index > 0)); + + /* Index ranges 1 to 4, for offset calculation is 0 to 3. */ + Index--; + + MacAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + (XEMACPS_LADDR1L_OFFSET + (Index * 8))); + Aptr[0] = (u8) MacAddr; + Aptr[1] = (u8) (MacAddr >> 8); + Aptr[2] = (u8) (MacAddr >> 16); + Aptr[3] = (u8) (MacAddr >> 24); + + /* Read MAC bits [47:32] in TOP */ + MacAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + (XEMACPS_LADDR1H_OFFSET + (Index * 8))); + Aptr[4] = (u8) MacAddr; + Aptr[5] = (u8) (MacAddr >> 8); +} + + +/*****************************************************************************/ +/** + * Set 48-bit MAC addresses in hash table. + * The device must be stopped before calling this function. + * + * The hash address register is 64 bits long and takes up two locations in + * the memory map. The least significant bits are stored in hash register + * bottom and the most significant bits in hash register top. + * + * The unicast hash enable and the multicast hash enable bits in the network + * configuration register enable the reception of hash matched frames. The + * destination address is reduced to a 6 bit index into the 64 bit hash + * register using the following hash function. The hash function is an XOR + * of every sixth bit of the destination address. + * + * <pre> + * hash_index[05] = da[05]^da[11]^da[17]^da[23]^da[29]^da[35]^da[41]^da[47] + * hash_index[04] = da[04]^da[10]^da[16]^da[22]^da[28]^da[34]^da[40]^da[46] + * hash_index[03] = da[03]^da[09]^da[15]^da[21]^da[27]^da[33]^da[39]^da[45] + * hash_index[02] = da[02]^da[08]^da[14]^da[20]^da[26]^da[32]^da[38]^da[44] + * hash_index[01] = da[01]^da[07]^da[13]^da[19]^da[25]^da[31]^da[37]^da[43] + * hash_index[00] = da[00]^da[06]^da[12]^da[18]^da[24]^da[30]^da[36]^da[42] + * </pre> + * + * da[0] represents the least significant bit of the first byte received, + * that is, the multicast/unicast indicator, and da[47] represents the most + * significant bit of the last byte received. + * + * If the hash index points to a bit that is set in the hash register then + * the frame will be matched according to whether the frame is multicast + * or unicast. + * + * A multicast match will be signaled if the multicast hash enable bit is + * set, da[0] is logic 1 and the hash index points to a bit set in the hash + * register. + * + * A unicast match will be signaled if the unicast hash enable bit is set, + * da[0] is logic 0 and the hash index points to a bit set in the hash + * register. + * + * To receive all multicast frames, the hash register should be set with + * all ones and the multicast hash enable bit should be set in the network + * configuration register. + * + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param AddressPtr is a pointer to a 6-byte MAC address. + * + * @return + * - XST_SUCCESS if the HASH MAC address was set successfully + * - XST_DEVICE_IS_STARTED if the device has not yet been stopped + * - XST_INVALID_PARAM if the HASH MAC address passed in does not meet + * requirement after calculation + * + * @note + * Having Aptr be unsigned type prevents the following operations from sign + * extending. + *****************************************************************************/ +int XEmacPs_SetHash(XEmacPs *InstancePtr, void *AddressPtr) +{ + u32 HashAddr; + u8 *Aptr = (u8 *) AddressPtr; + u8 Temp1, Temp2, Temp3, Temp4, Temp5, Temp6, Temp7, Temp8; + int Result; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(AddressPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return (XST_DEVICE_IS_STARTED); + } + Temp1 = Aptr[0] & 0x3F; + Temp2 = ((Aptr[0] >> 6) & 0x3) | ((Aptr[1] & 0xF) << 2); + Temp3 = ((Aptr[1] >> 4) & 0xF) | ((Aptr[2] & 0x3) << 4); + Temp4 = ((Aptr[2] >> 2) & 0x3F); + Temp5 = Aptr[3] & 0x3F; + Temp6 = ((Aptr[3] >> 6) & 0x3) | ((Aptr[4] & 0xF) << 2); + Temp7 = ((Aptr[4] >> 4) & 0xF) | ((Aptr[5] & 0x3) << 4); + Temp8 = ((Aptr[5] >> 2) & 0x3F); + + Result = Temp1 ^ Temp2 ^ Temp3 ^ Temp4 ^ Temp5 ^ Temp6 ^ Temp7 ^ Temp8; + + if (Result >= XEMACPS_MAX_HASH_BITS) { + return (XST_INVALID_PARAM); + } + + if (Result < 32) { + HashAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET); + HashAddr |= (1 << Result); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET, HashAddr); + } else { + HashAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET); + HashAddr |= (1 << (Result - 32)); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET, HashAddr); + } + + return (XST_SUCCESS); +} + +/*****************************************************************************/ +/** + * Delete 48-bit MAC addresses in hash table. + * The device must be stopped before calling this function. + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param AddressPtr is a pointer to a 6-byte MAC address. + * + * @return + * - XST_SUCCESS if the HASH MAC address was deleted successfully + * - XST_DEVICE_IS_STARTED if the device has not yet been stopped + * - XST_INVALID_PARAM if the HASH MAC address passed in does not meet + * requirement after calculation + * + * @note + * Having Aptr be unsigned type prevents the following operations from sign + * extending. + *****************************************************************************/ +int XEmacPs_DeleteHash(XEmacPs *InstancePtr, void *AddressPtr) +{ + u32 HashAddr; + u8 *Aptr = (u8 *) AddressPtr; + u8 Temp1, Temp2, Temp3, Temp4, Temp5, Temp6, Temp7, Temp8; + int Result; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(AddressPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return (XST_DEVICE_IS_STARTED); + } + Temp1 = Aptr[0] & 0x3F; + Temp2 = ((Aptr[0] >> 6) & 0x3) | ((Aptr[1] & 0xF) << 2); + Temp3 = ((Aptr[1] >> 4) & 0xF) | ((Aptr[2] & 0x3) << 4); + Temp4 = ((Aptr[2] >> 2) & 0x3F); + Temp5 = Aptr[3] & 0x3F; + Temp6 = ((Aptr[3] >> 6) & 0x3) | ((Aptr[4] & 0xF) << 2); + Temp7 = ((Aptr[4] >> 4) & 0xF) | ((Aptr[5] & 0x3) << 4); + Temp8 = ((Aptr[5] >> 2) & 0x3F); + + Result = Temp1 ^ Temp2 ^ Temp3 ^ Temp4 ^ Temp5 ^ Temp6 ^ Temp7 ^ Temp8; + + if (Result >= XEMACPS_MAX_HASH_BITS) { + return (XST_INVALID_PARAM); + } + + if (Result < 32) { + HashAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET); + HashAddr &= (~(1 << Result)); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET, HashAddr); + } else { + HashAddr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET); + HashAddr &= (~(1 << (Result - 32))); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET, HashAddr); + } + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Clear the Hash registers for the mac address pointed by AddressPtr. + * + * @param InstancePtr is a pointer to the instance to be worked on. + * + *****************************************************************************/ +void XEmacPs_ClearHash(XEmacPs *InstancePtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET, 0x0); + + /* write bits [63:32] in TOP */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET, 0x0); +} + + +/*****************************************************************************/ +/** + * Get the Hash address for this driver/device. + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param AddressPtr is an output parameter, and is a pointer to a buffer into + * which the current HASH MAC address will be copied. + * + *****************************************************************************/ +void XEmacPs_GetHash(XEmacPs *InstancePtr, void *AddressPtr) +{ + u32 *Aptr = (u32 *) AddressPtr; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(AddressPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + Aptr[0] = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHL_OFFSET); + + /* Read Hash bits [63:32] in TOP */ + Aptr[1] = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_HASHH_OFFSET); +} + + +/*****************************************************************************/ +/** + * Set the Type ID match for this driver/device. The register is a 32-bit + * value. The device must be stopped before calling this function. + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param Id_Check is type ID to be configured. + * @param Index is a index to which Type ID (1-4). + * + * @return + * - XST_SUCCESS if the MAC address was set successfully + * - XST_DEVICE_IS_STARTED if the device has not yet been stopped + * + *****************************************************************************/ +int XEmacPs_SetTypeIdCheck(XEmacPs *InstancePtr, u32 Id_Check, u8 Index) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((Index <= XEMACPS_MAX_TYPE_ID) && (Index > 0)); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return (XST_DEVICE_IS_STARTED); + } + + /* Index ranges 1 to 4, for offset calculation is 0 to 3. */ + Index--; + + /* Set the ID bits in MATCHx register */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + (XEMACPS_MATCH1_OFFSET + (Index * 4)), Id_Check); + + return (XST_SUCCESS); +} + +/*****************************************************************************/ +/** + * Set options for the driver/device. The driver should be stopped with + * XEmacPs_Stop() before changing options. + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param Options are the options to set. Multiple options can be set by OR'ing + * XTE_*_OPTIONS constants together. Options not specified are not + * affected. + * + * @return + * - XST_SUCCESS if the options were set successfully + * - XST_DEVICE_IS_STARTED if the device has not yet been stopped + * + * @note + * See xemacps.h for a description of the available options. + * + *****************************************************************************/ +int XEmacPs_SetOptions(XEmacPs *InstancePtr, u32 Options) +{ + u32 Reg; /* Generic register contents */ + u32 RegNetCfg; /* Reflects original contents of NET_CONFIG */ + u32 RegNewNetCfg; /* Reflects new contents of NET_CONFIG */ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return (XST_DEVICE_IS_STARTED); + } + + /* Many of these options will change the NET_CONFIG registers. + * To reduce the amount of IO to the device, group these options here + * and change them all at once. + */ + + /* Grab current register contents */ + RegNetCfg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET); + RegNewNetCfg = RegNetCfg; + + /* + * It is configured to max 1536. + */ + if (Options & XEMACPS_FRAME1536_OPTION) { + RegNewNetCfg |= (XEMACPS_NWCFG_1536RXEN_MASK); + } + + /* Turn on VLAN packet only, only VLAN tagged will be accepted */ + if (Options & XEMACPS_VLAN_OPTION) { + RegNewNetCfg |= XEMACPS_NWCFG_NVLANDISC_MASK; + } + + /* Turn on FCS stripping on receive packets */ + if (Options & XEMACPS_FCS_STRIP_OPTION) { + RegNewNetCfg |= XEMACPS_NWCFG_FCSREM_MASK; + } + + /* Turn on length/type field checking on receive packets */ + if (Options & XEMACPS_LENTYPE_ERR_OPTION) { + RegNewNetCfg |= XEMACPS_NWCFG_LENGTHERRDSCRD_MASK; + } + + /* Turn on flow control */ + if (Options & XEMACPS_FLOW_CONTROL_OPTION) { + RegNewNetCfg |= XEMACPS_NWCFG_PAUSEEN_MASK; + } + + /* Turn on promiscuous frame filtering (all frames are received) */ + if (Options & XEMACPS_PROMISC_OPTION) { + RegNewNetCfg |= XEMACPS_NWCFG_COPYALLEN_MASK; + } + + /* Allow broadcast address reception */ + if (Options & XEMACPS_BROADCAST_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_BCASTDI_MASK; + } + + /* Allow multicast address filtering */ + if (Options & XEMACPS_MULTICAST_OPTION) { + RegNewNetCfg |= XEMACPS_NWCFG_MCASTHASHEN_MASK; + } + + /* enable RX checksum offload */ + if (Options & XEMACPS_RX_CHKSUM_ENABLE_OPTION) { + RegNewNetCfg |= XEMACPS_NWCFG_RXCHKSUMEN_MASK; + } + + /* Officially change the NET_CONFIG registers if it needs to be + * modified. + */ + if (RegNetCfg != RegNewNetCfg) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET, RegNewNetCfg); + } + + /* Enable TX checksum offload */ + if (Options & XEMACPS_TX_CHKSUM_ENABLE_OPTION) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET); + Reg |= XEMACPS_DMACR_TCPCKSUM_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET, Reg); + } + + /* Enable transmitter */ + if (Options & XEMACPS_TRANSMITTER_ENABLE_OPTION) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg |= XEMACPS_NWCTRL_TXEN_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + } + + /* Enable receiver */ + if (Options & XEMACPS_RECEIVER_ENABLE_OPTION) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg |= XEMACPS_NWCTRL_RXEN_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + } + + /* The remaining options not handled here are managed elsewhere in the + * driver. No register modifications are needed at this time. Reflecting + * the option in InstancePtr->Options is good enough for now. + */ + + /* Set options word to its new value */ + InstancePtr->Options |= Options; + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Clear options for the driver/device + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param Options are the options to clear. Multiple options can be cleared by + * OR'ing XEMACPS_*_OPTIONS constants together. Options not specified + * are not affected. + * + * @return + * - XST_SUCCESS if the options were set successfully + * - XST_DEVICE_IS_STARTED if the device has not yet been stopped + * + * @note + * See xemacps.h for a description of the available options. + * + *****************************************************************************/ +int XEmacPs_ClearOptions(XEmacPs *InstancePtr, u32 Options) +{ + u32 Reg; /* Generic */ + u32 RegNetCfg; /* Reflects original contents of NET_CONFIG */ + u32 RegNewNetCfg; /* Reflects new contents of NET_CONFIG */ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Be sure device has been stopped */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return (XST_DEVICE_IS_STARTED); + } + + /* Many of these options will change the NET_CONFIG registers. + * To reduce the amount of IO to the device, group these options here + * and change them all at once. + */ + + /* Grab current register contents */ + RegNetCfg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET); + RegNewNetCfg = RegNetCfg; + + /* There is only RX configuration!? + * It is configured in two different length, upto 1536 and 10240 bytes + */ + if (Options & XEMACPS_FRAME1536_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_1536RXEN_MASK; + } + + /* Turn off VLAN packet only */ + if (Options & XEMACPS_VLAN_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_NVLANDISC_MASK; + } + + /* Turn off FCS stripping on receive packets */ + if (Options & XEMACPS_FCS_STRIP_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_FCSREM_MASK; + } + + /* Turn off length/type field checking on receive packets */ + if (Options & XEMACPS_LENTYPE_ERR_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_LENGTHERRDSCRD_MASK; + } + + /* Turn off flow control */ + if (Options & XEMACPS_FLOW_CONTROL_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_PAUSEEN_MASK; + } + + /* Turn off promiscuous frame filtering (all frames are received) */ + if (Options & XEMACPS_PROMISC_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_COPYALLEN_MASK; + } + + /* Disallow broadcast address filtering => broadcast reception */ + if (Options & XEMACPS_BROADCAST_OPTION) { + RegNewNetCfg |= XEMACPS_NWCFG_BCASTDI_MASK; + } + + /* Disallow multicast address filtering */ + if (Options & XEMACPS_MULTICAST_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_MCASTHASHEN_MASK; + } + + /* Disable RX checksum offload */ + if (Options & XEMACPS_RX_CHKSUM_ENABLE_OPTION) { + RegNewNetCfg &= ~XEMACPS_NWCFG_RXCHKSUMEN_MASK; + } + + /* Officially change the NET_CONFIG registers if it needs to be + * modified. + */ + if (RegNetCfg != RegNewNetCfg) { + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET, RegNewNetCfg); + } + + /* Disable TX checksum offload */ + if (Options & XEMACPS_TX_CHKSUM_ENABLE_OPTION) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET); + Reg &= ~XEMACPS_DMACR_TCPCKSUM_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET, Reg); + } + + /* Disable transmitter */ + if (Options & XEMACPS_TRANSMITTER_ENABLE_OPTION) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg &= ~XEMACPS_NWCTRL_TXEN_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + } + + /* Disable receiver */ + if (Options & XEMACPS_RECEIVER_ENABLE_OPTION) { + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg &= ~XEMACPS_NWCTRL_RXEN_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + } + + /* The remaining options not handled here are managed elsewhere in the + * driver. No register modifications are needed at this time. Reflecting + * option in InstancePtr->Options is good enough for now. + */ + + /* Set options word to its new value */ + InstancePtr->Options &= ~Options; + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** + * Get current option settings + * + * @param InstancePtr is a pointer to the instance to be worked on. + * + * @return + * A bitmask of XTE_*_OPTION constants. Any bit set to 1 is to be interpreted + * as a set opion. + * + * @note + * See xemacps.h for a description of the available options. + * + *****************************************************************************/ +u32 XEmacPs_GetOptions(XEmacPs *InstancePtr) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return (InstancePtr->Options); +} + + +/*****************************************************************************/ +/** + * Send a pause packet + * + * @param InstancePtr is a pointer to the instance to be worked on. + * + * @return + * - XST_SUCCESS if pause frame transmission was initiated + * - XST_DEVICE_IS_STOPPED if the device has not been started. + * + *****************************************************************************/ +int XEmacPs_SendPausePacket(XEmacPs *InstancePtr) +{ + u32 Reg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Make sure device is ready for this operation */ + if (InstancePtr->IsStarted != XIL_COMPONENT_IS_STARTED) { + return (XST_DEVICE_IS_STOPPED); + } + + /* Send flow control frame */ + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + Reg |= XEMACPS_NWCTRL_PAUSETX_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, Reg); + return (XST_SUCCESS); +} + +/*****************************************************************************/ +/** + * XEmacPs_GetOperatingSpeed gets the current operating link speed. This may + * be the value set by XEmacPs_SetOperatingSpeed() or a hardware default. + * + * @param InstancePtr references the TEMAC channel on which to operate. + * + * @return XEmacPs_GetOperatingSpeed returns the link speed in units of + * megabits per second. + * + * @note + * + *****************************************************************************/ +u16 XEmacPs_GetOperatingSpeed(XEmacPs *InstancePtr) +{ + u32 Reg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET); + + if (Reg & XEMACPS_NWCFG_1000_MASK) { + return (1000); + } else { + if (Reg & XEMACPS_NWCFG_100_MASK) { + return (100); + } else { + return (10); + } + } +} + + +/*****************************************************************************/ +/** + * XEmacPs_SetOperatingSpeed sets the current operating link speed. For any + * traffic to be passed, this speed must match the current MII/GMII/SGMII/RGMII + * link speed. + * + * @param InstancePtr references the TEMAC channel on which to operate. + * @param Speed is the speed to set in units of Mbps. Valid values are 10, 100, + * or 1000. XEmacPs_SetOperatingSpeed ignores invalid values. + * + * @note + * + *****************************************************************************/ +void XEmacPs_SetOperatingSpeed(XEmacPs *InstancePtr, u16 Speed) +{ + u32 Reg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((Speed == 10) || (Speed == 100) || (Speed == 1000)); + + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET); + Reg &= ~(XEMACPS_NWCFG_1000_MASK | XEMACPS_NWCFG_100_MASK); + + switch (Speed) { + case 10: + break; + + case 100: + Reg |= XEMACPS_NWCFG_100_MASK; + break; + + case 1000: + Reg |= XEMACPS_NWCFG_1000_MASK; + break; + + default: + return; + } + + /* Set register and return */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET, Reg); +} + + +/*****************************************************************************/ +/** + * Set the MDIO clock divisor. + * + * Calculating the divisor: + * + * <pre> + * f[HOSTCLK] + * f[MDC] = ----------------- + * (1 + Divisor) * 2 + * </pre> + * + * where f[HOSTCLK] is the bus clock frequency in MHz, and f[MDC] is the + * MDIO clock frequency in MHz to the PHY. Typically, f[MDC] should not + * exceed 2.5 MHz. Some PHYs can tolerate faster speeds which means faster + * access. Here is the table to show values to generate MDC, + * + * <pre> + * 000 : divide pclk by 8 (pclk up to 20 MHz) + * 001 : divide pclk by 16 (pclk up to 40 MHz) + * 010 : divide pclk by 32 (pclk up to 80 MHz) + * 011 : divide pclk by 48 (pclk up to 120 MHz) + * 100 : divide pclk by 64 (pclk up to 160 MHz) + * 101 : divide pclk by 96 (pclk up to 240 MHz) + * 110 : divide pclk by 128 (pclk up to 320 MHz) + * 111 : divide pclk by 224 (pclk up to 540 MHz) + * </pre> + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param Divisor is the divisor to set. Range is 0b000 to 0b111. + * + *****************************************************************************/ +void XEmacPs_SetMdioDivisor(XEmacPs *InstancePtr, XEmacPs_MdcDiv Divisor) +{ + u32 Reg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Divisor <= 0x7); /* only last three bits are valid */ + + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET); + /* clear these three bits, could be done with mask */ + Reg &= ~XEMACPS_NWCFG_MDCCLKDIV_MASK; + + Reg |= (Divisor << XEMACPS_NWCFG_MDC_SHIFT_MASK); + + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCFG_OFFSET, Reg); + +} + + +/*****************************************************************************/ +/** +* Read the current value of the PHY register indicated by the PhyAddress and +* the RegisterNum parameters. The MAC provides the driver with the ability to +* talk to a PHY that adheres to the Media Independent Interface (MII) as +* defined in the IEEE 802.3 standard. +* +* Prior to PHY access with this function, the user should have setup the MDIO +* clock with XEmacPs_SetMdioDivisor(). +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* @param PhyAddress is the address of the PHY to be read (supports multiple +* PHYs) +* @param RegisterNum is the register number, 0-31, of the specific PHY register +* to read +* @param PhyDataPtr is an output parameter, and points to a 16-bit buffer into +* which the current value of the register will be copied. +* +* @return +* +* - XST_SUCCESS if the PHY was read from successfully +* - XST_EMAC_MII_BUSY if there is another PHY operation in progress +* +* @note +* +* This function is not thread-safe. The user must provide mutually exclusive +* access to this function if there are to be multiple threads that can call it. +* +* There is the possibility that this function will not return if the hardware +* is broken (i.e., it never sets the status bit indicating that the read is +* done). If this is of concern to the user, the user should provide a mechanism +* suitable to their needs for recovery. +* +* For the duration of this function, all host interface reads and writes are +* blocked to the current XEmacPs instance. +* +******************************************************************************/ +int XEmacPs_PhyRead(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 *PhyDataPtr) +{ + u32 Mgtcr; + volatile u32 Ipisr; + + Xil_AssertNonvoid(InstancePtr != NULL); + + /* Make sure no other PHY operation is currently in progress */ + if (!(XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWSR_OFFSET) & + XEMACPS_NWSR_MDIOIDLE_MASK)) { + return (XST_EMAC_MII_BUSY); + } + + /* Construct Mgtcr mask for the operation */ + Mgtcr = XEMACPS_PHYMNTNC_OP_MASK | XEMACPS_PHYMNTNC_OP_R_MASK | + (PhyAddress << XEMACPS_PHYMNTNC_PHYAD_SHIFT_MASK) | + (RegisterNum << XEMACPS_PHYMNTNC_PHREG_SHIFT_MASK); + + /* Write Mgtcr and wait for completion */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_PHYMNTNC_OFFSET, Mgtcr); + + do { + Ipisr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWSR_OFFSET); + } while ((Ipisr & XEMACPS_NWSR_MDIOIDLE_MASK) == 0); + + /* Read data */ + *PhyDataPtr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_PHYMNTNC_OFFSET); + + return (XST_SUCCESS); +} + + +/*****************************************************************************/ +/** +* Write data to the specified PHY register. The Ethernet driver does not +* require the device to be stopped before writing to the PHY. Although it is +* probably a good idea to stop the device, it is the responsibility of the +* application to deem this necessary. The MAC provides the driver with the +* ability to talk to a PHY that adheres to the Media Independent Interface +* (MII) as defined in the IEEE 802.3 standard. +* +* Prior to PHY access with this function, the user should have setup the MDIO +* clock with XEmacPs_SetMdioDivisor(). +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* @param PhyAddress is the address of the PHY to be written (supports multiple +* PHYs) +* @param RegisterNum is the register number, 0-31, of the specific PHY register +* to write +* @param PhyData is the 16-bit value that will be written to the register +* +* @return +* +* - XST_SUCCESS if the PHY was written to successfully. Since there is no error +* status from the MAC on a write, the user should read the PHY to verify the +* write was successful. +* - XST_EMAC_MII_BUSY if there is another PHY operation in progress +* +* @note +* +* This function is not thread-safe. The user must provide mutually exclusive +* access to this function if there are to be multiple threads that can call it. +* +* There is the possibility that this function will not return if the hardware +* is broken (i.e., it never sets the status bit indicating that the write is +* done). If this is of concern to the user, the user should provide a mechanism +* suitable to their needs for recovery. +* +* For the duration of this function, all host interface reads and writes are +* blocked to the current XEmacPs instance. +* +******************************************************************************/ +int XEmacPs_PhyWrite(XEmacPs *InstancePtr, u32 PhyAddress, + u32 RegisterNum, u16 PhyData) +{ + u32 Mgtcr; + volatile u32 Ipisr; + + Xil_AssertNonvoid(InstancePtr != NULL); + + /* Make sure no other PHY operation is currently in progress */ + if (!(XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWSR_OFFSET) & + XEMACPS_NWSR_MDIOIDLE_MASK)) { + return (XST_EMAC_MII_BUSY); + } + + /* Construct Mgtcr mask for the operation */ + Mgtcr = XEMACPS_PHYMNTNC_OP_MASK | XEMACPS_PHYMNTNC_OP_W_MASK | + (PhyAddress << XEMACPS_PHYMNTNC_PHYAD_SHIFT_MASK) | + (RegisterNum << XEMACPS_PHYMNTNC_PHREG_SHIFT_MASK) | PhyData; + + /* Write Mgtcr and wait for completion */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_PHYMNTNC_OFFSET, Mgtcr); + + do { + Ipisr = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWSR_OFFSET); + } while ((Ipisr & XEMACPS_NWSR_MDIOIDLE_MASK) == 0); + + return (XST_SUCCESS); +} + +/*****************************************************************************/ +/** +* API to update the Burst length in the DMACR register. +* +* @param InstancePtr is a pointer to the XEmacPs instance to be worked on. +* @param BLength is the length in bytes for the dma burst. +* +* @return None +* +******************************************************************************/ +void XEmacPs_DMABLengthUpdate(XEmacPs *InstancePtr, int BLength) +{ + u32 Reg; + u32 RegUpdateVal = 0; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid((BLength == XEMACPS_SINGLE_BURST) || + (BLength == XEMACPS_4BYTE_BURST) || + (BLength == XEMACPS_8BYTE_BURST) || + (BLength == XEMACPS_16BYTE_BURST)); + + switch (BLength) { + case XEMACPS_SINGLE_BURST: + RegUpdateVal = XEMACPS_DMACR_SINGLE_AHB_BURST; + break; + + case XEMACPS_4BYTE_BURST: + RegUpdateVal = XEMACPS_DMACR_INCR4_AHB_BURST; + break; + + case XEMACPS_8BYTE_BURST: + RegUpdateVal = XEMACPS_DMACR_INCR8_AHB_BURST; + break; + + case XEMACPS_16BYTE_BURST: + RegUpdateVal = XEMACPS_DMACR_INCR16_AHB_BURST; + break; + + default: + break; + } + Reg = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_DMACR_OFFSET); + + Reg &= (~XEMACPS_DMACR_BLENGTH_MASK); + Reg |= RegUpdateVal; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_DMACR_OFFSET, + Reg); +} \ No newline at end of file diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_g.c new file mode 100644 index 000000000..f06875cb1 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_g.c @@ -0,0 +1,30 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xemacps.h" + +/* +* The configuration table for devices +*/ + +XEmacPs_Config XEmacPs_ConfigTable[] = +{ + { + XPAR_PS7_ETHERNET_0_DEVICE_ID, + XPAR_PS7_ETHERNET_0_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_hw.c new file mode 100755 index 000000000..0b6f47154 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_hw.c @@ -0,0 +1,132 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_hw.c +* +* This file contains the implementation of the ethernet interface reset sequence +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.05a kpc 28/06/13 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xparameters.h" +#include "xemacps_hw.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* This function perform the reset sequence to the given emacps interface by +* configuring the appropriate control bits in the emacps specifc registers. +* the emacps reset squence involves the following steps +* Disable all the interuupts +* Clear the status registers +* Disable Rx and Tx engines +* Update the Tx and Rx descriptor queue registers with reset values +* Update the other relevant control registers with reset value +* +* @param BaseAddress of the interface +* +* @return N/A +* +* @note +* This function will not modify the slcr registers that are relavant for +* emacps controller +******************************************************************************/ +void XEmacPs_ResetHw(u32 BaseAddr) +{ + u32 RegVal = 0; + + /* Disable the interrupts */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_IDR_OFFSET,0x0); + + /* Stop transmission,disable loopback and Stop tx and Rx engines */ + RegVal = XEmacPs_ReadReg(BaseAddr,XEMACPS_NWCTRL_OFFSET); + RegVal &= ~(XEMACPS_NWCTRL_TXEN_MASK| + XEMACPS_NWCTRL_RXEN_MASK| + XEMACPS_NWCTRL_HALTTX_MASK| + XEMACPS_NWCTRL_LOOPEN_MASK); + /* Clear the statistic registers, flush the packets in DPRAM*/ + RegVal |= (XEMACPS_NWCTRL_STATCLR_MASK| + XEMACPS_NWCTRL_FLUSH_DPRAM_MASK); + XEmacPs_WriteReg(BaseAddr,XEMACPS_NWCTRL_OFFSET,RegVal); + /* Clear the interrupt status */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_ISR_OFFSET,XEMACPS_IXR_ALL_MASK); + /* Clear the tx status */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_TXSR_OFFSET,XEMACPS_TXSR_ERROR_MASK| + XEMACPS_TXSR_TXCOMPL_MASK| + XEMACPS_TXSR_TXGO_MASK); + /* Clear the rx status */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_RXSR_OFFSET, + XEMACPS_RXSR_FRAMERX_MASK); + /* Clear the tx base address */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_TXQBASE_OFFSET,0x0); + /* Clear the rx base address */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_RXQBASE_OFFSET,0x0); + /* Update the network config register with reset value */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_NWCFG_OFFSET,XEMACPS_NWCFG_RESET_MASK); + /* Update the hash address registers with reset value */ + XEmacPs_WriteReg(BaseAddr,XEMACPS_HASHL_OFFSET,0x0); + XEmacPs_WriteReg(BaseAddr,XEMACPS_HASHH_OFFSET,0x0); +} + + + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_hw.h new file mode 100755 index 000000000..4f81fc1a7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_hw.h @@ -0,0 +1,603 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_hw.h +* +* This header file contains identifiers and low-level driver functions (or +* macros) that can be used to access the PS Ethernet MAC (XEmacPs) device. +* High-level driver functions are defined in xemacps.h. +* +* @note +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a wsy 01/10/10 First release. +* 1.02a asa 11/05/12 Added hash defines for DMACR burst length configuration. +* 1.05a kpc 28/06/13 Added XEmacPs_ResetHw function prototype +* </pre> +* +******************************************************************************/ + +#ifndef XEMACPS_HW_H /* prevent circular inclusions */ +#define XEMACPS_HW_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +#define XEMACPS_MAX_MAC_ADDR 4 /**< Maxmum number of mac address + supported */ +#define XEMACPS_MAX_TYPE_ID 4 /**< Maxmum number of type id supported */ +#define XEMACPS_BD_ALIGNMENT 4 /**< Minimum buffer descriptor alignment + on the local bus */ +#define XEMACPS_RX_BUF_ALIGNMENT 4 /**< Minimum buffer alignment when using + options that impose alignment + restrictions on the buffer data on + the local bus */ + +/** @name Direction identifiers + * + * These are used by several functions and callbacks that need + * to specify whether an operation specifies a send or receive channel. + * @{ + */ +#define XEMACPS_SEND 1 /**< send direction */ +#define XEMACPS_RECV 2 /**< receive direction */ +/*@}*/ + +/** @name MDC clock division + * currently supporting 8, 16, 32, 48, 64, 96, 128, 224. + * @{ + */ +typedef enum { MDC_DIV_8 = 0, MDC_DIV_16, MDC_DIV_32, MDC_DIV_48, + MDC_DIV_64, MDC_DIV_96, MDC_DIV_128, MDC_DIV_224 +} XEmacPs_MdcDiv; + +/*@}*/ + +#define XEMACPS_RX_BUF_SIZE 1536 /**< Specify the receive buffer size in + bytes, 64, 128, ... 10240 */ +#define XEMACPS_RX_BUF_UNIT 64 /**< Number of receive buffer bytes as a + unit, this is HW setup */ + +#define XEMACPS_MAX_RXBD 128 /**< Size of RX buffer descriptor queues */ +#define XEMACPS_MAX_TXBD 128 /**< Size of TX buffer descriptor queues */ + +#define XEMACPS_MAX_HASH_BITS 64 /**< Maximum value for hash bits. 2**6 */ + +/* Register offset definitions. Unless otherwise noted, register access is + * 32 bit. Names are self explained here. + */ + +#define XEMACPS_NWCTRL_OFFSET 0x00000000 /**< Network Control reg */ +#define XEMACPS_NWCFG_OFFSET 0x00000004 /**< Network Config reg */ +#define XEMACPS_NWSR_OFFSET 0x00000008 /**< Network Status reg */ + +#define XEMACPS_DMACR_OFFSET 0x00000010 /**< DMA Control reg */ +#define XEMACPS_TXSR_OFFSET 0x00000014 /**< TX Status reg */ +#define XEMACPS_RXQBASE_OFFSET 0x00000018 /**< RX Q Base address reg */ +#define XEMACPS_TXQBASE_OFFSET 0x0000001C /**< TX Q Base address reg */ +#define XEMACPS_RXSR_OFFSET 0x00000020 /**< RX Status reg */ + +#define XEMACPS_ISR_OFFSET 0x00000024 /**< Interrupt Status reg */ +#define XEMACPS_IER_OFFSET 0x00000028 /**< Interrupt Enable reg */ +#define XEMACPS_IDR_OFFSET 0x0000002C /**< Interrupt Disable reg */ +#define XEMACPS_IMR_OFFSET 0x00000030 /**< Interrupt Mask reg */ + +#define XEMACPS_PHYMNTNC_OFFSET 0x00000034 /**< Phy Maintaince reg */ +#define XEMACPS_RXPAUSE_OFFSET 0x00000038 /**< RX Pause Time reg */ +#define XEMACPS_TXPAUSE_OFFSET 0x0000003C /**< TX Pause Time reg */ + +#define XEMACPS_HASHL_OFFSET 0x00000080 /**< Hash Low address reg */ +#define XEMACPS_HASHH_OFFSET 0x00000084 /**< Hash High address reg */ + +#define XEMACPS_LADDR1L_OFFSET 0x00000088 /**< Specific1 addr low reg */ +#define XEMACPS_LADDR1H_OFFSET 0x0000008C /**< Specific1 addr high reg */ +#define XEMACPS_LADDR2L_OFFSET 0x00000090 /**< Specific2 addr low reg */ +#define XEMACPS_LADDR2H_OFFSET 0x00000094 /**< Specific2 addr high reg */ +#define XEMACPS_LADDR3L_OFFSET 0x00000098 /**< Specific3 addr low reg */ +#define XEMACPS_LADDR3H_OFFSET 0x0000009C /**< Specific3 addr high reg */ +#define XEMACPS_LADDR4L_OFFSET 0x000000A0 /**< Specific4 addr low reg */ +#define XEMACPS_LADDR4H_OFFSET 0x000000A4 /**< Specific4 addr high reg */ + +#define XEMACPS_MATCH1_OFFSET 0x000000A8 /**< Type ID1 Match reg */ +#define XEMACPS_MATCH2_OFFSET 0x000000AC /**< Type ID2 Match reg */ +#define XEMACPS_MATCH3_OFFSET 0x000000B0 /**< Type ID3 Match reg */ +#define XEMACPS_MATCH4_OFFSET 0x000000B4 /**< Type ID4 Match reg */ + +#define XEMACPS_STRETCH_OFFSET 0x000000BC /**< IPG Stretch reg */ + +#define XEMACPS_OCTTXL_OFFSET 0x00000100 /**< Octects transmitted Low + reg */ +#define XEMACPS_OCTTXH_OFFSET 0x00000104 /**< Octects transmitted High + reg */ + +#define XEMACPS_TXCNT_OFFSET 0x00000108 /**< Error-free Frmaes + transmitted counter */ +#define XEMACPS_TXBCCNT_OFFSET 0x0000010C /**< Error-free Broadcast + Frames counter*/ +#define XEMACPS_TXMCCNT_OFFSET 0x00000110 /**< Error-free Multicast + Frame counter */ +#define XEMACPS_TXPAUSECNT_OFFSET 0x00000114 /**< Pause Frames Transmitted + Counter */ +#define XEMACPS_TX64CNT_OFFSET 0x00000118 /**< Error-free 64 byte Frames + Transmitted counter */ +#define XEMACPS_TX65CNT_OFFSET 0x0000011C /**< Error-free 65-127 byte + Frames Transmitted + counter */ +#define XEMACPS_TX128CNT_OFFSET 0x00000120 /**< Error-free 128-255 byte + Frames Transmitted + counter*/ +#define XEMACPS_TX256CNT_OFFSET 0x00000124 /**< Error-free 256-511 byte + Frames transmitted + counter */ +#define XEMACPS_TX512CNT_OFFSET 0x00000128 /**< Error-free 512-1023 byte + Frames transmitted + counter */ +#define XEMACPS_TX1024CNT_OFFSET 0x0000012C /**< Error-free 1024-1518 byte + Frames transmitted + counter */ +#define XEMACPS_TX1519CNT_OFFSET 0x00000130 /**< Error-free larger than + 1519 byte Frames + transmitted counter */ +#define XEMACPS_TXURUNCNT_OFFSET 0x00000134 /**< TX under run error + counter */ + +#define XEMACPS_SNGLCOLLCNT_OFFSET 0x00000138 /**< Single Collision Frame + Counter */ +#define XEMACPS_MULTICOLLCNT_OFFSET 0x0000013C /**< Multiple Collision Frame + Counter */ +#define XEMACPS_EXCESSCOLLCNT_OFFSET 0x00000140 /**< Excessive Collision Frame + Counter */ +#define XEMACPS_LATECOLLCNT_OFFSET 0x00000144 /**< Late Collision Frame + Counter */ +#define XEMACPS_TXDEFERCNT_OFFSET 0x00000148 /**< Deferred Transmission + Frame Counter */ +#define XEMACPS_TXCSENSECNT_OFFSET 0x0000014C /**< Transmit Carrier Sense + Error Counter */ + +#define XEMACPS_OCTRXL_OFFSET 0x00000150 /**< Octects Received register + Low */ +#define XEMACPS_OCTRXH_OFFSET 0x00000154 /**< Octects Received register + High */ + +#define XEMACPS_RXCNT_OFFSET 0x00000158 /**< Error-free Frames + Received Counter */ +#define XEMACPS_RXBROADCNT_OFFSET 0x0000015C /**< Error-free Broadcast + Frames Received Counter */ +#define XEMACPS_RXMULTICNT_OFFSET 0x00000160 /**< Error-free Multicast + Frames Received Counter */ +#define XEMACPS_RXPAUSECNT_OFFSET 0x00000164 /**< Pause Frames + Received Counter */ +#define XEMACPS_RX64CNT_OFFSET 0x00000168 /**< Error-free 64 byte Frames + Received Counter */ +#define XEMACPS_RX65CNT_OFFSET 0x0000016C /**< Error-free 65-127 byte + Frames Received Counter */ +#define XEMACPS_RX128CNT_OFFSET 0x00000170 /**< Error-free 128-255 byte + Frames Received Counter */ +#define XEMACPS_RX256CNT_OFFSET 0x00000174 /**< Error-free 256-512 byte + Frames Received Counter */ +#define XEMACPS_RX512CNT_OFFSET 0x00000178 /**< Error-free 512-1023 byte + Frames Received Counter */ +#define XEMACPS_RX1024CNT_OFFSET 0x0000017C /**< Error-free 1024-1518 byte + Frames Received Counter */ +#define XEMACPS_RX1519CNT_OFFSET 0x00000180 /**< Error-free 1519-max byte + Frames Received Counter */ +#define XEMACPS_RXUNDRCNT_OFFSET 0x00000184 /**< Undersize Frames Received + Counter */ +#define XEMACPS_RXOVRCNT_OFFSET 0x00000188 /**< Oversize Frames Received + Counter */ +#define XEMACPS_RXJABCNT_OFFSET 0x0000018C /**< Jabbers Received + Counter */ +#define XEMACPS_RXFCSCNT_OFFSET 0x00000190 /**< Frame Check Sequence + Error Counter */ +#define XEMACPS_RXLENGTHCNT_OFFSET 0x00000194 /**< Length Field Error + Counter */ +#define XEMACPS_RXSYMBCNT_OFFSET 0x00000198 /**< Symbol Error Counter */ +#define XEMACPS_RXALIGNCNT_OFFSET 0x0000019C /**< Alignment Error Counter */ +#define XEMACPS_RXRESERRCNT_OFFSET 0x000001A0 /**< Receive Resource Error + Counter */ +#define XEMACPS_RXORCNT_OFFSET 0x000001A4 /**< Receive Overrun Counter */ +#define XEMACPS_RXIPCCNT_OFFSET 0x000001A8 /**< IP header Checksum Error + Counter */ +#define XEMACPS_RXTCPCCNT_OFFSET 0x000001AC /**< TCP Checksum Error + Counter */ +#define XEMACPS_RXUDPCCNT_OFFSET 0x000001B0 /**< UDP Checksum Error + Counter */ +#define XEMACPS_LAST_OFFSET 0x000001B4 /**< Last statistic counter + offset, for clearing */ + +#define XEMACPS_1588_SEC_OFFSET 0x000001D0 /**< 1588 second counter */ +#define XEMACPS_1588_NANOSEC_OFFSET 0x000001D4 /**< 1588 nanosecond counter */ +#define XEMACPS_1588_ADJ_OFFSET 0x000001D8 /**< 1588 nanosecond + adjustment counter */ +#define XEMACPS_1588_INC_OFFSET 0x000001DC /**< 1588 nanosecond + increment counter */ +#define XEMACPS_PTP_TXSEC_OFFSET 0x000001E0 /**< 1588 PTP transmit second + counter */ +#define XEMACPS_PTP_TXNANOSEC_OFFSET 0x000001E4 /**< 1588 PTP transmit + nanosecond counter */ +#define XEMACPS_PTP_RXSEC_OFFSET 0x000001E8 /**< 1588 PTP receive second + counter */ +#define XEMACPS_PTP_RXNANOSEC_OFFSET 0x000001EC /**< 1588 PTP receive + nanosecond counter */ +#define XEMACPS_PTPP_TXSEC_OFFSET 0x000001F0 /**< 1588 PTP peer transmit + second counter */ +#define XEMACPS_PTPP_TXNANOSEC_OFFSET 0x000001F4 /**< 1588 PTP peer transmit + nanosecond counter */ +#define XEMACPS_PTPP_RXSEC_OFFSET 0x000001F8 /**< 1588 PTP peer receive + second counter */ +#define XEMACPS_PTPP_RXNANOSEC_OFFSET 0x000001FC /**< 1588 PTP peer receive + nanosecond counter */ + +/* Define some bit positions for registers. */ + +/** @name network control register bit definitions + * @{ + */ +#define XEMACPS_NWCTRL_FLUSH_DPRAM_MASK 0x00040000 /**< Flush a packet from + Rx SRAM */ +#define XEMACPS_NWCTRL_ZEROPAUSETX_MASK 0x00000800 /**< Transmit zero quantum + pause frame */ +#define XEMACPS_NWCTRL_PAUSETX_MASK 0x00000800 /**< Transmit pause frame */ +#define XEMACPS_NWCTRL_HALTTX_MASK 0x00000400 /**< Halt transmission + after current frame */ +#define XEMACPS_NWCTRL_STARTTX_MASK 0x00000200 /**< Start tx (tx_go) */ + +#define XEMACPS_NWCTRL_STATWEN_MASK 0x00000080 /**< Enable writing to + stat counters */ +#define XEMACPS_NWCTRL_STATINC_MASK 0x00000040 /**< Increment statistic + registers */ +#define XEMACPS_NWCTRL_STATCLR_MASK 0x00000020 /**< Clear statistic + registers */ +#define XEMACPS_NWCTRL_MDEN_MASK 0x00000010 /**< Enable MDIO port */ +#define XEMACPS_NWCTRL_TXEN_MASK 0x00000008 /**< Enable transmit */ +#define XEMACPS_NWCTRL_RXEN_MASK 0x00000004 /**< Enable receive */ +#define XEMACPS_NWCTRL_LOOPEN_MASK 0x00000002 /**< local loopback */ +/*@}*/ + +/** @name network configuration register bit definitions + * @{ + */ +#define XEMACPS_NWCFG_BADPREAMBEN_MASK 0x20000000 /**< disable rejection of + non-standard preamble */ +#define XEMACPS_NWCFG_IPDSTRETCH_MASK 0x10000000 /**< enable transmit IPG */ +#define XEMACPS_NWCFG_FCSIGNORE_MASK 0x04000000 /**< disable rejection of + FCS error */ +#define XEMACPS_NWCFG_HDRXEN_MASK 0x02000000 /**< RX half duplex */ +#define XEMACPS_NWCFG_RXCHKSUMEN_MASK 0x01000000 /**< enable RX checksum + offload */ +#define XEMACPS_NWCFG_PAUSECOPYDI_MASK 0x00800000 /**< Do not copy pause + Frames to memory */ +#define XEMACPS_NWCFG_MDC_SHIFT_MASK 18 /**< shift bits for MDC */ +#define XEMACPS_NWCFG_MDCCLKDIV_MASK 0x001C0000 /**< MDC Mask PCLK divisor */ +#define XEMACPS_NWCFG_FCSREM_MASK 0x00020000 /**< Discard FCS from + received frames */ +#define XEMACPS_NWCFG_LENGTHERRDSCRD_MASK 0x00010000 +/**< RX length error discard */ +#define XEMACPS_NWCFG_RXOFFS_MASK 0x0000C000 /**< RX buffer offset */ +#define XEMACPS_NWCFG_PAUSEEN_MASK 0x00002000 /**< Enable pause RX */ +#define XEMACPS_NWCFG_RETRYTESTEN_MASK 0x00001000 /**< Retry test */ +#define XEMACPS_NWCFG_EXTADDRMATCHEN_MASK 0x00000200 +/**< External address match enable */ +#define XEMACPS_NWCFG_1000_MASK 0x00000400 /**< 1000 Mbps */ +#define XEMACPS_NWCFG_1536RXEN_MASK 0x00000100 /**< Enable 1536 byte + frames reception */ +#define XEMACPS_NWCFG_UCASTHASHEN_MASK 0x00000080 /**< Receive unicast hash + frames */ +#define XEMACPS_NWCFG_MCASTHASHEN_MASK 0x00000040 /**< Receive multicast hash + frames */ +#define XEMACPS_NWCFG_BCASTDI_MASK 0x00000020 /**< Do not receive + broadcast frames */ +#define XEMACPS_NWCFG_COPYALLEN_MASK 0x00000010 /**< Copy all frames */ +#define XEMACPS_NWCFG_JUMBO_MASK 0x00000008 /**< Jumbo frames */ +#define XEMACPS_NWCFG_NVLANDISC_MASK 0x00000004 /**< Receive only VLAN + frames */ +#define XEMACPS_NWCFG_FDEN_MASK 0x00000002 /**< full duplex */ +#define XEMACPS_NWCFG_100_MASK 0x00000001 /**< 100 Mbps */ +#define XEMACPS_NWCFG_RESET_MASK 0x00080000 /**< reset value */ +/*@}*/ + +/** @name network status register bit definitaions + * @{ + */ +#define XEMACPS_NWSR_MDIOIDLE_MASK 0x00000004 /**< PHY management idle */ +#define XEMACPS_NWSR_MDIO_MASK 0x00000002 /**< Status of mdio_in */ +/*@}*/ + + +/** @name MAC address register word 1 mask + * @{ + */ +#define XEMACPS_LADDR_MACH_MASK 0x0000FFFF /**< Address bits[47:32] + bit[31:0] are in BOTTOM */ +/*@}*/ + + +/** @name DMA control register bit definitions + * @{ + */ +#define XEMACPS_DMACR_RXBUF_MASK 0x00FF0000 /**< Mask bit for RX buffer + size */ +#define XEMACPS_DMACR_RXBUF_SHIFT 16 /**< Shift bit for RX buffer + size */ +#define XEMACPS_DMACR_TCPCKSUM_MASK 0x00000800 /**< enable/disable TX + checksum offload */ +#define XEMACPS_DMACR_TXSIZE_MASK 0x00000400 /**< TX buffer memory size */ +#define XEMACPS_DMACR_RXSIZE_MASK 0x00000300 /**< RX buffer memory size */ +#define XEMACPS_DMACR_ENDIAN_MASK 0x00000080 /**< endian configuration */ +#define XEMACPS_DMACR_BLENGTH_MASK 0x0000001F /**< buffer burst length */ +#define XEMACPS_DMACR_SINGLE_AHB_BURST 0x00000001 /**< single AHB bursts */ +#define XEMACPS_DMACR_INCR4_AHB_BURST 0x00000004 /**< 4 bytes AHB bursts */ +#define XEMACPS_DMACR_INCR8_AHB_BURST 0x00000008 /**< 8 bytes AHB bursts */ +#define XEMACPS_DMACR_INCR16_AHB_BURST 0x00000010 /**< 16 bytes AHB bursts */ +/*@}*/ + +/** @name transmit status register bit definitions + * @{ + */ +#define XEMACPS_TXSR_HRESPNOK_MASK 0x00000100 /**< Transmit hresp not OK */ +#define XEMACPS_TXSR_URUN_MASK 0x00000040 /**< Transmit underrun */ +#define XEMACPS_TXSR_TXCOMPL_MASK 0x00000020 /**< Transmit completed OK */ +#define XEMACPS_TXSR_BUFEXH_MASK 0x00000010 /**< Transmit buffs exhausted + mid frame */ +#define XEMACPS_TXSR_TXGO_MASK 0x00000008 /**< Status of go flag */ +#define XEMACPS_TXSR_RXOVR_MASK 0x00000004 /**< Retry limit exceeded */ +#define XEMACPS_TXSR_FRAMERX_MASK 0x00000002 /**< Collision tx frame */ +#define XEMACPS_TXSR_USEDREAD_MASK 0x00000001 /**< TX buffer used bit set */ + +#define XEMACPS_TXSR_ERROR_MASK (XEMACPS_TXSR_HRESPNOK_MASK | \ + XEMACPS_TXSR_URUN_MASK | \ + XEMACPS_TXSR_BUFEXH_MASK | \ + XEMACPS_TXSR_RXOVR_MASK | \ + XEMACPS_TXSR_FRAMERX_MASK | \ + XEMACPS_TXSR_USEDREAD_MASK) +/*@}*/ + +/** + * @name receive status register bit definitions + * @{ + */ +#define XEMACPS_RXSR_HRESPNOK_MASK 0x00000008 /**< Receive hresp not OK */ +#define XEMACPS_RXSR_RXOVR_MASK 0x00000004 /**< Receive overrun */ +#define XEMACPS_RXSR_FRAMERX_MASK 0x00000002 /**< Frame received OK */ +#define XEMACPS_RXSR_BUFFNA_MASK 0x00000001 /**< RX buffer used bit set */ + +#define XEMACPS_RXSR_ERROR_MASK (XEMACPS_RXSR_HRESPNOK_MASK | \ + XEMACPS_RXSR_RXOVR_MASK | \ + XEMACPS_RXSR_BUFFNA_MASK) +/*@}*/ + +/** + * @name interrupts bit definitions + * Bits definitions are same in XEMACPS_ISR_OFFSET, + * XEMACPS_IER_OFFSET, XEMACPS_IDR_OFFSET, and XEMACPS_IMR_OFFSET + * @{ + */ +#define XEMACPS_IXR_PTPPSTX_MASK 0x02000000 /**< PTP Psync transmitted */ +#define XEMACPS_IXR_PTPPDRTX_MASK 0x01000000 /**< PTP Pdelay_req + transmitted */ +#define XEMACPS_IXR_PTPSTX_MASK 0x00800000 /**< PTP Sync transmitted */ +#define XEMACPS_IXR_PTPDRTX_MASK 0x00400000 /**< PTP Delay_req transmitted + */ +#define XEMACPS_IXR_PTPPSRX_MASK 0x00200000 /**< PTP Psync received */ +#define XEMACPS_IXR_PTPPDRRX_MASK 0x00100000 /**< PTP Pdelay_req received */ +#define XEMACPS_IXR_PTPSRX_MASK 0x00080000 /**< PTP Sync received */ +#define XEMACPS_IXR_PTPDRRX_MASK 0x00040000 /**< PTP Delay_req received */ +#define XEMACPS_IXR_PAUSETX_MASK 0x00004000 /**< Pause frame transmitted */ +#define XEMACPS_IXR_PAUSEZERO_MASK 0x00002000 /**< Pause time has reached + zero */ +#define XEMACPS_IXR_PAUSENZERO_MASK 0x00001000 /**< Pause frame received */ +#define XEMACPS_IXR_HRESPNOK_MASK 0x00000800 /**< hresp not ok */ +#define XEMACPS_IXR_RXOVR_MASK 0x00000400 /**< Receive overrun occurred */ +#define XEMACPS_IXR_TXCOMPL_MASK 0x00000080 /**< Frame transmitted ok */ +#define XEMACPS_IXR_TXEXH_MASK 0x00000040 /**< Transmit err occurred or + no buffers*/ +#define XEMACPS_IXR_RETRY_MASK 0x00000020 /**< Retry limit exceeded */ +#define XEMACPS_IXR_URUN_MASK 0x00000010 /**< Transmit underrun */ +#define XEMACPS_IXR_TXUSED_MASK 0x00000008 /**< Tx buffer used bit read */ +#define XEMACPS_IXR_RXUSED_MASK 0x00000004 /**< Rx buffer used bit read */ +#define XEMACPS_IXR_FRAMERX_MASK 0x00000002 /**< Frame received ok */ +#define XEMACPS_IXR_MGMNT_MASK 0x00000001 /**< PHY management complete */ +#define XEMACPS_IXR_ALL_MASK 0x00007FFF /**< Everything! */ + +#define XEMACPS_IXR_TX_ERR_MASK (XEMACPS_IXR_TXEXH_MASK | \ + XEMACPS_IXR_RETRY_MASK | \ + XEMACPS_IXR_URUN_MASK | \ + XEMACPS_IXR_TXUSED_MASK) + + +#define XEMACPS_IXR_RX_ERR_MASK (XEMACPS_IXR_HRESPNOK_MASK | \ + XEMACPS_IXR_RXUSED_MASK | \ + XEMACPS_IXR_RXOVR_MASK) + +/*@}*/ + +/** @name PHY Maintenance bit definitions + * @{ + */ +#define XEMACPS_PHYMNTNC_OP_MASK 0x40020000 /**< operation mask bits */ +#define XEMACPS_PHYMNTNC_OP_R_MASK 0x20000000 /**< read operation */ +#define XEMACPS_PHYMNTNC_OP_W_MASK 0x10000000 /**< write operation */ +#define XEMACPS_PHYMNTNC_ADDR_MASK 0x0F800000 /**< Address bits */ +#define XEMACPS_PHYMNTNC_REG_MASK 0x007C0000 /**< register bits */ +#define XEMACPS_PHYMNTNC_DATA_MASK 0x00000FFF /**< data bits */ +#define XEMACPS_PHYMNTNC_PHYAD_SHIFT_MASK 23 /**< Shift bits for PHYAD */ +#define XEMACPS_PHYMNTNC_PHREG_SHIFT_MASK 18 /**< Shift bits for PHREG */ +/*@}*/ + +/* Transmit buffer descriptor status words offset + * @{ + */ +#define XEMACPS_BD_ADDR_OFFSET 0x00000000 /**< word 0/addr of BDs */ +#define XEMACPS_BD_STAT_OFFSET 0x00000004 /**< word 1/status of BDs */ +/* + * @} + */ + +/* Transmit buffer descriptor status words bit positions. + * Transmit buffer descriptor consists of two 32-bit registers, + * the first - word0 contains a 32-bit address pointing to the location of + * the transmit data. + * The following register - word1, consists of various information to control + * the XEmacPs transmit process. After transmit, this is updated with status + * information, whether the frame was transmitted OK or why it had failed. + * @{ + */ +#define XEMACPS_TXBUF_USED_MASK 0x80000000 /**< Used bit. */ +#define XEMACPS_TXBUF_WRAP_MASK 0x40000000 /**< Wrap bit, last descriptor */ +#define XEMACPS_TXBUF_RETRY_MASK 0x20000000 /**< Retry limit exceeded */ +#define XEMACPS_TXBUF_URUN_MASK 0x10000000 /**< Transmit underrun occurred */ +#define XEMACPS_TXBUF_EXH_MASK 0x08000000 /**< Buffers exhausted */ +#define XEMACPS_TXBUF_TCP_MASK 0x04000000 /**< Late collision. */ +#define XEMACPS_TXBUF_NOCRC_MASK 0x00010000 /**< No CRC */ +#define XEMACPS_TXBUF_LAST_MASK 0x00008000 /**< Last buffer */ +#define XEMACPS_TXBUF_LEN_MASK 0x00003FFF /**< Mask for length field */ +/* + * @} + */ + +/* Receive buffer descriptor status words bit positions. + * Receive buffer descriptor consists of two 32-bit registers, + * the first - word0 contains a 32-bit word aligned address pointing to the + * address of the buffer. The lower two bits make up the wrap bit indicating + * the last descriptor and the ownership bit to indicate it has been used by + * the XEmacPs. + * The following register - word1, contains status information regarding why + * the frame was received (the filter match condition) as well as other + * useful info. + * @{ + */ +#define XEMACPS_RXBUF_BCAST_MASK 0x80000000 /**< Broadcast frame */ +#define XEMACPS_RXBUF_MULTIHASH_MASK 0x40000000 /**< Multicast hashed frame */ +#define XEMACPS_RXBUF_UNIHASH_MASK 0x20000000 /**< Unicast hashed frame */ +#define XEMACPS_RXBUF_EXH_MASK 0x08000000 /**< buffer exhausted */ +#define XEMACPS_RXBUF_AMATCH_MASK 0x06000000 /**< Specific address + matched */ +#define XEMACPS_RXBUF_IDFOUND_MASK 0x01000000 /**< Type ID matched */ +#define XEMACPS_RXBUF_IDMATCH_MASK 0x00C00000 /**< ID matched mask */ +#define XEMACPS_RXBUF_VLAN_MASK 0x00200000 /**< VLAN tagged */ +#define XEMACPS_RXBUF_PRI_MASK 0x00100000 /**< Priority tagged */ +#define XEMACPS_RXBUF_VPRI_MASK 0x000E0000 /**< Vlan priority */ +#define XEMACPS_RXBUF_CFI_MASK 0x00010000 /**< CFI frame */ +#define XEMACPS_RXBUF_EOF_MASK 0x00008000 /**< End of frame. */ +#define XEMACPS_RXBUF_SOF_MASK 0x00004000 /**< Start of frame. */ +#define XEMACPS_RXBUF_LEN_MASK 0x00003FFF /**< Mask for length field */ + +#define XEMACPS_RXBUF_WRAP_MASK 0x00000002 /**< Wrap bit, last BD */ +#define XEMACPS_RXBUF_NEW_MASK 0x00000001 /**< Used bit.. */ +#define XEMACPS_RXBUF_ADD_MASK 0xFFFFFFFC /**< Mask for address */ +/* + * @} + */ + +/* + * Define appropriate I/O access method to mempry mapped I/O or other + * intarfce if necessary. + */ + +#define XEmacPs_In32 Xil_In32 +#define XEmacPs_Out32 Xil_Out32 + + +/****************************************************************************/ +/** +* +* Read the given register. +* +* @param BaseAddress is the base address of the device +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note +* C-style signature: +* u32 XEmacPs_ReadReg(u32 BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XEmacPs_ReadReg(BaseAddress, RegOffset) \ + XEmacPs_In32((BaseAddress) + (RegOffset)) + + +/****************************************************************************/ +/** +* +* Write the given register. +* +* @param BaseAddress is the base address of the device +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note +* C-style signature: +* void XEmacPs_WriteReg(u32 BaseAddress, u32 RegOffset, +* u32 Data) +* +*****************************************************************************/ +#define XEmacPs_WriteReg(BaseAddress, RegOffset, Data) \ + XEmacPs_Out32((BaseAddress) + (RegOffset), (Data)) + +/************************** Function Prototypes *****************************/ +/* + * Perform reset operation to the emacps interface + */ +void XEmacPs_ResetHw(u32 BaseAddr); + +#ifdef __cplusplus + } +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_intr.c new file mode 100755 index 000000000..a3b920848 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_intr.c @@ -0,0 +1,229 @@ +/* $Id: xemacps_intr.c,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_intr.c +* +* Functions in this file implement general purpose interrupt processing related +* functionality. See xemacps.h for a detailed description of the driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a wsy 01/10/10 First release +* 1.03a asa 01/24/13 Fix for CR #692702 which updates error handling for +* Rx errors. Under heavy Rx traffic, there will be a large +* number of errors related to receive buffer not available. +* Because of a HW bug (SI #692601), under such heavy errors, +* the Rx data path can become unresponsive. To reduce the +* probabilities for hitting this HW bug, the SW writes to +* bit 18 to flush a packet from Rx DPRAM immediately. The +* changes for it are done in the function +* XEmacPs_IntrHandler. +* </pre> +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xemacps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** + * Install an asynchronious handler function for the given HandlerType: + * + * @param InstancePtr is a pointer to the instance to be worked on. + * @param HandlerType indicates what interrupt handler type is. + * XEMACPS_HANDLER_DMASEND, XEMACPS_HANDLER_DMARECV and + * XEMACPS_HANDLER_ERROR. + * @param FuncPtr is the pointer to the callback function + * @param CallBackRef is the upper layer callback reference passed back when + * when the callback function is invoked. + * + * @return + * + * None. + * + * @note + * There is no assert on the CallBackRef since the driver doesn't know what + * it is. + * + *****************************************************************************/ +int XEmacPs_SetHandler(XEmacPs *InstancePtr, u32 HandlerType, + void *FuncPtr, void *CallBackRef) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(FuncPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + switch (HandlerType) { + case XEMACPS_HANDLER_DMASEND: + InstancePtr->SendHandler = (XEmacPs_Handler) FuncPtr; + InstancePtr->SendRef = CallBackRef; + break; + case XEMACPS_HANDLER_DMARECV: + InstancePtr->RecvHandler = (XEmacPs_Handler) FuncPtr; + InstancePtr->RecvRef = CallBackRef; + break; + case XEMACPS_HANDLER_ERROR: + InstancePtr->ErrorHandler = (XEmacPs_ErrHandler) FuncPtr; + InstancePtr->ErrorRef = CallBackRef; + break; + default: + return (XST_INVALID_PARAM); + } + return (XST_SUCCESS); +} + +/*****************************************************************************/ +/** +* Master interrupt handler for EMAC driver. This routine will query the +* status of the device, bump statistics, and invoke user callbacks. +* +* This routine must be connected to an interrupt controller using OS/BSP +* specific methods. +* +* @param XEmacPsPtr is a pointer to the XEMACPS instance that has caused the +* interrupt. +* +******************************************************************************/ +void XEmacPs_IntrHandler(void *XEmacPsPtr) +{ + u32 RegISR; + u32 RegSR; + u32 RegCtrl; + XEmacPs *InstancePtr = (XEmacPs *) XEmacPsPtr; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* This ISR will try to handle as many interrupts as it can in a single + * call. However, in most of the places where the user's error handler + * is called, this ISR exits because it is expected that the user will + * reset the device in nearly all instances. + */ + RegISR = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_ISR_OFFSET); + + /* Clear the interrupt status register */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, XEMACPS_ISR_OFFSET, + RegISR); + + /* Receive complete interrupt */ + if (RegISR & (XEMACPS_IXR_FRAMERX_MASK)) { + /* Clear RX status register RX complete indication but preserve + * error bits if there is any */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXSR_OFFSET, + XEMACPS_RXSR_FRAMERX_MASK | + XEMACPS_RXSR_BUFFNA_MASK); + InstancePtr->RecvHandler(InstancePtr->RecvRef); + } + + /* Transmit complete interrupt */ + if (RegISR & (XEMACPS_IXR_TXCOMPL_MASK)) { + /* Clear TX status register TX complete indication but preserve + * error bits if there is any */ + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXSR_OFFSET, + XEMACPS_TXSR_TXCOMPL_MASK | + XEMACPS_TXSR_USEDREAD_MASK); + InstancePtr->SendHandler(InstancePtr->SendRef); + } + + /* Receive error conditions interrupt */ + if (RegISR & (XEMACPS_IXR_RX_ERR_MASK)) { + /* Clear RX status register */ + RegSR = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXSR_OFFSET); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_RXSR_OFFSET, RegSR); + + /* Fix for CR # 692702. Write to bit 18 of net_ctrl + * register to flush a packet out of Rx SRAM upon + * an error for receive buffer not available. */ + if (RegISR & XEMACPS_IXR_RXUSED_MASK) { + RegCtrl = + XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET); + RegCtrl |= XEMACPS_NWCTRL_FLUSH_DPRAM_MASK; + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_NWCTRL_OFFSET, RegCtrl); + } + InstancePtr->ErrorHandler(InstancePtr->ErrorRef, XEMACPS_RECV, + RegSR); + } + + /* When XEMACPS_IXR_TXCOMPL_MASK is flaged, XEMACPS_IXR_TXUSED_MASK + * will be asserted the same time. + * Have to distinguish this bit to handle the real error condition. + */ + /* Transmit error conditions interrupt */ + if (RegISR & (XEMACPS_IXR_TX_ERR_MASK) && + !(RegISR & (XEMACPS_IXR_TXCOMPL_MASK))) { + /* Clear TX status register */ + RegSR = XEmacPs_ReadReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXSR_OFFSET); + XEmacPs_WriteReg(InstancePtr->Config.BaseAddress, + XEMACPS_TXSR_OFFSET, RegSR); + InstancePtr->ErrorHandler(InstancePtr->ErrorRef, XEMACPS_SEND, + RegSR); + } + +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_sinit.c new file mode 100755 index 000000000..6472342eb --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/emacps_v1_05_a/src/xemacps_sinit.c @@ -0,0 +1,102 @@ +/* $Id: xemacps_sinit.c,v 1.1.2.1 2011/01/20 03:39:02 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xemacps_sinit.c +* +* This file contains lookup method by device ID when success, it returns +* pointer to config table to be used to initialize the device. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a wsy 01/10/10 New +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xparameters.h" +#include "xemacps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* Lookup the device configuration based on the unique device ID. The table +* contains the configuration info for each device in the system. +* +* @param DeviceId is the unique device ID of the device being looked up. +* +* @return +* A pointer to the configuration table entry corresponding to the given +* device ID, or NULL if no match is found. +* +******************************************************************************/ +XEmacPs_Config *XEmacPs_LookupConfig(u16 DeviceId) +{ + extern XEmacPs_Config XEmacPs_ConfigTable[]; + XEmacPs_Config *CfgPtr = NULL; + int i; + + for (i = 0; i < XPAR_XEMACPS_NUM_INSTANCES; i++) { + if (XEmacPs_ConfigTable[i].DeviceId == DeviceId) { + CfgPtr = &XEmacPs_ConfigTable[i]; + break; + } + } + + return (CfgPtr); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/Makefile new file mode 100755 index 000000000..5f8a63572 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/Makefile @@ -0,0 +1,28 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +INCLUDEFILES=xgpio_l.h xgpio.h + +LIBSOURCES=*.c +OUTS = *.o + + +libs: + echo "Compiling gpio" + $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES) + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} $(OUTS) + make clean + +include: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OUTS} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio.c new file mode 100755 index 000000000..a20398401 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio.c @@ -0,0 +1,264 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +/** +* @file xgpio.c +* +* The implementation of the XGpio driver's basic functionality. See xgpio.h +* for more information about the driver. +* +* @note +* +* None +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a rmm 02/04/02 First release +* 2.00a jhl 12/16/02 Update for dual channel and interrupt support +* 2.01a jvb 12/13/05 Changed Initialize() into CfgInitialize(), and made +* CfgInitialize() take a pointer to a config structure +* instead of a device id. Moved Initialize() into +* xgpio_sinit.c, and had Initialize() call CfgInitialize() +* after it retrieved the config structure using the device +* id. Removed include of xparameters.h along with any +* dependencies on xparameters.h and the _g.c config table. +* 2.11a mta 03/21/07 Updated to new coding style, added GetDataDirection +* 2.12a sv 11/21/07 Updated driver to support access through DCR bus +* 3.00a sv 11/21/09 Updated to use HAL Processor APIs. Renamed the +* macros to remove _m from the name. +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xgpio.h" +#include "xstatus.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + + +/************************** Function Prototypes *****************************/ + + +/****************************************************************************/ +/** +* Initialize the XGpio instance provided by the caller based on the +* given configuration data. +* +* Nothing is done except to initialize the InstancePtr. +* +* @param InstancePtr is a pointer to an XGpio instance. The memory the +* pointer references must be pre-allocated by the caller. Further +* calls to manipulate the driver through the XGpio API must be +* made with this pointer. +* @param Config is a reference to a structure containing information +* about a specific GPIO device. This function initializes an +* InstancePtr object for a specific device specified by the +* contents of Config. This function can initialize multiple +* instance objects with the use of multiple calls giving different +* Config information on each call. +* @param EffectiveAddr is the device base address in the virtual memory +* address space. The caller is responsible for keeping the address +* mapping from EffectiveAddr to the device physical base address +* unchanged once this function is invoked. Unexpected errors may +* occur if the address mapping changes after this function is +* called. If address translation is not used, use +* Config->BaseAddress for this parameters, passing the physical +* address instead. +* +* @return +* - XST_SUCCESS Initialization was successfull. +* +* @note None. +* +*****************************************************************************/ +int XGpio_CfgInitialize(XGpio * InstancePtr, XGpio_Config * Config, + u32 EffectiveAddr) +{ + /* + * Assert arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + + /* + * Set some default values. + */ +#if (XPAR_XGPIO_USE_DCR_BRIDGE != 0) + InstancePtr->BaseAddress = ((EffectiveAddr >> 2)) & 0xFFF; +#else + InstancePtr->BaseAddress = EffectiveAddr; +#endif + + InstancePtr->InterruptPresent = Config->InterruptPresent; + InstancePtr->IsDual = Config->IsDual; + + /* + * Indicate the instance is now ready to use, initialized without error + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + return (XST_SUCCESS); +} + + +/****************************************************************************/ +/** +* Set the input/output direction of all discrete signals for the specified +* GPIO channel. +* +* @param InstancePtr is a pointer to an XGpio instance to be worked on. +* @param Channel contains the channel of the GPIO (1 or 2) to operate on. +* @param DirectionMask is a bitmask specifying which discretes are input +* and which are output. Bits set to 0 are output and bits set to 1 +* are input. +* +* @return None. +* +* @note The hardware must be built for dual channels if this function +* is used with any channel other than 1. If it is not, this +* function will assert. +* +*****************************************************************************/ +void XGpio_SetDataDirection(XGpio * InstancePtr, unsigned Channel, + u32 DirectionMask) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((Channel == 1) || + ((Channel == 2) && (InstancePtr->IsDual == TRUE))); + + XGpio_WriteReg(InstancePtr->BaseAddress, + ((Channel - 1) * XGPIO_CHAN_OFFSET) + XGPIO_TRI_OFFSET, + DirectionMask); +} + +/****************************************************************************/ +/** +* Get the input/output direction of all discrete signals for the specified +* GPIO channel. +* +* @param InstancePtr is a pointer to an XGpio instance to be worked on. +* @param Channel contains the channel of the GPIO (1 or 2) to operate on. +* +* @return Bitmask specifying which discretes are input and +* which are output. Bits set to 0 are output and bits set to 1 are +* input. +* +* @note +* +* The hardware must be built for dual channels if this function is used +* with any channel other than 1. If it is not, this function will assert. +* +*****************************************************************************/ +u32 XGpio_GetDataDirection(XGpio *InstancePtr, unsigned Channel) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((Channel == 1) || + ((Channel == 2) && + (InstancePtr->IsDual == TRUE))); + + return XGpio_ReadReg(InstancePtr->BaseAddress, + ((Channel - 1) * XGPIO_CHAN_OFFSET) + XGPIO_TRI_OFFSET); +} + +/****************************************************************************/ +/** +* Read state of discretes for the specified GPIO channnel. +* +* @param InstancePtr is a pointer to an XGpio instance to be worked on. +* @param Channel contains the channel of the GPIO (1 or 2) to operate on. +* +* @return Current copy of the discretes register. +* +* @note The hardware must be built for dual channels if this function +* is used with any channel other than 1. If it is not, this +* function will assert. +* +*****************************************************************************/ +u32 XGpio_DiscreteRead(XGpio * InstancePtr, unsigned Channel) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((Channel == 1) || + ((Channel == 2) && (InstancePtr->IsDual == TRUE))); + + return XGpio_ReadReg(InstancePtr->BaseAddress, + ((Channel - 1) * XGPIO_CHAN_OFFSET) + + XGPIO_DATA_OFFSET); +} + +/****************************************************************************/ +/** +* Write to discretes register for the specified GPIO channel. +* +* @param InstancePtr is a pointer to an XGpio instance to be worked on. +* @param Channel contains the channel of the GPIO (1 or 2) to operate on. +* @param Data is the value to be written to the discretes register. +* +* @return None. +* +* @note The hardware must be built for dual channels if this function +* is used with any channel other than 1. If it is not, this +* function will assert. See also XGpio_DiscreteSet() and +* XGpio_DiscreteClear(). +* +*****************************************************************************/ +void XGpio_DiscreteWrite(XGpio * InstancePtr, unsigned Channel, u32 Data) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((Channel == 1) || + ((Channel == 2) && (InstancePtr->IsDual == TRUE))); + + XGpio_WriteReg(InstancePtr->BaseAddress, + ((Channel - 1) * XGPIO_CHAN_OFFSET) + XGPIO_DATA_OFFSET, + Data); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio.h new file mode 100755 index 000000000..bd77b9204 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio.h @@ -0,0 +1,203 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xgpio.h +* +* This file contains the software API definition of the Xilinx General Purpose +* I/O (XGpio) device driver. +* +* The Xilinx GPIO controller is a soft IP core designed for Xilinx FPGAs and +* contains the following general features: +* - Support for up to 32 I/O discretes for each channel (64 bits total). +* - Each of the discretes can be configured for input or output. +* - Configurable support for dual channels and interrupt generation. +* +* The driver provides interrupt management functions. Implementation of +* interrupt handlers is left to the user. Refer to the provided interrupt +* example in the examples directory for details. +* +* This driver is intended to be RTOS and processor independent. Any needs for +* dynamic memory management, threads or thread mutual exclusion, virtual +* memory, or cache control must be satisfied by the layer above this driver. +* +* <b>Initialization & Configuration</b> +* +* The XGpio_Config structure is used by the driver to configure itself. This +* configuration structure is typically created by the tool-chain based on HW +* build properties. +* +* To support multiple runtime loading and initialization strategies employed +* by various operating systems, the driver instance can be initialized in one +* of the following ways: +* +* - XGpio_Initialize(InstancePtr, DeviceId) - The driver looks up its own +* configuration structure created by the tool-chain based on an ID provided +* by the tool-chain. +* +* - XGpio_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a +* configuration structure provided by the caller. If running in a system +* with address translation, the provided virtual memory base address +* replaces the physical address present in the configuration structure. +* +* @note +* +* This API utilizes 32 bit I/O to the GPIO registers. With less than 32 bits, +* the unused bits from registers are read as zero and written as don't cares. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a rmm 03/13/02 First release +* 2.00a jhl 11/26/03 Added support for dual channels and interrupts +* 2.01a jvb 12/14/05 I separated dependency on the static config table and +* xparameters.h from the driver initialization by moving +* _Initialize and _LookupConfig to _sinit.c. I also added +* the new _CfgInitialize routine. +* 2.11a mta 03/21/07 Updated to new coding style, added GetDataDirection +* 2.12a sv 11/21/07 Updated driver to support access through DCR bus +* 2.12a sv 06/05/08 Updated driver to fix the XGpio_InterruptDisable function +* to properly update the Interrupt Enable register +* 2.13a sdm 08/22/08 Removed support for static interrupt handlers from the MDD +* file +* 3.00a sv 11/21/09 Updated to use HAL Processor APIs. +* Renamed the macros XGpio_mWriteReg to XGpio_WriteReg and +* XGpio_mReadReg to XGpio_ReadReg. Removed the macros +* XGpio_mSetDataDirection, XGpio_mGetDataReg and +* XGpio_mSetDataReg. Users should use XGpio_WriteReg and +* XGpio_ReadReg to achieve the same functionality. +* 3.01a bss 04/18/13 Updated driver tcl to generate Canonical params in +* xparameters.h. CR#698589 +* </pre> +*****************************************************************************/ + +#ifndef XGPIO_H /* prevent circular inclusions */ +#define XGPIO_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xgpio_l.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /* Unique ID of device */ + u32 BaseAddress; /* Device base address */ + int InterruptPresent; /* Are interrupts supported in h/w */ + int IsDual; /* Are 2 channels supported in h/w */ +} XGpio_Config; + +/** + * The XGpio driver instance data. The user is required to allocate a + * variable of this type for every GPIO device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + u32 BaseAddress; /* Device base address */ + u32 IsReady; /* Device is initialized and ready */ + int InterruptPresent; /* Are interrupts supported in h/w */ + int IsDual; /* Are 2 channels supported in h/w */ +} XGpio; + +/***************** Macros (Inline Functions) Definitions ********************/ + + +/************************** Function Prototypes *****************************/ + +/* + * Initialization functions in xgpio_sinit.c + */ +int XGpio_Initialize(XGpio *InstancePtr, u16 DeviceId); +XGpio_Config *XGpio_LookupConfig(u16 DeviceId); + +/* + * API Basic functions implemented in xgpio.c + */ +int XGpio_CfgInitialize(XGpio *InstancePtr, XGpio_Config * Config, + u32 EffectiveAddr); +void XGpio_SetDataDirection(XGpio *InstancePtr, unsigned Channel, + u32 DirectionMask); +u32 XGpio_GetDataDirection(XGpio *InstancePtr, unsigned Channel); +u32 XGpio_DiscreteRead(XGpio *InstancePtr, unsigned Channel); +void XGpio_DiscreteWrite(XGpio *InstancePtr, unsigned Channel, u32 Mask); + + +/* + * API Functions implemented in xgpio_extra.c + */ +void XGpio_DiscreteSet(XGpio *InstancePtr, unsigned Channel, u32 Mask); +void XGpio_DiscreteClear(XGpio *InstancePtr, unsigned Channel, u32 Mask); + +/* + * API Functions implemented in xgpio_selftest.c + */ +int XGpio_SelfTest(XGpio *InstancePtr); + +/* + * API Functions implemented in xgpio_intr.c + */ +void XGpio_InterruptGlobalEnable(XGpio *InstancePtr); +void XGpio_InterruptGlobalDisable(XGpio *InstancePtr); +void XGpio_InterruptEnable(XGpio *InstancePtr, u32 Mask); +void XGpio_InterruptDisable(XGpio *InstancePtr, u32 Mask); +void XGpio_InterruptClear(XGpio *InstancePtr, u32 Mask); +u32 XGpio_InterruptGetEnabled(XGpio *InstancePtr); +u32 XGpio_InterruptGetStatus(XGpio *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_extra.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_extra.c new file mode 100755 index 000000000..3a4df6084 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_extra.c @@ -0,0 +1,174 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +/** +* @file xgpio_extra.c +* +* The implementation of the XGpio driver's advanced discrete functions. +* See xgpio.h for more information about the driver. +* +* @note +* +* These APIs can only be used if the GPIO_IO ports in the IP are used for +* connecting to the external output ports. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a rmm 02/04/02 First release +* 2.00a jhl 12/16/02 Update for dual channel and interrupt support +* 2.11a mta 03/21/07 Updated to new coding style +* 3.00a sv 11/21/09 Updated to use HAL Processor APIs. Renamed the macros +* XGpio_mWriteReg to XGpio_WriteReg, and XGpio_mReadReg +* to XGpio_ReadReg. +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xgpio.h" +#include "xgpio_i.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + + +/****************************************************************************/ +/** +* Set output discrete(s) to logic 1 for the specified GPIO channel. +* +* @param InstancePtr is a pointer to an XGpio instance to be worked on. +* @param Channel contains the channel of the GPIO (1 or 2) to operate on. +* @param Mask is the set of bits that will be set to 1 in the discrete +* data register. All other bits in the data register are +* unaffected. +* +* @return None. +* +* @note +* +* The hardware must be built for dual channels if this function is used +* with any channel other than 1. If it is not, this function will assert. +* +* This API can only be used if the GPIO_IO ports in the IP are used for +* connecting to the external output ports. +* +*****************************************************************************/ +void XGpio_DiscreteSet(XGpio * InstancePtr, unsigned Channel, u32 Mask) +{ + u32 Current; + unsigned DataOffset; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((Channel == 1) || + ((Channel == 2) && (InstancePtr->IsDual == TRUE))); + + /* + * Calculate the offset to the data register of the GPIO once + */ + DataOffset = ((Channel - 1) * XGPIO_CHAN_OFFSET) + XGPIO_DATA_OFFSET; + + /* + * Read the contents of the data register, merge in Mask and write + * back results + */ + Current = XGpio_ReadReg(InstancePtr->BaseAddress, DataOffset); + Current |= Mask; + XGpio_WriteReg(InstancePtr->BaseAddress, DataOffset, Current); +} + + +/****************************************************************************/ +/** +* Set output discrete(s) to logic 0 for the specified GPIO channel. +* +* @param InstancePtr is a pointer to an XGpio instance to be worked on. +* @param Channel contains the channel of the GPIO (1 or 2) to operate on. +* @param Mask is the set of bits that will be set to 0 in the discrete +* data register. All other bits in the data register are +* unaffected. +* +* @return None. +* +* @note +* +* The hardware must be built for dual channels if this function is used +* with any channel other than 1. If it is not, this function will assert. +* +* This API can only be used if the GPIO_IO ports in the IP are used for +* connecting to the external output ports. +* +*****************************************************************************/ +void XGpio_DiscreteClear(XGpio * InstancePtr, unsigned Channel, u32 Mask) +{ + u32 Current; + unsigned DataOffset; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((Channel == 1) || + ((Channel == 2) && (InstancePtr->IsDual == TRUE))); + + /* + * Calculate the offset to the data register of the GPIO once + */ + DataOffset = ((Channel - 1) * XGPIO_CHAN_OFFSET) + XGPIO_DATA_OFFSET; + + /* + * Read the contents of the data register, merge in Mask and write + * back results + */ + Current = XGpio_ReadReg(InstancePtr->BaseAddress, DataOffset); + Current &= ~Mask; + XGpio_WriteReg(InstancePtr->BaseAddress, DataOffset, Current); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_g.c new file mode 100644 index 000000000..2bd5f4865 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_g.c @@ -0,0 +1,32 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xgpio.h" + +/* +* The configuration table for devices +*/ + +XGpio_Config XGpio_ConfigTable[] = +{ + { + XPAR_BTNS_4BITS_TRI_IO_DEVICE_ID, + XPAR_BTNS_4BITS_TRI_IO_BASEADDR, + XPAR_BTNS_4BITS_TRI_IO_INTERRUPT_PRESENT, + XPAR_BTNS_4BITS_TRI_IO_IS_DUAL + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_i.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_i.h new file mode 100755 index 000000000..327ee540a --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_i.h @@ -0,0 +1,93 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/******************************************************************************/ +/** +* @file xgpio_i.h +* +* This header file contains internal identifiers, which are those shared +* between the files of the driver. It is intended for internal use only. +* +* NOTES: +* +* None. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a rmm 03/13/02 First release +* 2.11a mta 03/21/07 Updated to new coding style +* </pre> +******************************************************************************/ + +#ifndef XGPIO_I_H /* prevent circular inclusions */ +#define XGPIO_I_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xgpio.h" + +/************************** Constant Definitions ****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions ****************************/ + +extern XGpio_Config XGpio_ConfigTable[]; + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_intr.c new file mode 100755 index 000000000..3aea00ece --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_intr.c @@ -0,0 +1,301 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +/*****************************************************************************/ +/** +* @file xgpio_intr.c +* +* Implements GPIO interrupt processing functions for the XGpio driver. +* See xgpio.h for more information about the driver. +* +* The functions in this file require the hardware device to be built with +* interrupt capabilities. The functions will assert if called using hardware +* that does not have interrupt capabilities. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 2.00a jhl 11/26/03 Initial release +* 2.11a mta 03/21/07 Updated to new coding style +* 2.12a sv 06/05/08 Updated driver to fix the XGpio_InterruptDisable function +* to properly update the Interrupt Enable register +* 3.00a sv 11/21/09 Updated to use HAL Processor APIs. Renamed the macros +* XGpio_mWriteReg to XGpio_WriteReg, and XGpio_mReadReg +* to XGpio_ReadReg. + +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ +#include "xgpio.h" + + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + + +/****************************************************************************/ +/** +* Enable the interrupt output signal. Interrupts enabled through +* XGpio_InterruptEnable() will not be passed through until the global enable +* bit is set by this function. This function is designed to allow all +* interrupts (both channels) to be enabled easily for exiting a critical +* section. This function will assert if the hardware device has not been +* built with interrupt capabilities. +* +* @param InstancePtr is the GPIO instance to operate on. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpio_InterruptGlobalEnable(XGpio * InstancePtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(InstancePtr->InterruptPresent == TRUE); + + XGpio_WriteReg(InstancePtr->BaseAddress, XGPIO_GIE_OFFSET, + XGPIO_GIE_GINTR_ENABLE_MASK); +} + + +/****************************************************************************/ +/** +* Disable the interrupt output signal. Interrupts enabled through +* XGpio_InterruptEnable() will no longer be passed through until the global +* enable bit is set by XGpio_InterruptGlobalEnable(). This function is +* designed to allow all interrupts (both channels) to be disabled easily for +* entering a critical section. This function will assert if the hardware +* device has not been built with interrupt capabilities. +* +* @param InstancePtr is the GPIO instance to operate on. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpio_InterruptGlobalDisable(XGpio * InstancePtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(InstancePtr->InterruptPresent == TRUE); + + + XGpio_WriteReg(InstancePtr->BaseAddress, XGPIO_GIE_OFFSET, 0x0); + +} + + +/****************************************************************************/ +/** +* Enable interrupts. The global interrupt must also be enabled by calling +* XGpio_InterruptGlobalEnable() for interrupts to occur. This function will +* assert if the hardware device has not been built with interrupt capabilities. +* +* @param InstancePtr is the GPIO instance to operate on. +* @param Mask is the mask to enable. Bit positions of 1 are enabled. +* This mask is formed by OR'ing bits from XGPIO_IR* bits which +* are contained in xgpio_l.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpio_InterruptEnable(XGpio * InstancePtr, u32 Mask) +{ + u32 Register; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(InstancePtr->InterruptPresent == TRUE); + + /* + * Read the interrupt enable register and only enable the specified + * interrupts without disabling or enabling any others. + */ + + Register = XGpio_ReadReg(InstancePtr->BaseAddress, XGPIO_IER_OFFSET); + XGpio_WriteReg(InstancePtr->BaseAddress, XGPIO_IER_OFFSET, + Register | Mask); + +} + + +/****************************************************************************/ +/** +* Disable interrupts. This function allows specific interrupts for each +* channel to be disabled. This function will assert if the hardware device +* has not been built with interrupt capabilities. +* +* @param InstancePtr is the GPIO instance to operate on. +* @param Mask is the mask to disable. Bits set to 1 are disabled. This +* mask is formed by OR'ing bits from XGPIO_IR* bits which are +* contained in xgpio_l.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpio_InterruptDisable(XGpio * InstancePtr, u32 Mask) +{ + u32 Register; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(InstancePtr->InterruptPresent == TRUE); + + /* + * Read the interrupt enable register and only disable the specified + * interrupts without enabling or disabling any others. + */ + Register = XGpio_ReadReg(InstancePtr->BaseAddress, XGPIO_IER_OFFSET); + XGpio_WriteReg(InstancePtr->BaseAddress, XGPIO_IER_OFFSET, + Register & (~Mask)); + +} + +/****************************************************************************/ +/** +* Clear pending interrupts with the provided mask. This function should be +* called after the software has serviced the interrupts that are pending. +* This function will assert if the hardware device has not been built with +* interrupt capabilities. +* +* @param InstancePtr is the GPIO instance to operate on. +* @param Mask is the mask to clear pending interrupts for. Bit positions +* of 1 are cleared. This mask is formed by OR'ing bits from +* XGPIO_IR* bits which are contained in xgpio_l.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpio_InterruptClear(XGpio * InstancePtr, u32 Mask) +{ + u32 Register; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(InstancePtr->InterruptPresent == TRUE); + + /* + * Read the interrupt status register and only clear the interrupts + * that are specified without affecting any others. Since the register + * is a toggle on write, make sure any bits to be written are already + * set. + */ + Register = XGpio_ReadReg(InstancePtr->BaseAddress, XGPIO_ISR_OFFSET); + XGpio_WriteReg(InstancePtr->BaseAddress, XGPIO_ISR_OFFSET, + Register & Mask); + + +} + + +/****************************************************************************/ +/** +* Returns the interrupt enable mask. This function will assert if the +* hardware device has not been built with interrupt capabilities. +* +* @param InstancePtr is the GPIO instance to operate on. +* +* @return A mask of bits made from XGPIO_IR* bits which are contained in +* xgpio_l.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +u32 XGpio_InterruptGetEnabled(XGpio * InstancePtr) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(InstancePtr->InterruptPresent == TRUE); + + return XGpio_ReadReg(InstancePtr->BaseAddress, XGPIO_IER_OFFSET); +} + + +/****************************************************************************/ +/** +* Returns the status of interrupt signals. Any bit in the mask set to 1 +* indicates that the channel associated with the bit has asserted an interrupt +* condition. This function will assert if the hardware device has not been +* built with interrupt capabilities. +* +* @param InstancePtr is the GPIO instance to operate on. +* +* @return A pointer to a mask of bits made from XGPIO_IR* bits which are +* contained in xgpio_l.h. +* +* @note +* +* The interrupt status indicates the status of the device irregardless if +* the interrupts from the devices have been enabled or not through +* XGpio_InterruptEnable(). +* +*****************************************************************************/ +u32 XGpio_InterruptGetStatus(XGpio * InstancePtr) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(InstancePtr->InterruptPresent == TRUE); + + + return XGpio_ReadReg(InstancePtr->BaseAddress, XGPIO_ISR_OFFSET); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_l.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_l.h new file mode 100755 index 000000000..5b3480706 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_l.h @@ -0,0 +1,235 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpio_l.h +* +* This header file contains identifiers and driver functions (or +* macros) that can be used to access the device. The user should refer to the +* hardware device specification for more details of the device operation. +* +* The macros that are available in this file use a multiply to calculate the +* addresses of registers. The user can control whether that multiply is done +* at run time or at compile time. A constant passed as the channel parameter +* will cause the multiply to be done at compile time. A variable passed as the +* channel parameter will cause it to occur at run time. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a jhl 04/24/02 First release of low level driver +* 2.00a jhl 11/26/03 Added support for dual channels and interrupts. This +* change required the functions to be changed such that +* the interface is not compatible with previous versions. +* See the examples in the example directory for macros +* to help compile an application that was designed for +* previous versions of the driver. The interrupt registers +* are accessible using the ReadReg and WriteReg macros and +* a channel parameter was added to the other macros. +* 2.11a mta 03/21/07 Updated to new coding style +* 2.12a sv 11/21/07 Updated driver to support access through DCR bus. +* 3.00a sv 11/21/09 Renamed the macros XGpio_mWriteReg to XGpio_WriteReg +* XGpio_mReadReg to XGpio_ReadReg. +* Removed the macros XGpio_mSetDataDirection, +* XGpio_mGetDataReg and XGpio_mSetDataReg. Users +* should use XGpio_WriteReg/XGpio_ReadReg to achieve the +* same functionality. +* </pre> +* +******************************************************************************/ + +#ifndef XGPIO_L_H /* prevent circular inclusions */ +#define XGPIO_L_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/* + * XPAR_XGPIO_USE_DCR_BRIDGE has to be set to 1 if the GPIO device is + * accessed through a DCR bus connected to a bridge + */ +#define XPAR_XGPIO_USE_DCR_BRIDGE 0 + + +#if (XPAR_XGPIO_USE_DCR_BRIDGE != 0) +#include "xio_dcr.h" +#endif + +/************************** Constant Definitions *****************************/ + +/** @name Registers + * + * Register offsets for this device. + * @{ + */ +#if (XPAR_XGPIO_USE_DCR_BRIDGE != 0) + +#define XGPIO_DATA_OFFSET 0x0 /**< Data register for 1st channel */ +#define XGPIO_TRI_OFFSET 0x1 /**< I/O direction reg for 1st channel */ +#define XGPIO_DATA2_OFFSET 0x2 /**< Data register for 2nd channel */ +#define XGPIO_TRI2_OFFSET 0x3 /**< I/O direction reg for 2nd channel */ + +#define XGPIO_GIE_OFFSET 0x47 /**< Global interrupt enable register */ +#define XGPIO_ISR_OFFSET 0x48 /**< Interrupt status register */ +#define XGPIO_IER_OFFSET 0x4A /**< Interrupt enable register */ + +#else + +#define XGPIO_DATA_OFFSET 0x0 /**< Data register for 1st channel */ +#define XGPIO_TRI_OFFSET 0x4 /**< I/O direction reg for 1st channel */ +#define XGPIO_DATA2_OFFSET 0x8 /**< Data register for 2nd channel */ +#define XGPIO_TRI2_OFFSET 0xC /**< I/O direction reg for 2nd channel */ + +#define XGPIO_GIE_OFFSET 0x11C /**< Glogal interrupt enable register */ +#define XGPIO_ISR_OFFSET 0x120 /**< Interrupt status register */ +#define XGPIO_IER_OFFSET 0x128 /**< Interrupt enable register */ + +#endif + +/* @} */ + +/* The following constant describes the offset of each channels data and + * tristate register from the base address. + */ +#define XGPIO_CHAN_OFFSET 8 + +/** @name Interrupt Status and Enable Register bitmaps and masks + * + * Bit definitions for the interrupt status register and interrupt enable + * registers. + * @{ + */ +#define XGPIO_IR_MASK 0x3 /**< Mask of all bits */ +#define XGPIO_IR_CH1_MASK 0x1 /**< Mask for the 1st channel */ +#define XGPIO_IR_CH2_MASK 0x2 /**< Mask for the 2nd channel */ +/*@}*/ + + +/** @name Global Interrupt Enable Register bitmaps and masks + * + * Bit definitions for the Global Interrupt Enable register + * @{ + */ +#define XGPIO_GIE_GINTR_ENABLE_MASK 0x80000000 +/*@}*/ + + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + /* + * Define the appropriate I/O access method to memory mapped I/O or DCR. + */ +#if (XPAR_XGPIO_USE_DCR_BRIDGE != 0) + +#define XGpio_In32 XIo_DcrIn +#define XGpio_Out32 XIo_DcrOut + +#else + +#define XGpio_In32 Xil_In32 +#define XGpio_Out32 Xil_Out32 + +#endif + + +/****************************************************************************/ +/** +* +* Write a value to a GPIO register. A 32 bit write is performed. If the +* GPIO core is implemented in a smaller width, only the least significant data +* is written. +* +* @param BaseAddress is the base address of the GPIO device. +* @param RegOffset is the register offset from the base to write to. +* @param Data is the data written to the register. +* +* @return None. +* +* @note C-style signature: +* void XGpio_WriteReg(u32 BaseAddress, u32 RegOffset, u32 Data) +* +****************************************************************************/ +#define XGpio_WriteReg(BaseAddress, RegOffset, Data) \ + XGpio_Out32((BaseAddress) + (RegOffset), (u32)(Data)) + +/****************************************************************************/ +/** +* +* Read a value from a GPIO register. A 32 bit read is performed. If the +* GPIO core is implemented in a smaller width, only the least +* significant data is read from the register. The most significant data +* will be read as 0. +* +* @param BaseAddress is the base address of the GPIO device. +* @param RegOffset is the register offset from the base to read from. +* +* @return Data read from the register. +* +* @note C-style signature: +* u32 XGpio_ReadReg(u32 BaseAddress, u32 RegOffset) +* +****************************************************************************/ +#define XGpio_ReadReg(BaseAddress, RegOffset) \ + XGpio_In32((BaseAddress) + (RegOffset)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_selftest.c new file mode 100755 index 000000000..ef9422645 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_selftest.c @@ -0,0 +1,116 @@ +/****************************************************************************** +* +* (c) Copyright 2003-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xgpio_selftest.c +* +* The implementation of the XGpio driver's self test function. +* See xgpio.h for more information about the driver. +* +* @note +* +* None +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a rmm 02/04/02 First release +* 2.00a jhl 01/13/04 Addition of dual channels and interrupts. +* 2.11a mta 03/21/07 Updated to new coding style +* 3.00a sv 11/21/09 Updated to use HAL Processor APIs. +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ +#include "xgpio.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + + +/******************************************************************************/ +/** +* Run a self-test on the driver/device. This function does a minimal test +* in which the data register is read. It only does a read without any kind +* of test because the hardware has been parameterized such that it may be only +* an input such that the state of the inputs won't be known. +* +* All other hardware features of the device are not guaranteed to be in the +* hardware since they are parameterizable. +* +* +* @param InstancePtr is a pointer to the XGpio instance to be worked on. +* This parameter must have been previously initialized with +* XGpio_Initialize(). +* +* @return XST_SUCCESS always. If the GPIO device was not present in the +* hardware a bus error could be generated. Other indicators of a +* bus error, such as registers in bridges or buses, may be +* necessary to determine if this function caused a bus error. +* +* @note None. +* +******************************************************************************/ +int XGpio_SelfTest(XGpio * InstancePtr) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read from the data register of channel 1 which is always guaranteed + * to be in the hardware device. Since the data may be configured as + * all inputs, there is not way to guarantee the value read so don't + * test it. + */ + (void) XGpio_DiscreteRead(InstancePtr, 1); + + return (XST_SUCCESS); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_sinit.c new file mode 100755 index 000000000..b9995614b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpio_v3_01_a/src/xgpio_sinit.c @@ -0,0 +1,159 @@ +/****************************************************************************** +* +* (c) Copyright 2003-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xgpio_sinit.c +* +* The implementation of the XGpio driver's static initialzation +* functionality. +* +* @note +* +* None +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 2.01a jvb 10/13/05 First release +* 2.11a mta 03/21/07 Updated to new coding style +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xstatus.h" +#include "xparameters.h" +#include "xgpio_i.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + + +/************************** Function Prototypes *****************************/ + + +/******************************************************************************/ +/** +* Lookup the device configuration based on the unique device ID. The table +* ConfigTable contains the configuration info for each device in the system. +* +* @param DeviceId is the device identifier to lookup. +* +* @return +* - A pointer of data type XGpio_Config which points to the +* device configuration if DeviceID is found. +* - NULL if DeviceID is not found. +* +* @note None. +* +******************************************************************************/ +XGpio_Config *XGpio_LookupConfig(u16 DeviceId) +{ + XGpio_Config *CfgPtr = NULL; + + int Index; + + for (Index = 0; Index < XPAR_XGPIO_NUM_INSTANCES; Index++) { + if (XGpio_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XGpio_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} + + +/****************************************************************************/ +/** +* Initialize the XGpio instance provided by the caller based on the +* given DeviceID. +* +* Nothing is done except to initialize the InstancePtr. +* +* @param InstancePtr is a pointer to an XGpio instance. The memory the +* pointer references must be pre-allocated by the caller. Further +* calls to manipulate the instance/driver through the XGpio API +* must be made with this pointer. +* @param DeviceId is the unique id of the device controlled by this XGpio +* instance. Passing in a device id associates the generic XGpio +* instance to a specific device, as chosen by the caller or +* application developer. +* +* @return +* - XST_SUCCESS if the initialization was successfull. +* - XST_DEVICE_NOT_FOUND if the device configuration data was not +* found for a device with the supplied device ID. +* +* @note None. +* +*****************************************************************************/ +int XGpio_Initialize(XGpio * InstancePtr, u16 DeviceId) +{ + XGpio_Config *ConfigPtr; + + /* + * Assert arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + + /* + * Lookup configuration data in the device configuration table. + * Use this configuration info down below when initializing this + * driver. + */ + ConfigPtr = XGpio_LookupConfig(DeviceId); + if (ConfigPtr == (XGpio_Config *) NULL) { + InstancePtr->IsReady = 0; + return (XST_DEVICE_NOT_FOUND); + } + + return XGpio_CfgInitialize(InstancePtr, ConfigPtr, + ConfigPtr->BaseAddress); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/Makefile new file mode 100755 index 000000000..f7eb27bf1 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xgpiops_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling gpiops" + +xgpiops_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xgpiops_includes + +xgpiops_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops.c new file mode 100755 index 000000000..4bfb203b2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops.c @@ -0,0 +1,604 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops.c +* +* The XGpioPs driver. Functions in this file are the minimum required functions +* for this driver. See xgpiops.h for a detailed description of the driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sv 01/15/10 First Release +* 1.01a sv 04/15/12 Removed the APIs XGpioPs_SetMode, XGpioPs_SetModePin +* XGpioPs_GetMode, XGpioPs_GetModePin as they are not +* relevant to Zynq device. The interrupts are disabled +* for output pins on all banks during initialization. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xgpiops.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/* + * This structure defines the mapping of the pin numbers to the banks when + * the driver APIs are used for working on the individual pins. + */ +unsigned int XGpioPsPinTable[] = { + 31, /* 0 - 31, Bank 0 */ + 53, /* 32 - 53, Bank 1 */ + 85, /* 54 - 85, Bank 2 */ + 117 /* 86 - 117 Bank 3 */ +}; + +/************************** Function Prototypes ******************************/ + +extern void StubHandler(void *CallBackRef, int Bank, u32 Status); + +/*****************************************************************************/ +/* +* +* This function initializes a XGpioPs instance/driver. +* All members of the XGpioPs instance structure are initialized and +* StubHandlers are assigned to the Bank Status Handlers. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param ConfigPtr points to the XGpioPs device configuration structure. +* @param EffectiveAddr is the device base address in the virtual memory +* address space. If the address translation is not used then the +* physical address should be passed. +* Unexpected errors may occur if the address mapping is changed +* after this function is invoked. +* +* @return XST_SUCCESS always. +* +* @note None. +* +******************************************************************************/ +int XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr, + u32 EffectiveAddr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + /* + * Set some default values for instance data, don't indicate the device + * is ready to use until everything has been initialized successfully. + */ + InstancePtr->IsReady = 0; + InstancePtr->GpioConfig.BaseAddr = EffectiveAddr; + InstancePtr->GpioConfig.DeviceId = ConfigPtr->DeviceId; + InstancePtr->Handler = StubHandler; + + /* + * By default, interrupts are not masked in GPIO. Disable + * interrupts for all pins in all the 4 banks. + */ + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + XGPIOPS_INTDIS_OFFSET, 0xFFFFFFFF); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((1) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTDIS_OFFSET, 0xFFFFFFFF); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((2) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTDIS_OFFSET, 0xFFFFFFFF); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((3) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTDIS_OFFSET, 0xFFFFFFFF); + + /* + * Indicate the component is now ready to use. + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* Read the Data register of the specified GPIO bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* +* @return Current value of the Data register. +* +* @note This function is used for reading the state of all the GPIO pins +* of specified bank. +* +*****************************************************************************/ +u32 XGpioPs_Read(XGpioPs *InstancePtr, u8 Bank) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Bank < XGPIOPS_MAX_BANKS); + + return XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_DATA_BANK_OFFSET) + + XGPIOPS_DATA_OFFSET); +} + +/****************************************************************************/ +/** +* +* Read Data from the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number for which the data has to be read. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* See xgpiops.h for the mapping of the pin numbers in the banks. +* +* @return Current value of the Pin (0 or 1). +* +* @note This function is used for reading the state of the specified +* GPIO pin. +* +*****************************************************************************/ +int XGpioPs_ReadPin(XGpioPs *InstancePtr, int Pin) +{ + u8 Bank; + u8 PinNumber; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + return (XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_DATA_BANK_OFFSET) + + XGPIOPS_DATA_OFFSET) >> PinNumber) & 1; + +} + +/****************************************************************************/ +/** +* +* Write to the Data register of the specified GPIO bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param Data is the value to be written to the Data register. +* +* @return None. +* +* @note This function is used for writing to all the GPIO pins of +* the bank. The previous state of the pins is not maintained. +* +*****************************************************************************/ +void XGpioPs_Write(XGpioPs *InstancePtr, u8 Bank, u32 Data) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_DATA_BANK_OFFSET) + + XGPIOPS_DATA_OFFSET, Data); +} + +/****************************************************************************/ +/** +* +* Write data to the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number to which the Data is to be written. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* @param Data is the data to be written to the specified pin (0 or 1). +* +* @return None. +* +* @note This function does a masked write to the specified pin of +* the specified GPIO bank. The previous state of other pins +* is maintained. +* +*****************************************************************************/ +void XGpioPs_WritePin(XGpioPs *InstancePtr, int Pin, int Data) +{ + u32 RegOffset; + u32 Value; + u8 Bank; + u8 PinNumber; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + if (PinNumber > 15) { + /* + * There are only 16 data bits in bit maskable register. + */ + PinNumber -= 16; + RegOffset = XGPIOPS_DATA_MSW_OFFSET; + } else { + RegOffset = XGPIOPS_DATA_LSW_OFFSET; + } + + /* + * Get the 32 bit value to be written to the Mask/Data register where + * the upper 16 bits is the mask and lower 16 bits is the data. + */ + Data &= 0x01; + Value = ~(1 << (PinNumber + 16)) & ((Data << PinNumber) | 0xFFFF0000); + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_DATA_MASK_OFFSET) + + RegOffset, Value); +} + + + +/****************************************************************************/ +/** +* +* Set the Direction of the pins of the specified GPIO Bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param Direction is the 32 bit mask of the Pin direction to be set for +* all the pins in the Bank. Bits with 0 are set to Input mode, +* bits with 1 are set to Output Mode. +* +* @return None. +* +* @note This function is used for setting the direction of all the pins +* in the specified bank. The previous state of the pins is +* not maintained. +* +*****************************************************************************/ +void XGpioPs_SetDirection(XGpioPs *InstancePtr, u8 Bank, u32 Direction) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET, Direction); +} + +/****************************************************************************/ +/** +* +* Set the Direction of the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number to which the Data is to be written. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* @param Direction is the direction to be set for the specified pin. +* Valid values are 0 for Input Direction, 1 for Output Direction. +* +* @return None. +* +*****************************************************************************/ +void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, int Pin, int Direction) +{ + u8 Bank; + u8 PinNumber; + u32 DirModeReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + Xil_AssertVoid((Direction == 0) || (Direction == 1)); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + DirModeReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET); + + if (Direction) { /* Output Direction */ + DirModeReg |= (1 << PinNumber); + } else { /* Input Direction */ + DirModeReg &= ~ (1 << PinNumber); + } + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET, DirModeReg); +} + +/****************************************************************************/ +/** +* +* Get the Direction of the pins of the specified GPIO Bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* +* return Returns a 32 bit mask of the Direction register. Bits with 0 are +* in Input mode, bits with 1 are in Output Mode. +* +* @note None. +* +*****************************************************************************/ +u32 XGpioPs_GetDirection(XGpioPs *InstancePtr, u8 Bank) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Bank < XGPIOPS_MAX_BANKS); + + return XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET); +} + +/****************************************************************************/ +/** +* +* Get the Direction of the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number for which the Direction is to be +* retrieved. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* +* @return Direction of the specified pin. +* - 0 for Input Direction +* - 1 for Output Direction +* +* @note None. +* +*****************************************************************************/ +int XGpioPs_GetDirectionPin(XGpioPs *InstancePtr, int Pin) +{ + u8 Bank; + u8 PinNumber; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + return (XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET) >> PinNumber) & 1; +} + +/****************************************************************************/ +/** +* +* Set the Output Enable of the pins of the specified GPIO Bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param OpEnable is the 32 bit mask of the Output Enables to be set for +* all the pins in the Bank. The Output Enable of bits with 0 are +* disabled, the Output Enable of bits with 1 are enabled. +* +* @return None. +* +* @note This function is used for setting the Output Enables of all the +* pins in the specified bank. The previous state of the Output +* Enables is not maintained. +* +*****************************************************************************/ +void XGpioPs_SetOutputEnable(XGpioPs *InstancePtr, u8 Bank, u32 OpEnable) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET, OpEnable); +} + +/****************************************************************************/ +/** +* +* Set the Output Enable of the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number to which the Data is to be written. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* @param OpEnable specifies whether the Output Enable for the specified +* pin should be enabled. +* Valid values are 0 for Disabling Output Enable, +* 1 for Enabling Output Enable. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, int Pin, int OpEnable) +{ + u8 Bank; + u8 PinNumber; + u32 OpEnableReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + Xil_AssertVoid((OpEnable == 0) || (OpEnable == 1)); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + OpEnableReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET); + + if (OpEnable) { /* Enable Output Enable */ + OpEnableReg |= (1 << PinNumber); + } else { /* Disable Output Enable */ + OpEnableReg &= ~ (1 << PinNumber); + } + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET, OpEnableReg); +} +/****************************************************************************/ +/** +* +* Get the Output Enable status of the pins of the specified GPIO Bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* +* return Returns a a 32 bit mask of the Output Enable register. +* Bits with 0 are in Disabled state, bits with 1 are in +* Enabled State. +* +* @note None. +* +*****************************************************************************/ +u32 XGpioPs_GetOutputEnable(XGpioPs *InstancePtr, u8 Bank) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Bank < XGPIOPS_MAX_BANKS); + + return XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET); +} + +/****************************************************************************/ +/** +* +* Get the Output Enable status of the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number for which the Output Enable status is to +* be retrieved. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* +* @return Output Enable of the specified pin. +* - 0 if Output Enable is disabled for this pin +* - 1 if Output Enable is enabled for this pin +* +* @note None. +* +*****************************************************************************/ +int XGpioPs_GetOutputEnablePin(XGpioPs *InstancePtr, int Pin) +{ + u8 Bank; + u8 PinNumber; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + return (XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET) >> PinNumber) & 1; +} + +/****************************************************************************/ +/* +* +* Get the Bank number and the Pin number in the Bank, for the given PinNumber +* in the GPIO device. +* +* @param PinNumber is the Pin number in the GPIO device. +* @param BankNumber returns the Bank in which this GPIO pin is present. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param PinNumberInBank returns the Pin Number within the Bank. +* +* return None; +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_GetBankPin(u8 PinNumber, u8 *BankNumber, u8 *PinNumberInBank) +{ + for (*BankNumber = 0; *BankNumber < 4; (*BankNumber)++) + if (PinNumber <= XGpioPsPinTable[*BankNumber]) + break; + + if (*BankNumber == 0) { + *PinNumberInBank = PinNumber; + } else { + *PinNumberInBank = PinNumber % + (XGpioPsPinTable[*BankNumber - 1] + 1); + } +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops.h new file mode 100755 index 000000000..1b8eb4ff2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops.h @@ -0,0 +1,262 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops.h +* +* The Xilinx PS GPIO driver. This driver supports the Xilinx PS GPIO +* Controller. +* +* The GPIO Controller supports the following features: +* - 4 banks +* - Masked writes (There are no masked reads) +* - Bypass mode +* - Configurable Interrupts (Level/Edge) +* +* This driver is intended to be RTOS and processor independent. Any needs for +* dynamic memory management, threads or thread mutual exclusion, virtual +* memory, or cache control must be satisfied by the layer above this driver. + +* This driver supports all the features listed above, if applicable. +* +* <b>Driver Description</b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate to the GPIO. +* +* <b>Interrupts</b> +* +* The driver provides interrupt management functions and an interrupt handler. +* Users of this driver need to provide callback functions. An interrupt handler +* example is available with the driver. +* +* <b>Threads</b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* <b>Asserts</b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* <b>Building the driver</b> +* +* The XGpioPs driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* <br><br> +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sv 01/15/10 First Release +* 1.01a sv 04/15/12 Removed the APIs XGpioPs_SetMode, XGpioPs_SetModePin +* XGpioPs_GetMode, XGpioPs_GetModePin as they are not +* relevant to Zynq device.The interrupts are disabled +* for output pins on all banks during initialization. +* 1.02a hk 08/22/13 Added low level reset API +* </pre> +* +******************************************************************************/ +#ifndef XGPIOPS_H /* prevent circular inclusions */ +#define XGPIOPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xgpiops_hw.h" + +/************************** Constant Definitions *****************************/ + +/** @name Interrupt types + * @{ + * The following constants define the interrupt types that can be set for each + * GPIO pin. + */ +#define XGPIOPS_IRQ_TYPE_EDGE_RISING 0 /**< Interrupt on Rising edge */ +#define XGPIOPS_IRQ_TYPE_EDGE_FALLING 1 /**< Interrupt Falling edge */ +#define XGPIOPS_IRQ_TYPE_EDGE_BOTH 2 /**< Interrupt on both edges */ +#define XGPIOPS_IRQ_TYPE_LEVEL_HIGH 3 /**< Interrupt on high level */ +#define XGPIOPS_IRQ_TYPE_LEVEL_LOW 4 /**< Interrupt on low level */ +/*@}*/ + +#define XGPIOPS_BANK0 0 /**< GPIO Bank 0 */ +#define XGPIOPS_BANK1 1 /**< GPIO Bank 1 */ +#define XGPIOPS_BANK2 2 /**< GPIO Bank 2 */ +#define XGPIOPS_BANK3 3 /**< GPIO Bank 3 */ + +#define XGPIOPS_MAX_BANKS 4 /**< Max banks in a GPIO device */ +#define XGPIOPS_BANK_MAX_PINS 32 /**< Max pins in a GPIO bank */ + +#define XGPIOPS_DEVICE_MAX_PIN_NUM 118 /*< Max pins in the GPIO device + * 0 - 31, Bank 0 + * 32 - 53, Bank 1 + * 54 - 85, Bank 2 + * 86 - 117, Bank 3 + */ + +/**************************** Type Definitions *******************************/ + +/****************************************************************************/ +/** + * This handler data type allows the user to define a callback function to + * handle the interrupts for the GPIO device. The application using this + * driver is expected to define a handler of this type, to support interrupt + * driven mode. The handler executes in an interrupt context such that minimal + * processing should be performed. + * + * @param CallBackRef is a callback reference passed in by the upper layer + * when setting the callback functions for a GPIO bank. It is + * passed back to the upper layer when the callback is invoked. Its + * type is not important to the driver component, so it is a void + * pointer. + * @param Bank is the bank for which the interrupt status has changed. + * @param Status is the Interrupt status of the GPIO bank. + * + *****************************************************************************/ +typedef void (*XGpioPs_Handler) (void *CallBackRef, int Bank, u32 Status); + +/** + * This typedef contains configuration information for a device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Register base address */ +} XGpioPs_Config; + +/** + * The XGpioPs driver instance data. The user is required to allocate a + * variable of this type for the GPIO device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XGpioPs_Config GpioConfig; /**< Device configuration */ + u32 IsReady; /**< Device is initialized and ready */ + XGpioPs_Handler Handler; /**< Status handlers for all banks */ + void *CallBackRef; /**< Callback ref for bank handlers */ +} XGpioPs; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/* + * Functions in xgpiops.c + */ +int XGpioPs_CfgInitialize(XGpioPs *InstancePtr, XGpioPs_Config *ConfigPtr, + u32 EffectiveAddr); + +/* + * Bank APIs in xgpiops.c + */ +u32 XGpioPs_Read(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_Write(XGpioPs *InstancePtr, u8 Bank, u32 Data); +void XGpioPs_SetDirection(XGpioPs *InstancePtr, u8 Bank, u32 Direction); +u32 XGpioPs_GetDirection(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_SetOutputEnable(XGpioPs *InstancePtr, u8 Bank, u32 Enable); +u32 XGpioPs_GetOutputEnable(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_GetBankPin(u8 PinNumber, u8 *BankNumber, u8 *PinNumberInBank); + +/* + * Pin APIs in xgpiops.c + */ +int XGpioPs_ReadPin(XGpioPs *InstancePtr, int Pin); +void XGpioPs_WritePin(XGpioPs *InstancePtr, int Pin, int Data); +void XGpioPs_SetDirectionPin(XGpioPs *InstancePtr, int Pin, int Direction); +int XGpioPs_GetDirectionPin(XGpioPs *InstancePtr, int Pin); +void XGpioPs_SetOutputEnablePin(XGpioPs *InstancePtr, int Pin, int Enable); +int XGpioPs_GetOutputEnablePin(XGpioPs *InstancePtr, int Pin); + +/* + * Diagnostic functions in xgpiops_selftest.c + */ +int XGpioPs_SelfTest(XGpioPs *InstancePtr); + +/* + * Functions in xgpiops_intr.c + */ +/* + * Bank APIs in xgpiops_intr.c + */ +void XGpioPs_IntrEnable(XGpioPs *InstancePtr, u8 Bank, u32 Mask); +void XGpioPs_IntrDisable(XGpioPs *InstancePtr, u8 Bank, u32 Mask); +u32 XGpioPs_IntrGetEnabled(XGpioPs *InstancePtr, u8 Bank); +u32 XGpioPs_IntrGetStatus(XGpioPs *InstancePtr, u8 Bank); +void XGpioPs_IntrClear(XGpioPs *InstancePtr, u8 Bank, u32 Mask); +void XGpioPs_SetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 IntrType, + u32 IntrPolarity, u32 IntrOnAny); +void XGpioPs_GetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 *IntrType, + u32 *IntrPolarity, u32 *IntrOnAny); +void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef, + XGpioPs_Handler FuncPtr); +void XGpioPs_IntrHandler(XGpioPs *InstancePtr); + +/* + * Pin APIs in xgpiops_intr.c + */ +void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, int Pin, u8 IrqType); +u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, int Pin); + +void XGpioPs_IntrEnablePin(XGpioPs *InstancePtr, int Pin); +void XGpioPs_IntrDisablePin(XGpioPs *InstancePtr, int Pin); +int XGpioPs_IntrGetEnabledPin(XGpioPs *InstancePtr, int Pin); +int XGpioPs_IntrGetStatusPin(XGpioPs *InstancePtr, int Pin); +void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, int Pin); + +/* + * Functions in xgpiops_sinit.c + */ +XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_g.c new file mode 100644 index 000000000..23af564f8 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_g.c @@ -0,0 +1,30 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xgpiops.h" + +/* +* The configuration table for devices +*/ + +XGpioPs_Config XGpioPs_ConfigTable[] = +{ + { + XPAR_PS7_GPIO_0_DEVICE_ID, + XPAR_PS7_GPIO_0_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_hw.c new file mode 100755 index 000000000..0bd51df9c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_hw.c @@ -0,0 +1,171 @@ +/****************************************************************************** +* +* (c) Copyright 2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_hw.c +* +* This file contains low level GPIO functions. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.02a hk 08/22/13 First Release +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xgpiops_hw.h" +#include "xgpiops.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + + +/*****************************************************************************/ +/* +* +* This function resets the GPIO module by writing reset values to +* all registers +* +* @param Base address of GPIO module +* +* @return None +* +* @note None. +* +******************************************************************************/ +void XGpioPs_ResetHw(u32 BaseAddress) +{ + u32 BankCount; + + /* + * Write reset values to all mask data registers + */ + for(BankCount = 2; BankCount < XGPIOPS_MAX_BANKS; BankCount++) { + + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_DATA_MASK_OFFSET) + + XGPIOPS_DATA_LSW_OFFSET), 0x0); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_DATA_MASK_OFFSET) + + XGPIOPS_DATA_MSW_OFFSET), 0x0); + } + /* + * Write reset values to all output data registers + */ + for(BankCount = 2; BankCount < XGPIOPS_MAX_BANKS; BankCount++) { + + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_DATA_BANK_OFFSET) + + XGPIOPS_DATA_OFFSET), 0x0); + } + + /* + * Reset all registers of all 4 banks + */ + for(BankCount = 0; BankCount < XGPIOPS_MAX_BANKS; BankCount++) { + + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_DIRM_OFFSET), 0x0); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_OUTEN_OFFSET), 0x0); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTMASK_OFFSET), 0x0); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTEN_OFFSET), 0x0); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTDIS_OFFSET), 0x0); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET), 0x0); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET), 0x0); + XGpioPs_WriteReg(BaseAddress, + ((BankCount * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET), 0x0); + } + + /* + * Bank 0 Int type + */ + XGpioPs_WriteReg(BaseAddress, XGPIOPS_INTTYPE_OFFSET, + XGPIOPS_INTTYPE_BANK0_RESET); + /* + * Bank 1 Int type + */ + XGpioPs_WriteReg(BaseAddress, + (XGPIOPS_REG_MASK_OFFSET + XGPIOPS_INTTYPE_OFFSET), + XGPIOPS_INTTYPE_BANK1_RESET); + /* + * Bank 2 Int type + */ + XGpioPs_WriteReg(BaseAddress, + ((2*XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET), + XGPIOPS_INTTYPE_BANK2_RESET); + /* + * Bank 3 Int type + */ + XGpioPs_WriteReg(BaseAddress, + ((3*XGPIOPS_REG_MASK_OFFSET) + XGPIOPS_INTTYPE_OFFSET), + XGPIOPS_INTTYPE_BANK3_RESET); + +} + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_hw.h new file mode 100755 index 000000000..28c4993fa --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_hw.h @@ -0,0 +1,158 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_hw.h +* +* This header file contains the identifiers and basic driver functions (or +* macros) that can be used to access the device. Other driver functions +* are defined in xgpiops.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------- +* 1.00a sv 01/15/10 First Release +* 1.02a hk 08/22/13 Added low level reset API function prototype and +* related constant definitions +* </pre> +* +******************************************************************************/ +#ifndef XGPIOPS_HW_H /* prevent circular inclusions */ +#define XGPIOPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register offsets for the GPIO. Each register is 32 bits. + * @{ + */ +#define XGPIOPS_DATA_LSW_OFFSET 0x000 /* Mask and Data Register LSW, WO */ +#define XGPIOPS_DATA_MSW_OFFSET 0x004 /* Mask and Data Register MSW, WO */ +#define XGPIOPS_DATA_OFFSET 0x040 /* Data Register, RW */ +#define XGPIOPS_DIRM_OFFSET 0x204 /* Direction Mode Register, RW */ +#define XGPIOPS_OUTEN_OFFSET 0x208 /* Output Enable Register, RW */ +#define XGPIOPS_INTMASK_OFFSET 0x20C /* Interrupt Mask Register, RO */ +#define XGPIOPS_INTEN_OFFSET 0x210 /* Interrupt Enable Register, WO */ +#define XGPIOPS_INTDIS_OFFSET 0x214 /* Interrupt Disable Register, WO*/ +#define XGPIOPS_INTSTS_OFFSET 0x218 /* Interrupt Status Register, RO */ +#define XGPIOPS_INTTYPE_OFFSET 0x21C /* Interrupt Type Register, RW */ +#define XGPIOPS_INTPOL_OFFSET 0x220 /* Interrupt Polarity Register, RW */ +#define XGPIOPS_INTANY_OFFSET 0x224 /* Interrupt On Any Register, RW */ +/* @} */ + +/** @name Register offsets for each Bank. + * @{ + */ +#define XGPIOPS_DATA_MASK_OFFSET 0x8 /* Data/Mask Registers offset */ +#define XGPIOPS_DATA_BANK_OFFSET 0x4 /* Data Registers offset */ +#define XGPIOPS_REG_MASK_OFFSET 0x40 /* Registers offset */ +/* @} */ + +/* For backwards compatibility */ +#define XGPIOPS_BYPM_MASK_OFFSET XGPIOPS_REG_MASK_OFFSET + +/** @name Interrupt type reset values for each bank + * @{ + */ +#define XGPIOPS_INTTYPE_BANK0_RESET 0xFFFFFFFF +#define XGPIOPS_INTTYPE_BANK1_RESET 0x3FFFFFFF +#define XGPIOPS_INTTYPE_BANK2_RESET 0xFFFFFFFF +#define XGPIOPS_INTTYPE_BANK3_RESET 0xFFFFFFFF +/* @} */ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* This macro reads the given register. +* +* @param BaseAddr is the base address of the device. +* @param RegOffset is the register offset to be read. +* +* @return The 32-bit value of the register +* +* @note None. +* +*****************************************************************************/ +#define XGpioPs_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (RegOffset)) + +/****************************************************************************/ +/** +* +* This macro writes to the given register. +* +* @param BaseAddr is the base address of the device. +* @param RegOffset is the offset of the register to be written. +* @param Data is the 32-bit value to write to the register. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +#define XGpioPs_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (RegOffset), (Data)) + +/************************** Function Prototypes ******************************/ + +void XGpioPs_ResetHw(u32 BaseAddress); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XGPIOPS_HW_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_intr.c new file mode 100755 index 000000000..4dd2c970f --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_intr.c @@ -0,0 +1,741 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_intr.c +* +* This file contains functions related to GPIO interrupt handling. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sv 01/18/10 First Release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xgpiops.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void StubHandler(void *CallBackRef, int Bank, u32 Status); + +/****************************************************************************/ +/** +* +* This function enables the interrupts for the specified pins in the specified +* bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param Mask is the bit mask of the pins for which interrupts are to +* be enabled. Bit positions of 1 will be enabled. Bit positions +* of 0 will keep the previous setting. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrEnable(XGpioPs *InstancePtr, u8 Bank, u32 Mask) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTEN_OFFSET, Mask); +} + +/****************************************************************************/ +/** +* +* This function enables the interrupt for the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number for which the interrupt is to be enabled. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrEnablePin(XGpioPs *InstancePtr, int Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg = 0; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + IntrReg = 1 << PinNumber; + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTEN_OFFSET, IntrReg); +} + +/****************************************************************************/ +/** +* +* This function disables the interrupts for the specified pins in the specified +* bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param Mask is the bit mask of the pins for which interrupts are +* to be disabled. Bit positions of 1 will be disabled. Bit +* positions of 0 will keep the previous setting. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrDisable(XGpioPs *InstancePtr, u8 Bank, u32 Mask) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTDIS_OFFSET, Mask); +} + +/****************************************************************************/ +/** +* +* This function disables the interrupts for the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number for which the interrupt is to be disabled. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrDisablePin(XGpioPs *InstancePtr, int Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg = 0; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + IntrReg = 1 << PinNumber; + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTDIS_OFFSET, IntrReg); +} + +/****************************************************************************/ +/** +* +* This function returns the interrupt enable status for a bank. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* +* @return Enabled interrupt(s) in a 32-bit format. Bit positions with 1 +* indicate that the interrupt for that pin is enabled, bit +* positions with 0 indicate that the interrupt for that pin is +* disabled. +* +* @note None. +* +*****************************************************************************/ +u32 XGpioPs_IntrGetEnabled(XGpioPs *InstancePtr, u8 Bank) +{ + u32 IntrMask; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Bank < XGPIOPS_MAX_BANKS); + + IntrMask = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTMASK_OFFSET); + return ~IntrMask; +} + +/****************************************************************************/ +/** +* +* This function returns whether interrupts are enabled for the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number for which the interrupt enable status +* is to be known. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* +* @return +* - TRUE if the interrupt is enabled. +* - FALSE if the interrupt is disabled. +* +* @note None. +* +*****************************************************************************/ +int XGpioPs_IntrGetEnabledPin(XGpioPs *InstancePtr, int Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + IntrReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTMASK_OFFSET); + + return (IntrReg & (1 << Pin)) ? TRUE : FALSE; +} + +/****************************************************************************/ +/** +* +* This function returns interrupt status read from Interrupt Status Register. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* +* @return The value read from Interrupt Status Register. +* +* @note None. +* +*****************************************************************************/ +u32 XGpioPs_IntrGetStatus(XGpioPs *InstancePtr, u8 Bank) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Bank < XGPIOPS_MAX_BANKS); + + return XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET); +} + +/****************************************************************************/ +/** +* +* This function returns interrupt enable status of the specified pin. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number for which the interrupt enable status +* is to be known. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* +* @return +* - TRUE if the interrupt has occurred. +* - FALSE if the interrupt has not occurred. +* +* @note None. +* +*****************************************************************************/ +int XGpioPs_IntrGetStatusPin(XGpioPs *InstancePtr, int Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + IntrReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET); + + return (IntrReg & (1 << Pin)) ? TRUE : FALSE; +} + +/****************************************************************************/ +/** +* +* This function clears pending interrupt(s) with the provided mask. This +* function should be called after the software has serviced the interrupts +* that are pending. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param Mask is the mask of the interrupts to be cleared. Bit positions +* of 1 will be cleared. Bit positions of 0 will not change the +* previous interrupt status. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrClear(XGpioPs *InstancePtr, u8 Bank, u32 Mask) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); + + /* + * Clear the currently pending interrupts. + */ + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET, Mask); +} + +/****************************************************************************/ +/** +* +* This function clears the specified pending interrupt. This function should be +* called after the software has serviced the interrupts that are pending. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param Pin is the pin number for which the interrupt status is to be +* cleared. Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_IntrClearPin(XGpioPs *InstancePtr, int Pin) +{ + u8 Bank; + u8 PinNumber; + u32 IntrReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + /* + * Clear the specified pending interrupts. + */ + IntrReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET); + + IntrReg &= (1 << Pin); + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTSTS_OFFSET, IntrReg); +} + +/****************************************************************************/ +/** +* +* This function is used for setting the Interrupt Type, Interrupt Polarity and +* Interrupt On Any for the specified GPIO Bank pins. +* +* @param InstancePtr is a pointer to an XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param IntrType is the 32 bit mask of the interrupt type. +* 0 means Level Sensitive and 1 means Edge Sensitive. +* @param IntrPolarity is the 32 bit mask of the interrupt polarity. +* 0 means Active Low or Falling Edge and 1 means Active High or +* Rising Edge. +* @param IntrOnAny is the 32 bit mask of the interrupt trigger for +* edge triggered interrupts. 0 means trigger on single edge using +* the configured interrupt polarity and 1 means trigger on both +* edges. +* +* @return None. +* +* @note This function is used for setting the interrupt related +* properties of all the pins in the specified bank. The previous +* state of the pins is not maintained. +* To change the Interrupt properties of a single GPIO pin, use the +* function XGpioPs_SetPinIntrType(). +* +*****************************************************************************/ +void XGpioPs_SetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 IntrType, + u32 IntrPolarity, u32 IntrOnAny) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET, IntrType); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET, IntrPolarity); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET, IntrOnAny); +} + +/****************************************************************************/ +/** +* +* This function is used for getting the Interrupt Type, Interrupt Polarity and +* Interrupt On Any for the specified GPIO Bank pins. +* +* @param InstancePtr is a pointer to an XGpioPs instance. +* @param Bank is the bank number of the GPIO to operate on. +* Valid values are 0 to XGPIOPS_MAX_BANKS - 1. +* @param IntrType returns the 32 bit mask of the interrupt type. +* 0 means Level Sensitive and 1 means Edge Sensitive. +* @param IntrPolarity returns the 32 bit mask of the interrupt +* polarity. 0 means Active Low or Falling Edge and 1 means +* Active High or Rising Edge. +* @param IntrOnAny returns the 32 bit mask of the interrupt trigger for +* edge triggered interrupts. 0 means trigger on single edge using +* the configured interrupt polarity and 1 means trigger on both +* edges. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_GetIntrType(XGpioPs *InstancePtr, u8 Bank, u32 *IntrType, + u32 *IntrPolarity, u32 *IntrOnAny) + +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Bank < XGPIOPS_MAX_BANKS); + + *IntrType = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET); + + *IntrPolarity = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET); + + *IntrOnAny = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET); +} + +/****************************************************************************/ +/** +* +* This function is used for setting the IRQ Type of a single GPIO pin. +* +* @param InstancePtr is a pointer to an XGpioPs instance. +* @param Pin is the pin number whose IRQ type is to be set. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* @param IrqType is the IRQ type for GPIO Pin. Use XGPIOPS_IRQ_TYPE_* +* defined in xgpiops.h to specify the IRQ type. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XGpioPs_SetIntrTypePin(XGpioPs *InstancePtr, int Pin, u8 IrqType) +{ + u32 IntrTypeReg; + u32 IntrPolReg; + u32 IntrOnAnyReg; + u8 Bank; + u8 PinNumber; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + Xil_AssertVoid(IrqType <= XGPIOPS_IRQ_TYPE_LEVEL_LOW); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + IntrTypeReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET); + + IntrPolReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET); + + IntrOnAnyReg = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET); + + switch (IrqType) { + case XGPIOPS_IRQ_TYPE_EDGE_RISING: + IntrTypeReg |= (1 << PinNumber); + IntrPolReg |= (1 << PinNumber); + IntrOnAnyReg &= ~(1 << PinNumber); + break; + case XGPIOPS_IRQ_TYPE_EDGE_FALLING: + IntrTypeReg |= (1 << PinNumber); + IntrPolReg &= ~(1 << PinNumber); + IntrOnAnyReg &= ~(1 << PinNumber); + break; + case XGPIOPS_IRQ_TYPE_EDGE_BOTH: + IntrTypeReg |= (1 << PinNumber); + IntrOnAnyReg |= (1 << PinNumber); + break; + case XGPIOPS_IRQ_TYPE_LEVEL_HIGH: + IntrTypeReg &= ~(1 << PinNumber); + IntrPolReg |= (1 << PinNumber); + break; + case XGPIOPS_IRQ_TYPE_LEVEL_LOW: + IntrTypeReg &= ~(1 << PinNumber); + IntrPolReg &= ~(1 << PinNumber); + break; + } + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET, IntrTypeReg); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET, IntrPolReg); + + XGpioPs_WriteReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET, IntrOnAnyReg); +} + +/****************************************************************************/ +/** +* +* This function returns the IRQ Type of a given GPIO pin. +* +* @param InstancePtr is a pointer to an XGpioPs instance. +* @param Pin is the pin number whose IRQ type is to be obtained. +* Valid values are 0 to XGPIOPS_DEVICE_MAX_PIN_NUM - 1. +* +* @return None. +* +* @note Use XGPIOPS_IRQ_TYPE_* defined in xgpiops.h for the IRQ type +* returned by this function. +* +*****************************************************************************/ +u8 XGpioPs_GetIntrTypePin(XGpioPs *InstancePtr, int Pin) +{ + u32 IntrType; + u32 IntrPol; + u32 IntrOnAny; + u8 Bank; + u8 PinNumber; + u8 IrqType; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Pin < XGPIOPS_DEVICE_MAX_PIN_NUM); + + /* + * Get the Bank number and Pin number within the bank. + */ + XGpioPs_GetBankPin(Pin, &Bank, &PinNumber); + + IntrType = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTTYPE_OFFSET) & PinNumber; + + IntrPol = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTPOL_OFFSET) & PinNumber; + + IntrOnAny = XGpioPs_ReadReg(InstancePtr->GpioConfig.BaseAddr, + ((Bank) * XGPIOPS_REG_MASK_OFFSET) + + XGPIOPS_INTANY_OFFSET) & PinNumber; + + if (IntrType == 1) { + if (IntrOnAny == 1) { + IrqType = XGPIOPS_IRQ_TYPE_EDGE_BOTH; + } else if (IntrPol == 1) { + IrqType = XGPIOPS_IRQ_TYPE_EDGE_RISING; + } else { + IrqType = XGPIOPS_IRQ_TYPE_EDGE_FALLING; + } + } else { + if (IntrPol == 1) { + IrqType = XGPIOPS_IRQ_TYPE_LEVEL_HIGH; + } else { + IrqType = XGPIOPS_IRQ_TYPE_LEVEL_LOW; + } + } + + return IrqType; +} + +/*****************************************************************************/ +/** +* +* This function sets the status callback function. The callback function is +* called by the XGpioPs_IntrHandler when an interrupt occurs. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* @param CallBackRef is the upper layer callback reference passed back +* when the callback function is invoked. +* @param FuncPtr is the pointer to the callback function. +* +* +* @return None. +* +* @note The handler is called within interrupt context, so it should do +* its work quickly and queue potentially time-consuming work to a +* task-level thread. +* +******************************************************************************/ +void XGpioPs_SetCallbackHandler(XGpioPs *InstancePtr, void *CallBackRef, + XGpioPs_Handler FuncPtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FuncPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + InstancePtr->Handler = FuncPtr; + InstancePtr->CallBackRef = CallBackRef; +} + +/*****************************************************************************/ +/** +* +* This function is the interrupt handler for GPIO interrupts.It checks the +* interrupt status registers of all the banks to determine the actual bank in +* which an interrupt has been triggered. It then calls the upper layer callback +* handler set by the function XGpioPs_SetBankHandler(). The callback is called +* when an interrupt +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* +* @return None. +* +* @note This function does not save and restore the processor context +* such that the user must provide this processing. +* +******************************************************************************/ +void XGpioPs_IntrHandler(XGpioPs *InstancePtr) +{ + u8 Bank; + u32 IntrStatus; + u32 IntrEnabled; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + for (Bank = 0; Bank < XGPIOPS_MAX_BANKS; Bank++) { + IntrStatus = XGpioPs_IntrGetStatus(InstancePtr, Bank); + if (IntrStatus != 0) { + IntrEnabled = XGpioPs_IntrGetEnabled(InstancePtr, + Bank); + XGpioPs_IntrClear(InstancePtr, Bank, + IntrStatus & IntrEnabled); + InstancePtr->Handler((void *)InstancePtr-> + CallBackRef, Bank, + (IntrStatus & IntrEnabled)); + } + } +} + +/*****************************************************************************/ +/** +* +* This is a stub for the status callback. The stub is here in case the upper +* layers do not set the handler. +* +* @param CallBackRef is a pointer to the upper layer callback reference +* @param Bank is the GPIO Bank in which an interrupt occurred. +* @param Status is the Interrupt status of the GPIO bank. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void StubHandler(void *CallBackRef, int Bank, u32 Status) +{ + (void) CallBackRef; + (void) Bank; + (void) Status; + + Xil_AssertVoidAlways(); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_selftest.c new file mode 100755 index 000000000..f55e9dab2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_selftest.c @@ -0,0 +1,140 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_selftest.c +* +* This file contains a diagnostic self-test function for the XGpioPs driver. +* +* Read xgpiops.h file for more information. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sv 01/18/10 First Release +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xstatus.h" +#include "xgpiops.h" + +/************************** Constant Definitions ****************************/ + + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +/*****************************************************************************/ +/** +* +* This function runs a self-test on the GPIO driver/device. This function +* does a register read/write test on some of the Interrupt Registers. +* +* @param InstancePtr is a pointer to the XGpioPs instance. +* +* @return +* - XST_SUCCESS if the self-test passed. +* - XST_FAILURE otherwise. +* +* +******************************************************************************/ +int XGpioPs_SelfTest(XGpioPs *InstancePtr) +{ + int Status = XST_SUCCESS; + u32 IntrEnabled; + u32 CurrentIntrType; + u32 CurrentIntrPolarity; + u32 CurrentIntrOnAny; + u32 IntrType; + u32 IntrPolarity; + u32 IntrOnAny; + u32 IntrTestValue = 0x22; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Disable the Interrupts for Bank 0 . + */ + IntrEnabled = XGpioPs_IntrGetEnabled(InstancePtr, XGPIOPS_BANK0); + XGpioPs_IntrDisable(InstancePtr, XGPIOPS_BANK0, IntrEnabled); + + /* + * Get the Current Interrupt properties for Bank 0. + * Set them to a known value, read it back and compare. + */ + XGpioPs_GetIntrType(InstancePtr, XGPIOPS_BANK0, &CurrentIntrType, + &CurrentIntrPolarity, &CurrentIntrOnAny); + + XGpioPs_SetIntrType(InstancePtr, XGPIOPS_BANK0, IntrTestValue, + IntrTestValue, IntrTestValue); + + XGpioPs_GetIntrType(InstancePtr, XGPIOPS_BANK0, &IntrType, + &IntrPolarity, &IntrOnAny); + + if ((IntrType != IntrTestValue) && (IntrPolarity != IntrTestValue) && + (IntrOnAny != IntrTestValue)) { + + Status = XST_FAILURE; + } + + /* + * Restore the contents of all the interrupt registers modified in this + * test. + */ + XGpioPs_SetIntrType(InstancePtr, XGPIOPS_BANK0, CurrentIntrType, + CurrentIntrPolarity, CurrentIntrOnAny); + + XGpioPs_IntrEnable(InstancePtr, XGPIOPS_BANK0, IntrEnabled); + + return Status; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_sinit.c new file mode 100755 index 000000000..9a01883a0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/gpiops_v1_02_a/src/xgpiops_sinit.c @@ -0,0 +1,106 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xgpiops_sinit.c +* +* This file contains the implementation of the XGpioPs driver's static +* initialization functionality. +* +* @note None. +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sv 01/15/10 First Release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xparameters.h" +#include "xgpiops.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +extern XGpioPs_Config XGpioPs_ConfigTable[]; + +/*****************************************************************************/ +/** +* +* This function looks for the device configuration based on the unique device +* ID. The table XGpioPs_ConfigTable[] contains the configuration information +* for each device in the system. +* +* @param DeviceId is the unique device ID of the device being looked up. +* +* @return A pointer to the configuration table entry corresponding to the +* given device ID, or NULL if no match is found. +* +* @note None. +* +******************************************************************************/ +XGpioPs_Config *XGpioPs_LookupConfig(u16 DeviceId) +{ + XGpioPs_Config *CfgPtr = NULL; + u32 Index; + + for (Index = 0; Index < XPAR_XGPIOPS_NUM_INSTANCES; Index++) { + if (XGpioPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XGpioPs_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/Makefile new file mode 100755 index 000000000..c506c25d5 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xiicps_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling iicps" + +xiicps_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xiicps_includes + +xiicps_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps.c new file mode 100755 index 000000000..f96780d5b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps.c @@ -0,0 +1,326 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps.c +* +* Contains implementation of required functions for the XIicPs driver. +* See xiicps.h for detailed description of the device and driver. +* +* <pre> MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- -------------------------------------------- +* 1.00a drg/jz 01/30/10 First release +* 1.00a sdm 09/21/11 Updated the InstancePtr->Options in the +* XIicPs_CfgInitialize by calling XIicPs_GetOptions. +* +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +static void StubHandler(void *CallBackRef, u32 StatusEvent); + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Initializes a specific XIicPs instance such that the driver is ready to use. +* +* The state of the device after initialization is: +* - Device is disabled +* - Slave mode +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param ConfigPtr is a reference to a structure containing information +* about a specific IIC device. This function initializes an +* InstancePtr object for a specific device specified by the +* contents of Config. +* @param EffectiveAddr is the device base address in the virtual memory +* address space. The caller is responsible for keeping the address +* mapping from EffectiveAddr to the device physical base address +* unchanged once this function is invoked. Unexpected errors may +* occur if the address mapping changes after this function is +* called. If address translation is not used, use +* ConfigPtr->BaseAddress for this parameter, passing the physical +* address instead. +* +* @return The return value is XST_SUCCESS if successful. +* +* @note None. +* +******************************************************************************/ +int XIicPs_CfgInitialize(XIicPs *InstancePtr, XIicPs_Config *ConfigPtr, + u32 EffectiveAddr) +{ + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + /* + * Set some default values. + */ + InstancePtr->Config.DeviceId = ConfigPtr->DeviceId; + InstancePtr->Config.BaseAddress = EffectiveAddr; + InstancePtr->Config.InputClockHz = ConfigPtr->InputClockHz; + InstancePtr->StatusHandler = StubHandler; + InstancePtr->CallBackRef = NULL; + + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + /* + * Reset the IIC device to get it into its initial state. It is expected + * that device configuration will take place after this initialization + * is done, but before the device is started. + */ + XIicPs_Reset(InstancePtr); + + /* + * Keep a copy of what options this instance has. + */ + InstancePtr->Options = XIicPs_GetOptions(InstancePtr); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* Check whether the I2C bus is busy +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return +* - TRUE if the bus is busy. +* - FALSE if the bus is not busy. +* +* @note None. +* +******************************************************************************/ +int XIicPs_BusIsBusy(XIicPs *InstancePtr) +{ + u32 StatusReg; + + StatusReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_SR_OFFSET); + if (StatusReg & XIICPS_SR_BA_MASK) { + return TRUE; + }else { + return FALSE; + } +} + +/*****************************************************************************/ +/** +* +* This is a stub for the status callback. The stub is here in case the upper +* layers forget to set the handler. +* +* @param CallBackRef is a pointer to the upper layer callback reference. +* @param StatusEvent is the event that just occurred. +* @param ByteCount is the number of bytes transferred up until the event +* occurred. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +static void StubHandler(void *CallBackRef, u32 StatusEvent) +{ + (void) CallBackRef; + (void) StatusEvent; + Xil_AssertVoidAlways(); +} + + +/*****************************************************************************/ +/** +* +* Aborts a transfer in progress by resetting the FIFOs. The byte counts are +* cleared. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XIicPs_Abort(XIicPs *InstancePtr) +{ + u32 IntrMaskReg; + u32 IntrStatusReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Enter a critical section, so disable the interrupts while we clear + * the FIFO and the status register. + */ + IntrMaskReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_IMR_OFFSET); + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_IDR_OFFSET, XIICPS_IXR_ALL_INTR_MASK); + + /* + * Clear the FIFOs. + */ + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, + XIICPS_CR_CLR_FIFO_MASK); + + /* + * Read, then write the interrupt status to make sure there are no + * pending interrupts. + */ + IntrStatusReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_ISR_OFFSET); + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_ISR_OFFSET, IntrStatusReg); + + /* + * Restore the interrupt state. + */ + IntrMaskReg = XIICPS_IXR_ALL_INTR_MASK & (~IntrMaskReg); + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_IER_OFFSET, IntrMaskReg); + +} + +/*****************************************************************************/ +/** +* +* Resets the IIC device. Reset must only be called after the driver has been +* initialized. The configuration of the device after reset is the same as its +* configuration after initialization. Any data transfer that is in progress is +* aborted. +* +* The upper layer software is responsible for re-configuring (if necessary) +* and reenabling interrupts for the IIC device after the reset. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XIicPs_Reset(XIicPs *InstancePtr) +{ + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Abort any transfer that is in progress. + */ + XIicPs_Abort(InstancePtr); + + /* + * Reset any values so the software state matches the hardware device. + */ + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, + XIICPS_CR_RESET_VALUE); + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_TIME_OUT_OFFSET, XIICPS_TO_RESET_VALUE); + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_IDR_OFFSET, + XIICPS_IXR_ALL_INTR_MASK); + +} +/*****************************************************************************/ +/** +* Put more data into the transmit FIFO, number of bytes is ether expected +* number of bytes for this transfer or available space in FIFO, which ever +* is less. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return Number of bytes left for this instance. +* +* @note This is function is shared by master and slave. +* +******************************************************************************/ +int TransmitFifoFill(XIicPs *InstancePtr) +{ + u8 AvailBytes; + int LoopCnt; + int NumBytesToSend; + + /* + * Determine number of bytes to write to FIFO. + */ + AvailBytes = XIICPS_FIFO_DEPTH - + XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_TRANS_SIZE_OFFSET); + + if (InstancePtr->SendByteCount > AvailBytes) { + NumBytesToSend = AvailBytes; + } else { + NumBytesToSend = InstancePtr->SendByteCount; + } + + /* + * Fill FIFO with amount determined above. + */ + for (LoopCnt = 0; LoopCnt < NumBytesToSend; LoopCnt++) { + XIicPs_SendByte(InstancePtr); + } + + return InstancePtr->SendByteCount; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps.h new file mode 100755 index 000000000..de89a9901 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps.h @@ -0,0 +1,394 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps.h +* +* This is an implementation of IIC driver in the PS block. The device can +* be either a master or a slave on the IIC bus. This implementation supports +* both interrupt mode transfer and polled mode transfer. Only 7-bit address +* is used in the driver, although the hardware also supports 10-bit address. +* +* IIC is a 2-wire serial interface. The master controls the clock, so it can +* regulate when it wants to send or receive data. The slave is under control of +* the master, it must respond quickly since it has no control of the clock and +* must send/receive data as fast or as slow as the master does. +* +* The higher level software must implement a higher layer protocol to inform +* the slave what to send to the master. +* +* <b>Initialization & Configuration</b> +* +* The XIicPs_Config structure is used by the driver to configure itself. This +* configuration structure is typically created by the tool-chain based on HW +* build properties. +* +* To support multiple runtime loading and initialization strategies employed by +* various operating systems, the driver instance can be initialized in the +* following way: +* +* - XIicPs_LookupConfig(DeviceId) - Use the device identifier to find +* the static configuration structure defined in xiicps_g.c. This is +* setup by the tools. For some operating systems the config structure +* will be initialized by the software and this call is not needed. +* +* - XIicPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a +* configuration structure provided by the caller. If running in a +* system with address translation, the provided virtual memory base +* address replaces the physical address in the configuration +* structure. +* +* <b>Multiple Masters</b> +* +* More than one master can exist, bus arbitration is defined in the IIC +* standard. Lost of arbitration causes arbitration loss interrupt on the device. +* +* <b>Multiple Slaves</b> +* +* Multiple slaves are supported by selecting them with unique addresses. It is +* up to the system designer to be sure all devices on the IIC bus have +* unique addresses. +* +* <b>Addressing</b> +* +* The IIC hardware can use 7 or 10 bit addresses. The driver provides the +* ability to control which address size is sent in messages as a master to a +* slave device. +* +* <b>FIFO Size </b> +* The hardware FIFO is 32 bytes deep. The user must know the limitations of +* other IIC devices on the bus. Some are only able to receive a limited number +* of bytes in a single transfer. +* +* <b>Data Rates</b> +* +* The data rate is set by values in the control register. The formula for +* determining the correct register values is: +* Fscl = Fpclk/(22 x (divisor_a+1) x (divisor_b+1)) +* +* When the device is configured as a slave, the slck setting controls the +* sample rate and so must be set to be at least as fast as the fastest scl +* expected to be seen in the system. +* +* <b>Polled Mode Operation</b> +* +* This driver supports polled mode transfers. +* +* <b>Interrupts</b> +* +* The user must connect the interrupt handler of the driver, +* XIicPs_InterruptHandler to an interrupt system such that it will be called +* when an interrupt occurs. This function does not save and restore the +* processor context such that the user must provide this processing. +* +* The driver handles the following interrupts: +* - Transfer complete +* - More Data +* - Transfer not Acknowledged +* - Transfer Time out +* - Monitored slave ready - master mode only +* - Receive Overflow +* - Transmit FIFO overflow +* - Receive FIFO underflow +* - Arbitration lost +* +* <b>Bus Busy</b> +* +* Bus busy is checked before the setup of a master mode device, to avoid +* unnecessary arbitration loss interrupt. +* +* <b>RTOS Independence</b> +* +* This driver is intended to be RTOS and processor independent. It works with +* physical addresses only. Any needs for dynamic memory management, threads or +* thread mutual exclusion, virtual memory, or cache control must be satisfied by +* the layer above this driver. +* +* @note +* . Less than FIFO size transfers work for both 100 KHz and 400 KHz. +* . Larger than FIFO size interrupt-driven transfers are not reliable on +* busy systems where interrupt latency is high. +* . Larger than FIFO size interrupt-driven transfers are not reliable for +* data rate of 400 KHz. +* . Larger than FIFO size polled mode transfers work reliably. +* +* <pre> MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00a drg/jz 01/30/08 First release +* 1.00a sdm 09/21/11 Fixed an issue in the XIicPs_SetOptions and +* XIicPs_ClearOptions where the InstancePtr->Options +* was not updated correctly. +* Updated the InstancePtr->Options in the +* XIicPs_CfgInitialize by calling XIicPs_GetOptions. +* Updated the XIicPs_SetupMaster to not check for +* Bus Busy condition when the Hold Bit is set. +* Removed some unused variables. +* 1.01a sg 03/30/12 Fixed an issue in XIicPs_MasterSendPolled where a +* check for transfer completion is added, which indicates +* the completion of current transfer. +* 1.02a sg 08/29/12 Updated the logic to arrive at the best divisors +* to achieve I2C clock with minimum error for +* CR #674195 +* 1.03a hk 05/04/13 Initialized BestDivA and BestDivB to 0. +* This is fix for CR#704398 to remove warning. +* +* </pre> +* +******************************************************************************/ + +#ifndef XIICPS_H /* prevent circular inclusions */ +#define XIICPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xiicps_hw.h" + +/************************** Constant Definitions *****************************/ + +/** @name Configuration options + * + * The following options may be specified or retrieved for the device and + * enable/disable additional features of the IIC. Each of the options + * are bit fields, so more than one may be specified. + * + * @{ + */ +#define XIICPS_7_BIT_ADDR_OPTION 0x01 /**< 7-bit address mode */ +#define XIICPS_10_BIT_ADDR_OPTION 0x02 /**< 10-bit address mode */ +#define XIICPS_SLAVE_MON_OPTION 0x04 /**< Slave monitor mode */ +#define XIICPS_REP_START_OPTION 0x08 /**< Repeated Start */ +/*@}*/ + +/** @name Callback events + * + * These constants specify the handler events that are passed to an application + * event handler from the driver. These constants are bit masks such that + * more than one event can be passed to the handler. + * + * @{ + */ +#define XIICPS_EVENT_COMPLETE_SEND 0x0001 /**< Transmit Complete Event*/ +#define XIICPS_EVENT_COMPLETE_RECV 0x0002 /**< Receive Complete Event*/ +#define XIICPS_EVENT_TIME_OUT 0x0004 /**< Transfer timed out */ +#define XIICPS_EVENT_ERROR 0x0008 /**< Receive error */ +#define XIICPS_EVENT_ARB_LOST 0x0010 /**< Arbitration lost */ +#define XIICPS_EVENT_NACK 0x0020 /**< NACK Received */ +#define XIICPS_EVENT_SLAVE_RDY 0x0040 /**< Slave ready */ +#define XIICPS_EVENT_RX_OVR 0x0080 /**< RX overflow */ +#define XIICPS_EVENT_TX_OVR 0x0100 /**< TX overflow */ +#define XIICPS_EVENT_RX_UNF 0x0200 /**< RX underflow */ +/*@}*/ + +/** @name Role constants + * + * These constants are used to pass into the device setup routines to + * set up the device according to transfer direction. + */ +#define SENDING_ROLE 1 /**< Transfer direction is sending */ +#define RECVING_ROLE 0 /**< Transfer direction is receiving */ + + +/**************************** Type Definitions *******************************/ + +/** +* The handler data type allows the user to define a callback function to +* respond to interrupt events in the system. This function is executed +* in interrupt context, so amount of processing should be minimized. +* +* @param CallBackRef is the callback reference passed in by the upper +* layer when setting the callback functions, and passed back to +* the upper layer when the callback is invoked. Its type is +* not important to the driver, so it is a void pointer. +* @param StatusEvent indicates one or more status events that occurred. +*/ +typedef void (*XIicPs_IntrHandler) (void *CallBackRef, u32 StatusEvent); + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Base address of the device */ + u32 InputClockHz; /**< Input clock frequency */ +} XIicPs_Config; + +/** + * The XIicPs driver instance data. The user is required to allocate a + * variable of this type for each IIC device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XIicPs_Config Config; /* Configuration structure */ + u32 IsReady; /* Device is initialized and ready */ + u32 Options; /* Options set in the device */ + + u8 *SendBufferPtr; /* Pointer to send buffer */ + u8 *RecvBufferPtr; /* Pointer to recv buffer */ + int SendByteCount; /* Number of bytes still expected to send */ + int RecvByteCount; /* Number of bytes still expected to receive */ + + XIicPs_IntrHandler StatusHandler; /* Event handler function */ + void *CallBackRef; /* Callback reference for event handler */ +} XIicPs; + +/***************** Macros (Inline Functions) Definitions *********************/ +/****************************************************************************/ +/* +* +* Place one byte into the transmit FIFO. +* +* @param InstancePtr is the instance of IIC +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_SendByte(XIicPs *InstancePtr) +* +*****************************************************************************/ +#define XIicPs_SendByte(InstancePtr) \ +{ \ + XIicPs_Out32((InstancePtr)->Config.BaseAddress \ + + XIICPS_DATA_OFFSET, \ + *(InstancePtr)->SendBufferPtr ++); \ + (InstancePtr)->SendByteCount --; \ +} + +/****************************************************************************/ +/* +* +* Receive one byte from FIFO. +* +* @param InstancePtr is the instance of IIC +* +* @return None. +* +* @note C-Style signature: +* u8 XIicPs_RecvByte(XIicPs *InstancePtr) +* +*****************************************************************************/ +#define XIicPs_RecvByte(InstancePtr) \ +{ \ + *(InstancePtr)->RecvBufferPtr ++ = \ + (u8)XIicPs_In32((InstancePtr)->Config.BaseAddress \ + + XIICPS_DATA_OFFSET); \ + (InstancePtr)->RecvByteCount --; \ +} + +/************************** Function Prototypes ******************************/ + +/* + * Function for configuration lookup, in xiicps_sinit.c + */ +XIicPs_Config *XIicPs_LookupConfig(u16 DeviceId); + +/* + * Functions for general setup, in xiicps.c + */ +int XIicPs_CfgInitialize(XIicPs *InstancePtr, XIicPs_Config * Config, + u32 EffectiveAddr); + +void XIicPs_Abort(XIicPs *InstancePtr); +void XIicPs_Reset(XIicPs *InstancePtr); + +int XIicPs_BusIsBusy(XIicPs *InstancePtr); + +/* + * Functions for interrupts, in xiicps_intr.c + */ +void XIicPs_SetStatusHandler(XIicPs *InstancePtr, void *CallBackRef, + XIicPs_IntrHandler FuncPtr); + +/* + * Functions for device as master, in xiicps_master.c + */ +void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr); +void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr); +int XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr); +int XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr); +void XIicPs_EnableSlaveMonitor(XIicPs *InstancePtr, u16 SlaveAddr); +void XIicPs_DisableSlaveMonitor(XIicPs *InstancePtr); +void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr); + +/* + * Functions for device as slave, in xiicps_slave.c + */ +void XIicPs_SetupSlave(XIicPs *InstancePtr, u16 SlaveAddr); +void XIicPs_SlaveSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount); +void XIicPs_SlaveRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount); +int XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount); +int XIicPs_SlaveRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount); +void XIicPs_SlaveInterruptHandler(XIicPs *InstancePtr); + +/* + * Functions for selftest, in xiicps_selftest.c + */ +int XIicPs_SelfTest(XIicPs *InstancePtr); + +/* + * Functions for setting and getting data rate, in xiicps_options.c + */ +int XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options); +int XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options); +u32 XIicPs_GetOptions(XIicPs *InstancePtr); + +int XIicPs_SetSClk(XIicPs *InstancePtr, u32 FsclHz); +u32 XIicPs_GetSClk(XIicPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_g.c new file mode 100644 index 000000000..0f7edcfd6 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_g.c @@ -0,0 +1,31 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xiicps.h" + +/* +* The configuration table for devices +*/ + +XIicPs_Config XIicPs_ConfigTable[] = +{ + { + XPAR_PS7_I2C_0_DEVICE_ID, + XPAR_PS7_I2C_0_BASEADDR, + XPAR_PS7_I2C_0_I2C_CLK_FREQ_HZ + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_hw.c new file mode 100755 index 000000000..03c9bffb4 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_hw.c @@ -0,0 +1,116 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_hw.c +* +* Contains implementation of required functions for providing the reset sequence +* to the i2c interface +* +* <pre> MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- -------------------------------------------- +* 1.04a kpc 11/07/13 First release +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xiicps_hw.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +/*****************************************************************************/ +/** +* This function perform the reset sequence to the given I2c interface by +* configuring the appropriate control bits in the I2c specifc registers +* the i2cps reset squence involves the following steps +* Disable all the interuupts +* Clear the status +* Clear FIFO's and disable hold bit +* Clear the line status +* Update relevant config registers with reset values +* +* @param BaseAddress of the interface +* +* @return N/A +* +* @note +* This function will not modify the slcr registers that are relavant for +* I2c controller +******************************************************************************/ +void XIicPs_ResetHw(u32 BaseAddress) +{ + u32 RegVal; + + /* Disable all the interrupts */ + XIicPs_WriteReg(BaseAddress, XIICPS_IDR_OFFSET, XIICPS_IXR_ALL_INTR_MASK); + /* Clear the interrupt status */ + RegVal = XIicPs_ReadReg(BaseAddress,XIICPS_ISR_OFFSET); + XIicPs_WriteReg(BaseAddress, XIICPS_ISR_OFFSET, RegVal); + /* Clear the hold bit,master enable bit and ack bit */ + RegVal = XIicPs_ReadReg(BaseAddress,XIICPS_CR_OFFSET); + RegVal &= ~(XIICPS_CR_HOLD_MASK|XIICPS_CR_MS_MASK|XIICPS_CR_ACKEN_MASK); + /* Clear the fifos */ + RegVal |= XIICPS_CR_CLR_FIFO_MASK; + XIicPs_WriteReg(BaseAddress, XIICPS_CR_OFFSET, RegVal); + /* Clear the timeout register */ + XIicPs_WriteReg(BaseAddress, XIICPS_TIME_OUT_OFFSET, 0x0); + /* Clear the transfer size register */ + XIicPs_WriteReg(BaseAddress, XIICPS_TRANS_SIZE_OFFSET, 0x0); + /* Clear the status register */ + RegVal = XIicPs_ReadReg(BaseAddress,XIICPS_SR_OFFSET); + XIicPs_WriteReg(BaseAddress, XIICPS_SR_OFFSET, RegVal); + /* Update the configuraqtion register with reset value */ + XIicPs_WriteReg(BaseAddress, XIICPS_CR_OFFSET, 0x0); +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_hw.h new file mode 100755 index 000000000..69b71ce09 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_hw.h @@ -0,0 +1,388 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_hw.h +* +* This header file contains the hardware definition for an IIC device. +* It includes register definitions and interface functions to read/write +* the registers. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00a drg/jz 01/30/10 First release +* 1.04a kpc 11/07/13 Added function prototype. +* </pre> +* +******************************************************************************/ +#ifndef XIICPS_HW_H /* prevent circular inclusions */ +#define XIICPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * + * Register offsets for the IIC. + * @{ + */ +#define XIICPS_CR_OFFSET 0x00 /**< 32-bit Control */ +#define XIICPS_SR_OFFSET 0x04 /**< Status */ +#define XIICPS_ADDR_OFFSET 0x08 /**< IIC Address */ +#define XIICPS_DATA_OFFSET 0x0C /**< IIC FIFO Data */ +#define XIICPS_ISR_OFFSET 0x10 /**< Interrupt Status */ +#define XIICPS_TRANS_SIZE_OFFSET 0x14 /**< Transfer Size */ +#define XIICPS_SLV_PAUSE_OFFSET 0x18 /**< Slave monitor pause */ +#define XIICPS_TIME_OUT_OFFSET 0x1C /**< Time Out */ +#define XIICPS_IMR_OFFSET 0x20 /**< Interrupt Enabled Mask */ +#define XIICPS_IER_OFFSET 0x24 /**< Interrupt Enable */ +#define XIICPS_IDR_OFFSET 0x28 /**< Interrupt Disable */ +/* @} */ + +/** @name Control Register + * + * This register contains various control bits that + * affects the operation of the IIC controller. Read/Write. + * @{ + */ + +#define XIICPS_CR_DIV_A_MASK 0x0000C000 /**< Clock Divisor A */ +#define XIICPS_CR_DIV_A_SHIFT 14 /**< Clock Divisor A shift */ +#define XIICPS_DIV_A_MAX 4 /**< Maximum value of Divisor A */ +#define XIICPS_CR_DIV_B_MASK 0x00003F00 /**< Clock Divisor B */ +#define XIICPS_CR_DIV_B_SHIFT 8 /**< Clock Divisor B shift */ +#define XIICPS_CR_CLR_FIFO_MASK 0x00000040 /**< Clear FIFO, auto clears*/ +#define XIICPS_CR_SLVMON_MASK 0x00000020 /**< Slave monitor mode */ +#define XIICPS_CR_HOLD_MASK 0x00000010 /**< Hold bus 1=Hold scl, + 0=terminate transfer */ +#define XIICPS_CR_ACKEN_MASK 0x00000008 /**< Enable TX of ACK when + Master receiver*/ +#define XIICPS_CR_NEA_MASK 0x00000004 /**< Addressing Mode 1=7 bit, + 0=10 bit */ +#define XIICPS_CR_MS_MASK 0x00000002 /**< Master mode bit 1=Master, + 0=Slave */ +#define XIICPS_CR_RD_WR_MASK 0x00000001 /**< Read or Write Master + transfer 0=Transmitter, + 1=Receiver*/ +#define XIICPS_CR_RESET_VALUE 0 /**< Reset value of the Control + register */ +/* @} */ + +/** @name IIC Status Register + * + * This register is used to indicate status of the IIC controller. Read only + * @{ + */ +#define XIICPS_SR_BA_MASK 0x00000100 /**< Bus Active Mask */ +#define XIICPS_SR_RXOVF_MASK 0x00000080 /**< Receiver Overflow Mask */ +#define XIICPS_SR_TXDV_MASK 0x00000040 /**< Transmit Data Valid Mask */ +#define XIICPS_SR_RXDV_MASK 0x00000020 /**< Receiver Data Valid Mask */ +#define XIICPS_SR_RXRW_MASK 0x00000008 /**< Receive read/write Mask */ +/* @} */ + +/** @name IIC Address Register + * + * Normal addressing mode uses add[6:0]. Extended addressing mode uses add[9:0]. + * A write access to this register always initiates a transfer if the IIC is in + * master mode. Read/Write + * @{ + */ +#define XIICPS_ADDR_MASK 0x000003FF /**< IIC Address Mask */ +/* @} */ + +/** @name IIC Data Register + * + * When written to, the data register sets data to transmit. When read from, the + * data register reads the last received byte of data. Read/Write + * @{ + */ +#define XIICPS_DATA_MASK 0x000000FF /**< IIC Data Mask */ +/* @} */ + +/** @name IIC Interrupt Registers + * + * <b>IIC Interrupt Status Register</b> + * + * This register holds the interrupt status flags for the IIC controller. Some + * of the flags are level triggered + * - i.e. are set as long as the interrupt condition exists. Other flags are + * edge triggered, which means they are set one the interrupt condition occurs + * then remain set until they are cleared by software. + * The interrupts are cleared by writing a one to the interrupt bit position + * in the Interrupt Status Register. Read/Write. + * + * <b>IIC Interrupt Enable Register</b> + * + * This register is used to enable interrupt sources for the IIC controller. + * Writing a '1' to a bit in this register clears the corresponding bit in the + * IIC Interrupt Mask register. Write only. + * + * <b>IIC Interrupt Disable Register </b> + * + * This register is used to disable interrupt sources for the IIC controller. + * Writing a '1' to a bit in this register sets the corresponding bit in the + * IIC Interrupt Mask register. Write only. + * + * <b>IIC Interrupt Mask Register</b> + * + * This register shows the enabled/disabled status of each IIC controller + * interrupt source. A bit set to 1 will ignore the corresponding interrupt in + * the status register. A bit set to 0 means the interrupt is enabled. + * All mask bits are set and all interrupts are disabled after reset. Read only. + * + * All four registers have the same bit definitions. They are only defined once + * for each of the Interrupt Enable Register, Interrupt Disable Register, + * Interrupt Mask Register, and Interrupt Status Register + * @{ + */ + +#define XIICPS_IXR_ARB_LOST_MASK 0x00000200 /**< Arbitration Lost Interrupt + mask */ +#define XIICPS_IXR_RX_UNF_MASK 0x00000080 /**< FIFO Recieve Underflow + Interrupt mask */ +#define XIICPS_IXR_TX_OVR_MASK 0x00000040 /**< Transmit Overflow + Interrupt mask */ +#define XIICPS_IXR_RX_OVR_MASK 0x00000020 /**< Receive Overflow Interrupt + mask */ +#define XIICPS_IXR_SLV_RDY_MASK 0x00000010 /**< Monitored Slave Ready + Interrupt mask */ +#define XIICPS_IXR_TO_MASK 0x00000008 /**< Transfer Time Out + Interrupt mask */ +#define XIICPS_IXR_NACK_MASK 0x00000004 /**< NACK Interrupt mask */ +#define XIICPS_IXR_DATA_MASK 0x00000002 /**< Data Interrupt mask */ +#define XIICPS_IXR_COMP_MASK 0x00000001 /**< Transfer Complete + Interrupt mask */ +#define XIICPS_IXR_DEFAULT_MASK 0x000002FF /**< Default ISR Mask */ +#define XIICPS_IXR_ALL_INTR_MASK 0x000002FF /**< All ISR Mask */ +/* @} */ + + +/** @name IIC Transfer Size Register +* +* The register's meaning varies according to the operating mode as follows: +* - Master transmitter mode: number of data bytes still not transmitted minus +* one +* - Master receiver mode: number of data bytes that are still expected to be +* received +* - Slave transmitter mode: number of bytes remaining in the FIFO after the +* master terminates the transfer +* - Slave receiver mode: number of valid data bytes in the FIFO +* +* This register is cleared if CLR_FIFO bit in the control register is set. +* Read/Write +* @{ +*/ +#define XIICPS_TRANS_SIZE_MASK 0x0000003F /**< IIC Transfer Size Mask */ +#define XIICPS_FIFO_DEPTH 16 /**< Number of bytes in the FIFO */ +#define XIICPS_DATA_INTR_DEPTH 14 /**< Number of bytes at DATA intr */ +/* @} */ + + +/** @name IIC Slave Monitor Pause Register +* +* This register is associated with the slave monitor mode of the I2C interface. +* It is meaningful only when the module is in master mode and bit SLVMON in the +* control register is set. +* +* This register defines the pause interval between consecutive attempts to +* address the slave once a write to an I2C address register is done by the +* host. It represents the number of sclk cycles minus one between two attempts. +* +* The reset value of the register is 0, which results in the master repeatedly +* trying to access the slave immediately after unsuccessful attempt. +* Read/Write +* @{ +*/ +#define XIICPS_SLV_PAUSE_MASK 0x0000000F /**< Slave monitor pause mask */ +/* @} */ + + +/** @name IIC Time Out Register +* +* The value of time out register represents the time out interval in number of +* sclk cycles minus one. +* +* When the accessed slave holds the sclk line low for longer than the time out +* period, thus prohibiting the I2C interface in master mode to complete the +* current transfer, an interrupt is generated and TO interrupt flag is set. +* +* The reset value of the register is 0x1f. +* Read/Write +* @{ + */ +#define XIICPS_TIME_OUT_MASK 0x000000FF /**< IIC Time Out mask */ +#define XIICPS_TO_RESET_VALUE 0x0000001F /**< IIC Time Out reset value */ +/* @} */ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +#define XIicPs_In32 Xil_In32 +#define XIicPs_Out32 Xil_Out32 + +/****************************************************************************/ +/** +* Read an IIC register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the 1st register of the +* device to select the specific register. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u32 XIicPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +#define XIicPs_ReadReg(BaseAddress, RegOffset) \ + XIicPs_In32((BaseAddress) + (RegOffset)) + +/***************************************************************************/ +/** +* Write an IIC register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the 1st register of the +* device to select the specific register. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_WriteReg(u32 BaseAddress, int RegOffset, u32 RegisterValue) +* +******************************************************************************/ +#define XIicPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + XIicPs_Out32((BaseAddress) + (RegOffset), (RegisterValue)) + +/***************************************************************************/ +/** +* Read the interrupt enable register. +* +* @param BaseAddress contains the base address of the device. +* +* @return Current bit mask that represents currently enabled interrupts. +* +* @note C-Style signature: +* u32 XIicPs_ReadIER(u32 BaseAddress) +* +******************************************************************************/ +#define XIicPs_ReadIER(BaseAddress) \ + XIicPs_ReadReg((BaseAddress), XIICPS_IER_OFFSET) + +/***************************************************************************/ +/** +* Write to the interrupt enable register. +* +* @param BaseAddress contains the base address of the device. +* +* @param IntrMask is the interrupts to be enabled. +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_EnabledInterrupts(u32 BaseAddress, u32 IntrMask) +* +******************************************************************************/ +#define XIicPs_EnableInterrupts(BaseAddress, IntrMask) \ + XIicPs_WriteReg((BaseAddress), XIICPS_IER_OFFSET, (IntrMask)) + +/***************************************************************************/ +/** +* Disable all interrupts. +* +* @param BaseAddress contains the base address of the device. +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_DisableAllInterrupts(u32 BaseAddress) +* +******************************************************************************/ +#define XIicPs_DisableAllInterrupts(BaseAddress) \ + XIicPs_WriteReg((BaseAddress), XIICPS_IDR_OFFSET, \ + XIICPS_IXR_ALL_INTR_MASK) + +/***************************************************************************/ +/** +* Disable selected interrupts. +* +* @param BaseAddress contains the base address of the device. +* +* @param IntrMask is the interrupts to be disabled. +* +* @return None. +* +* @note C-Style signature: +* void XIicPs_DisableInterrupts(u32 BaseAddress, u32 IntrMask) +* +******************************************************************************/ +#define XIicPs_DisableInterrupts(BaseAddress, IntrMask) \ + XIicPs_WriteReg((BaseAddress), XIICPS_IDR_OFFSET, \ + (IntrMask)) + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ +/* + * Perform reset operation to the I2c interface + */ +void XIicPs_ResetHw(u32 BaseAddr); +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_intr.c new file mode 100755 index 000000000..1dfeb9aba --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_intr.c @@ -0,0 +1,106 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_intr.c +* +* Contains functions of the XIicPs driver for interrupt-driven transfers. +* See xiicps.h for a detailed description of the device and driver. +* +* <pre> MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00a drg/jz 01/30/10 First release +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************* Variable Definitions *****************************/ + +/*****************************************************************************/ +/** +* +* This function sets the status callback function, the status handler, which the +* driver calls when it encounters conditions that should be reported to the +* higher layer software. The handler executes in an interrupt context, so +* the amount of processing should be minimized +* +* Refer to the xiicps.h file for a list of the Callback events. The events are +* defined to start with XIICPS_EVENT_*. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param CallBackRef is the upper layer callback reference passed back +* when the callback function is invoked. +* @param FuncPtr is the pointer to the callback function. +* +* @return None. +* +* @note +* +* The handler is called within interrupt context, so it should finish its +* work quickly. +* +******************************************************************************/ +void XIicPs_SetStatusHandler(XIicPs *InstancePtr, void *CallBackRef, + XIicPs_IntrHandler FuncPtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FuncPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + InstancePtr->StatusHandler = FuncPtr; + InstancePtr->CallBackRef = CallBackRef; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_master.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_master.c new file mode 100755 index 000000000..50da8752e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_master.c @@ -0,0 +1,876 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_master.c +* +* Handles master mode transfers. +* +* <pre> MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a jz 01/30/10 First release +* 1.00a sdm 09/21/11 Updated the XIicPs_SetupMaster to not check for +* Bus Busy condition when the Hold Bit is set. +* 1.01a sg 03/30/12 Fixed an issue in XIicPs_MasterSendPolled where a +* check for transfer completion is added, which indicates + the completion of current transfer. +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +int TransmitFifoFill(XIicPs *InstancePtr); + +static int XIicPs_SetupMaster(XIicPs *InstancePtr, int Role); +static void MasterSendData(XIicPs *InstancePtr); + +/************************* Variable Definitions *****************************/ + +/*****************************************************************************/ +/** +* This function initiates an interrupt-driven send in master mode. +* +* It tries to send the first FIFO-full of data, then lets the interrupt +* handler to handle the rest of the data if there is any. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param MsgPtr is the pointer to the send buffer. +* @param ByteCount is the number of bytes to be sent. +* @param SlaveAddr is the address of the slave we are sending to. +* +* @return None. +* +* @note This send routine is for interrupt-driven transfer only. +* + ****************************************************************************/ +void XIicPs_MasterSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr) +{ + u32 BaseAddr; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(MsgPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(XIICPS_ADDR_MASK >= SlaveAddr); + + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->SendBufferPtr = MsgPtr; + InstancePtr->SendByteCount = ByteCount; + InstancePtr->RecvBufferPtr = NULL; + + /* + * Setup as a master sending role. + */ + XIicPs_SetupMaster(InstancePtr, SENDING_ROLE); + + /* + * Set repeated start if sending more than FIFO of data. + */ + if (ByteCount > XIICPS_FIFO_DEPTH) { + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET) | + XIICPS_CR_HOLD_MASK); + } + + /* + * Do the address transfer to notify the slave. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr); + + TransmitFifoFill(InstancePtr); + + XIicPs_EnableInterrupts(BaseAddr, + XIICPS_IXR_NACK_MASK | XIICPS_IXR_TO_MASK | + XIICPS_IXR_COMP_MASK | XIICPS_IXR_ARB_LOST_MASK); +} + +/*****************************************************************************/ +/** +* This function initiates an interrupt-driven receive in master mode. +* +* It sets the transfer size register so the slave can send data to us. +* The rest of the work is managed by interrupt handler. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param MsgPtr is the pointer to the receive buffer. +* @param ByteCount is the number of bytes to be received. +* @param SlaveAddr is the address of the slave we are receiving from. +* +* @return None. +* +* @note This receive routine is for interrupt-driven transfer only. +* +****************************************************************************/ +void XIicPs_MasterRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount, + u16 SlaveAddr) +{ + u32 BaseAddr; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(MsgPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(XIICPS_ADDR_MASK >= SlaveAddr); + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->RecvBufferPtr = MsgPtr; + InstancePtr->RecvByteCount = ByteCount; + InstancePtr->SendBufferPtr = NULL; + + /* + * Initialize for a master receiving role. + */ + XIicPs_SetupMaster(InstancePtr, RECVING_ROLE); + + XIicPs_EnableInterrupts(BaseAddr, + XIICPS_IXR_NACK_MASK | XIICPS_IXR_TO_MASK | + XIICPS_IXR_DATA_MASK |XIICPS_IXR_RX_OVR_MASK | + XIICPS_IXR_COMP_MASK | XIICPS_IXR_ARB_LOST_MASK); + + /* + * Do the address transfer to signal the slave. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr); + + /* + * Setup the transfer size register so the slave knows how much + * to send to us. + */ + if (ByteCount > XIICPS_FIFO_DEPTH) { + XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET, + XIICPS_FIFO_DEPTH); + } else { + XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET, + ByteCount); + } +} + +/*****************************************************************************/ +/** +* This function initiates a polled mode send in master mode. +* +* It sends data to the FIFO and waits for the slave to pick them up. +* If slave fails to remove data from FIFO, the send fails with +* time out. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param MsgPtr is the pointer to the send buffer. +* @param ByteCount is the number of bytes to be sent. +* @param SlaveAddr is the address of the slave we are sending to. +* +* @return +* - XST_SUCCESS if everything went well. +* - XST_FAILURE if timed out. +* +* @note This send routine is for polled mode transfer only. +* +****************************************************************************/ +int XIicPs_MasterSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, + int ByteCount, u16 SlaveAddr) +{ + u32 IntrStatusReg; + u32 StatusReg; + u32 BaseAddr; + u32 Intrs; + + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(MsgPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(XIICPS_ADDR_MASK >= SlaveAddr); + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->SendBufferPtr = MsgPtr; + InstancePtr->SendByteCount = ByteCount; + + XIicPs_SetupMaster(InstancePtr, SENDING_ROLE); + + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr); + + /* + * Intrs keeps all the error-related interrupts. + */ + Intrs = XIICPS_IXR_ARB_LOST_MASK | XIICPS_IXR_TX_OVR_MASK | + XIICPS_IXR_TO_MASK | XIICPS_IXR_NACK_MASK; + + /* + * Clear the interrupt status register before use it to monitor. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg); + + /* + * Transmit first FIFO full of data. + */ + TransmitFifoFill(InstancePtr); + + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + + /* + * Continue sending as long as there is more data and + * there are no errors. + */ + while ((InstancePtr->SendByteCount > 0) && + ((IntrStatusReg & Intrs) == 0)) { + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + /* + * Wait until transmit FIFO is empty. + */ + if ((StatusReg & XIICPS_SR_TXDV_MASK) != 0) { + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_ISR_OFFSET); + continue; + } + + /* + * Send more data out through transmit FIFO. + */ + TransmitFifoFill(InstancePtr); + } + + /* + * Check for completion of transfer. + */ + while ((XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET) & + XIICPS_IXR_COMP_MASK) != XIICPS_IXR_COMP_MASK); + + /* + * If there is an error, tell the caller. + */ + if (IntrStatusReg & Intrs) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* This function initiates a polled mode receive in master mode. +* +* It repeatedly sets the transfer size register so the slave can +* send data to us. It polls the data register for data to come in. +* If slave fails to send us data, it fails with time out. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param MsgPtr is the pointer to the receive buffer. +* @param ByteCount is the number of bytes to be received. +* @param SlaveAddr is the address of the slave we are receiving from. +* +* @return +* - XST_SUCCESS if everything went well. +* - XST_FAILURE if timed out. +* +* @note This receive routine is for polled mode transfer only. +* +****************************************************************************/ +int XIicPs_MasterRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, + int ByteCount, u16 SlaveAddr) +{ + u32 IntrStatusReg; + u32 Intrs; + u32 StatusReg; + u32 BaseAddr; + int BytesToRecv; + int BytesToRead; + int TransSize; + int Tmp; + + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(MsgPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(XIICPS_ADDR_MASK >= SlaveAddr); + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->RecvBufferPtr = MsgPtr; + InstancePtr->RecvByteCount = ByteCount; + + XIicPs_SetupMaster(InstancePtr, RECVING_ROLE); + + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr); + + /* + * Intrs keeps all the error-related interrupts. + */ + Intrs = XIICPS_IXR_ARB_LOST_MASK | XIICPS_IXR_RX_OVR_MASK | + XIICPS_IXR_RX_UNF_MASK | XIICPS_IXR_TO_MASK | + XIICPS_IXR_NACK_MASK; + + /* + * Clear the interrupt status register before use it to monitor. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg); + + /* + * Set up the transfer size register so the slave knows how much + * to send to us. + */ + if (ByteCount > XIICPS_FIFO_DEPTH) { + XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET, + XIICPS_FIFO_DEPTH); + }else { + XIicPs_WriteReg(BaseAddr, XIICPS_TRANS_SIZE_OFFSET, + ByteCount); + } + + /* + * Pull the interrupt status register to find the errors. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + while ((InstancePtr->RecvByteCount > 0) && + ((IntrStatusReg & Intrs) == 0)) { + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + /* + * If there is no data in the FIFO, check the interrupt + * status register for error, and continue. + */ + if ((StatusReg & XIICPS_SR_RXDV_MASK) == 0) { + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_ISR_OFFSET); + continue; + } + + /* + * The transfer size register shows how much more data slave + * needs to send to us. + */ + TransSize = XIicPs_ReadReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET); + + BytesToRead = InstancePtr->RecvByteCount; + + /* + * If expected number of bytes is greater than FIFO size, + * the master needs to wait for data comes in and set the + * transfer size register for slave to send more. + */ + if (InstancePtr->RecvByteCount > XIICPS_FIFO_DEPTH) { + /* wait slave to send data */ + while ((TransSize > 2) && + ((IntrStatusReg & Intrs) == 0)) { + TransSize = XIicPs_ReadReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET); + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_ISR_OFFSET); + } + + /* + * If timeout happened, it is an error. + */ + if (IntrStatusReg & XIICPS_IXR_TO_MASK) { + return XST_FAILURE; + } + TransSize = XIicPs_ReadReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET); + + /* + * Take trans size into account of how many more should + * be received. + */ + BytesToRecv = InstancePtr->RecvByteCount - + XIICPS_FIFO_DEPTH + TransSize; + + /* Tell slave to send more to us */ + if (BytesToRecv > XIICPS_FIFO_DEPTH) { + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + XIICPS_FIFO_DEPTH); + } else{ + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, BytesToRecv); + } + + BytesToRead = XIICPS_FIFO_DEPTH - TransSize; + } + + Tmp = 0; + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + while ((Tmp < BytesToRead) && + ((IntrStatusReg & Intrs) == 0)) { + StatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_SR_OFFSET); + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_ISR_OFFSET); + + if ((StatusReg & XIICPS_SR_RXDV_MASK) == 0) { + /* No data in fifo */ + continue; + } + XIicPs_RecvByte(InstancePtr); + Tmp ++; + } + } + + if (IntrStatusReg & Intrs) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* This function enables the slave monitor mode. +* +* It enables slave monitor in the control register and enables +* slave ready interrupt. It then does an address transfer to slave. +* Interrupt handler will signal the caller if slave responds to +* the address transfer. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param SlaveAddr is the address of the slave we want to contact. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XIicPs_EnableSlaveMonitor(XIicPs *InstancePtr, u16 SlaveAddr) +{ + u32 BaseAddr; + + Xil_AssertVoid(InstancePtr != NULL); + + BaseAddr = InstancePtr->Config.BaseAddress; + + /* + * Enable slave monitor mode in control register. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET) | + XIICPS_CR_MS_MASK | + XIICPS_CR_NEA_MASK | + XIICPS_CR_SLVMON_MASK ); + + /* + * Set up interrupt flag for slave monitor interrupt. + */ + XIicPs_EnableInterrupts(BaseAddr, XIICPS_IXR_TO_MASK | + XIICPS_IXR_NACK_MASK | XIICPS_IXR_SLV_RDY_MASK); + + /* + * Initialize the slave monitor register. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_SLV_PAUSE_OFFSET, 0xF); + + /* + * Set the slave address to start the slave address transmission. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ADDR_OFFSET, SlaveAddr); + + return; +} + +/*****************************************************************************/ +/** +* This function disables slave monitor mode. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XIicPs_DisableSlaveMonitor(XIicPs *InstancePtr) +{ + u32 BaseAddr; + + Xil_AssertVoid(InstancePtr != NULL); + + BaseAddr = InstancePtr->Config.BaseAddress; + + /* + * Clear slave monitor control bit. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET) + & (~XIICPS_CR_SLVMON_MASK)); + + /* + * Clear interrupt flag for slave monitor interrupt. + */ + XIicPs_DisableInterrupts(BaseAddr, XIICPS_IXR_SLV_RDY_MASK); + + return; +} + +/*****************************************************************************/ +/** +* The interrupt handler for the master mode. It does the protocol handling for +* the interrupt-driven transfers. +* +* Completion events and errors are signaled to upper layer for proper handling. +* +* <pre> +* The interrupts that are handled are: +* - DATA +* This case is handled only for master receive data. +* The master has to request for more data (if there is more data to +* receive) and read the data from the FIFO . +* +* - COMP +* If the Master is transmitting data and there is more data to be +* sent then the data is written to the FIFO. If there is no more data to +* be transmitted then a completion event is signalled to the upper layer +* by calling the callback handler. +* +* If the Master is receiving data then the data is read from the FIFO and +* the Master has to request for more data (if there is more data to +* receive). If all the data has been received then a completion event +* is signalled to the upper layer by calling the callback handler. +* It is an error if the amount of received data is more than expected. +* +* - NAK and SLAVE_RDY +* This is signalled to the upper layer by calling the callback handler. +* +* - All Other interrupts +* These interrupts are marked as error. This is signalled to the upper +* layer by calling the callback handler. +* +* </pre> +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XIicPs_MasterInterruptHandler(XIicPs *InstancePtr) +{ + u32 IntrStatusReg; + u32 IsSend = 0; + u32 StatusEvent = 0; + u32 BaseAddr; + int Tmp; + int BytesToRecv; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + BaseAddr = InstancePtr->Config.BaseAddress; + + /* + * Read the Interrupt status register. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_ISR_OFFSET); + + /* + * Write the status back to clear the interrupts so no events are missed + * while processing this interrupt. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg); + + /* + * Use the Mask register AND with the Interrupt Status register so + * disabled interrupts are not processed. + */ + IntrStatusReg &= ~(XIicPs_ReadReg(BaseAddr, XIICPS_IMR_OFFSET)); + + /* + * Data interrupt. + * + * In master mode, this means master receiving needs to put more data + * into the FIFO. In order to avoid slave times out waiting for ack, + * transfer size register must be set before data is processed. + * + */ + if (0 != (IntrStatusReg & XIICPS_IXR_DATA_MASK)) { + + /* + * Only greater than FIFO size is handled here, otherwise, the + * COMP interrupt will be triggered shortly, and we will handle + * those receives there. + */ + if ((InstancePtr->RecvByteCount) > XIICPS_FIFO_DEPTH){ + /* First find out how many bytes slave has sent us */ + BytesToRecv = XIICPS_FIFO_DEPTH - + XIicPs_ReadReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET); + + if ((InstancePtr->RecvByteCount - BytesToRecv) + > XIICPS_FIFO_DEPTH) { + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + XIICPS_FIFO_DEPTH); + } else { + XIicPs_WriteReg(BaseAddr, + XIICPS_TRANS_SIZE_OFFSET, + (InstancePtr->RecvByteCount - + BytesToRecv)); + } + + /* + * Receive the data out of the FIFO. + */ + for(Tmp = 0; Tmp < BytesToRecv; Tmp ++) { + XIicPs_RecvByte(InstancePtr); + } + + /* + * For receiving of larger than FIFO size, this is all + * the handling we need to do. + */ + return; + } + } + + /* + * Determine whether the device is sending. + */ + if (InstancePtr->RecvBufferPtr == NULL) { + IsSend = 1; + } + + /* + * Complete flag. + */ + if (0 != (IntrStatusReg & XIICPS_IXR_COMP_MASK)) { + if (IsSend) { + if (InstancePtr->SendByteCount > 0) { + MasterSendData(InstancePtr); + } else { + StatusEvent |= XIICPS_EVENT_COMPLETE_SEND; + } + } else { + /* + * Get the data out of FIFO first, if not done, + * tell the slave to send more. + */ + while (XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET) & + XIICPS_SR_RXDV_MASK) { + XIicPs_RecvByte(InstancePtr); + } + + /* + * Continue to tell slave to send data if not done. + */ + if (InstancePtr->RecvByteCount > XIICPS_FIFO_DEPTH) { + + XIicPs_WriteReg( + InstancePtr->Config.BaseAddress, + XIICPS_TRANS_SIZE_OFFSET, + XIICPS_FIFO_DEPTH); + + } else if (InstancePtr->RecvByteCount > 0) { + + XIicPs_WriteReg( + InstancePtr->Config.BaseAddress, + XIICPS_TRANS_SIZE_OFFSET, + InstancePtr->RecvByteCount); + } + + /* + * If all done, tell the application. + */ + if (InstancePtr->RecvByteCount == 0){ + StatusEvent |= XIICPS_EVENT_COMPLETE_RECV; + } + + /* + * If received more than expected, it is an error. + */ + if (InstancePtr->RecvByteCount < 0){ + StatusEvent |= XIICPS_EVENT_ERROR; + } + } + } + + /* + * Slave ready interrupt, it is only meaningful for master mode. + */ + if (0 != (IntrStatusReg & XIICPS_IXR_SLV_RDY_MASK)) { + StatusEvent |= XIICPS_EVENT_SLAVE_RDY; + } + + if (0 != (IntrStatusReg & XIICPS_IXR_NACK_MASK)) { + StatusEvent |= XIICPS_EVENT_NACK; + } + + /* + * All other interrupts are treated as error. + */ + if (0 != (IntrStatusReg & (XIICPS_IXR_TO_MASK | XIICPS_IXR_NACK_MASK | + XIICPS_IXR_ARB_LOST_MASK | XIICPS_IXR_RX_UNF_MASK | + XIICPS_IXR_TX_OVR_MASK | XIICPS_IXR_RX_OVR_MASK))) { + StatusEvent |= XIICPS_EVENT_ERROR; + } + + /* + * Signal application if there are any events. + */ + if (0 != StatusEvent) { + InstancePtr->StatusHandler(InstancePtr->CallBackRef, + StatusEvent); + } + +} + +/*****************************************************************************/ +/* +* This function prepares a device to transfers as a master. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @param Role specifies whether the device is sending or receiving. +* +* @return +* - XST_SUCCESS if everything went well. +* - XST_FAILURE if bus is busy. +* +* @note Interrupts are always disabled, device which needs to use +* interrupts needs to setup interrupts after this call. +* +****************************************************************************/ +static int XIicPs_SetupMaster(XIicPs *InstancePtr, int Role) +{ + u32 ControlReg; + u32 BaseAddr; + u32 EnabledIntr = 0x0; + + Xil_AssertNonvoid(InstancePtr != NULL); + + BaseAddr = InstancePtr->Config.BaseAddress; + ControlReg = XIicPs_ReadReg(BaseAddr, XIICPS_CR_OFFSET); + + + /* + * Only check if bus is busy when repeated start option is not set. + */ + if ((ControlReg & XIICPS_CR_HOLD_MASK) == 0) { + if (XIicPs_BusIsBusy(InstancePtr)) { + return XST_FAILURE; + } + } + + /* + * Set up master, AckEn, nea and also clear fifo. + */ + ControlReg |= XIICPS_CR_ACKEN_MASK | XIICPS_CR_CLR_FIFO_MASK | + XIICPS_CR_NEA_MASK | XIICPS_CR_MS_MASK; + + if (Role == RECVING_ROLE) { + ControlReg |= XIICPS_CR_RD_WR_MASK; + EnabledIntr = XIICPS_IXR_DATA_MASK |XIICPS_IXR_RX_OVR_MASK; + }else { + ControlReg &= ~XIICPS_CR_RD_WR_MASK; + } + EnabledIntr |= XIICPS_IXR_COMP_MASK | XIICPS_IXR_ARB_LOST_MASK; + + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, ControlReg); + + XIicPs_DisableAllInterrupts(BaseAddr); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/* +* This function handles continuation of sending data. It is invoked +* from interrupt handler. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +static void MasterSendData(XIicPs *InstancePtr) +{ + TransmitFifoFill(InstancePtr); + + /* + * Clear repeated start if done, so stop can be sent out. + */ + if (InstancePtr->SendByteCount == 0) { + + /* + * If user has enabled repeated start as an option, + * do not disable it. + */ + if ((InstancePtr->Options & XIICPS_REP_START_OPTION) == 0) { + + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET, + XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET) & ~ XIICPS_CR_HOLD_MASK); + } + } + + return; +} + + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_options.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_options.c new file mode 100755 index 000000000..4d30b9143 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_options.c @@ -0,0 +1,455 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_options.c +* +* Contains functions for the configuration of the XIccPs driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00a drg/jz 01/30/10 First release +* 1.02a sg 08/29/12 Updated the logic to arrive at the best divisors +* to achieve I2C clock with minimum error. +* This is a fix for CR #674195 +* 1.03a hk 05/04/13 Initialized BestDivA and BestDivB to 0. + This is fix for CR#704398 to remove warning. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ +/* + * Create the table of options which are processed to get/set the device + * options. These options are table driven to allow easy maintenance and + * expansion of the options. + */ +typedef struct { + u32 Option; + u32 Mask; +} OptionsMap; + +static OptionsMap OptionsTable[] = { + {XIICPS_7_BIT_ADDR_OPTION, XIICPS_CR_NEA_MASK}, + {XIICPS_10_BIT_ADDR_OPTION, XIICPS_CR_NEA_MASK}, + {XIICPS_SLAVE_MON_OPTION, XIICPS_CR_SLVMON_MASK}, + {XIICPS_REP_START_OPTION, XIICPS_CR_HOLD_MASK}, +}; + +#define XIICPS_NUM_OPTIONS (sizeof(OptionsTable) / sizeof(OptionsMap)) + +/*****************************************************************************/ +/** +* +* This function sets the options for the IIC device driver. The options control +* how the device behaves relative to the IIC bus. The device must be idle +* rather than busy transferring data before setting these device options. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param Options contains the specified options to be set. This is a bit +* mask where a 1 means to turn the option on. One or more bit +* values may be contained in the mask. See the bit definitions +* named XIICPS_*_OPTION in xiicps.h. +* +* @return +* - XST_SUCCESS if options are successfully set. +* - XST_DEVICE_IS_STARTED if the device is currently transferring +* data. The transfer must complete or be aborted before setting +* options. +* +* @note None. +* +******************************************************************************/ +int XIicPs_SetOptions(XIicPs *InstancePtr, u32 Options) +{ + u32 ControlReg; + unsigned int Index; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET); + + /* + * Loop through the options table, turning the option on. + */ + for (Index = 0; Index < XIICPS_NUM_OPTIONS; Index++) { + if (Options & OptionsTable[Index].Option) { + /* + * 10-bit option is specially treated, because it is + * using the 7-bit option, so turning it on means + * turning 7-bit option off. + */ + if (OptionsTable[Index].Option & + XIICPS_10_BIT_ADDR_OPTION) { + /* Turn 7-bit off */ + ControlReg &= ~OptionsTable[Index].Mask; + } else { + /* Turn 7-bit on */ + ControlReg |= OptionsTable[Index].Mask; + } + } + } + + /* + * Now write to the control register. Leave it to the upper layers + * to restart the device. + */ + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, + ControlReg); + + /* + * Keep a copy of what options this instance has. + */ + InstancePtr->Options = XIicPs_GetOptions(InstancePtr); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function clears the options for the IIC device driver. The options +* control how the device behaves relative to the IIC bus. The device must be +* idle rather than busy transferring data before setting these device options. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param Options contains the specified options to be cleared. This is a +* bit mask where a 1 means to turn the option off. One or more bit +* values may be contained in the mask. See the bit definitions +* named XIICPS_*_OPTION in xiicps.h. +* +* @return +* - XST_SUCCESS if options are successfully set. +* - XST_DEVICE_IS_STARTED if the device is currently transferring +* data. The transfer must complete or be aborted before setting +* options. +* +* @note None +* +******************************************************************************/ +int XIicPs_ClearOptions(XIicPs *InstancePtr, u32 Options) +{ + u32 ControlReg; + unsigned int Index; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET); + + /* + * Loop through the options table and clear the specified options. + */ + for (Index = 0; Index < XIICPS_NUM_OPTIONS; Index++) { + if (Options & OptionsTable[Index].Option) { + + /* + * 10-bit option is specially treated, because it is + * using the 7-bit option, so clearing it means turning + * 7-bit option on. + */ + if (OptionsTable[Index].Option & + XIICPS_10_BIT_ADDR_OPTION) { + + /* Turn 7-bit on */ + ControlReg |= OptionsTable[Index].Mask; + } else { + + /* Turn 7-bit off */ + ControlReg &= ~OptionsTable[Index].Mask; + } + } + } + + + /* + * Now write the control register. Leave it to the upper layers + * to restart the device. + */ + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, + ControlReg); + + /* + * Keep a copy of what options this instance has. + */ + InstancePtr->Options = XIicPs_GetOptions(InstancePtr); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function gets the options for the IIC device. The options control how +* the device behaves relative to the IIC bus. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return 32 bit mask of the options, where a 1 means the option is on, +* and a 0 means to the option is off. One or more bit values may +* be contained in the mask. See the bit definitions named +* XIICPS_*_OPTION in the file xiicps.h. +* +* @note None. +* +******************************************************************************/ +u32 XIicPs_GetOptions(XIicPs *InstancePtr) +{ + u32 OptionsFlag = 0; + u32 ControlReg; + unsigned int Index; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read control register to find which options are currently set. + */ + ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET); + + /* + * Loop through the options table to determine which options are set. + */ + for (Index = 0; Index < XIICPS_NUM_OPTIONS; Index++) { + if (ControlReg & OptionsTable[Index].Mask) { + OptionsFlag |= OptionsTable[Index].Option; + } + if ((ControlReg & XIICPS_CR_NEA_MASK) == 0) { + OptionsFlag |= XIICPS_10_BIT_ADDR_OPTION; + } + } + + return OptionsFlag; +} + +/*****************************************************************************/ +/** +* +* This function sets the serial clock rate for the IIC device. The device +* must be idle rather than busy transferring data before setting these device +* options. +* +* The data rate is set by values in the control register. The formula for +* determining the correct register values is: +* Fscl = Fpclk/(22 x (divisor_a+1) x (divisor_b+1)) +* See the hardware data sheet for a full explanation of setting the serial +* clock rate. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param FsclHz is the clock frequency in Hz. The two most common clock +* rates are 100KHz and 400KHz. +* +* @return +* - XST_SUCCESS if options are successfully set. +* - XST_DEVICE_IS_STARTED if the device is currently transferring +* data. The transfer must complete or be aborted before setting +* options. +* - XST_FAILURE if the Fscl frequency can not be set. +* +* @note The clock can not be faster than the input clock divide by 22. +* +******************************************************************************/ +int XIicPs_SetSClk(XIicPs *InstancePtr, u32 FsclHz) +{ + u32 Div_a; + u32 Div_b; + u32 ActualFscl; + u32 Temp; + u32 TempLimit; + u32 LastError; + u32 BestError; + u32 CurrentError; + u32 ControlReg; + u32 CalcDivA; + u32 CalcDivB; + u32 BestDivA = 0; + u32 BestDivB = 0; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(FsclHz > 0); + + if (0 != XIicPs_In32((InstancePtr->Config.BaseAddress) + + XIICPS_TRANS_SIZE_OFFSET)) { + return XST_DEVICE_IS_STARTED; + } + + /* + * Assume Div_a is 0 and calculate (divisor_a+1) x (divisor_b+1). + */ + Temp = (InstancePtr->Config.InputClockHz) / (22 * FsclHz); + + /* + * If the answer is negative or 0, the Fscl input is out of range. + */ + if (0 == Temp) { + return XST_FAILURE; + } + + /* + * TempLimit helps in iterating over the consecutive value of Temp to + * find the closest clock rate achievable with divisors. + * Iterate over the next value only if fractional part is involved. + */ + TempLimit = ((InstancePtr->Config.InputClockHz) % (22 * FsclHz)) ? + Temp + 1 : Temp; + BestError = FsclHz; + + for ( ; Temp <= TempLimit ; Temp++) + { + LastError = FsclHz; + CalcDivA = 0; + CalcDivB = 0; + CurrentError = 0; + + for (Div_b = 0; Div_b < 64; Div_b++) { + + Div_a = Temp / (Div_b + 1); + + if (Div_a != 0) + Div_a = Div_a - 1; + + if (Div_a > 3) + continue; + + ActualFscl = (InstancePtr->Config.InputClockHz) / + (22 * (Div_a + 1) * (Div_b + 1)); + + if (ActualFscl > FsclHz) + CurrentError = (ActualFscl - FsclHz); + else + CurrentError = (FsclHz - ActualFscl); + + if (LastError > CurrentError) { + CalcDivA = Div_a; + CalcDivB = Div_b; + LastError = CurrentError; + } + } + + /* + * Used to capture the best divisors. + */ + if (LastError < BestError) { + BestError = LastError; + BestDivA = CalcDivA; + BestDivB = CalcDivB; + } + } + + + /* + * Read the control register and mask the Divisors. + */ + ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET); + ControlReg &= ~(XIICPS_CR_DIV_A_MASK | XIICPS_CR_DIV_B_MASK); + ControlReg |= (BestDivA << XIICPS_CR_DIV_A_SHIFT) | + (BestDivB << XIICPS_CR_DIV_B_SHIFT); + + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, XIICPS_CR_OFFSET, + ControlReg); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function gets the serial clock rate for the IIC device. The device +* must be idle rather than busy transferring data before setting these device +* options. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return The value of the IIC clock to the nearest Hz based on the +* control register settings. The actual value may not be exact to +* to integer math rounding errors. +* +* @note None. +* +******************************************************************************/ +u32 XIicPs_GetSClk(XIicPs *InstancePtr) +{ + u32 ControlReg; + u32 ActualFscl; + u32 Div_a; + u32 Div_b; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + ControlReg = XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET); + + Div_a = (ControlReg & XIICPS_CR_DIV_A_MASK) >> XIICPS_CR_DIV_A_SHIFT; + Div_b = (ControlReg & XIICPS_CR_DIV_B_MASK) >> XIICPS_CR_DIV_B_SHIFT; + + ActualFscl = (InstancePtr->Config.InputClockHz) / + (22 * (Div_a + 1) * (Div_b + 1)); + + return ActualFscl; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_selftest.c new file mode 100755 index 000000000..aa2bca1cc --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_selftest.c @@ -0,0 +1,140 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_selftest.c +* +* This component contains the implementation of selftest functions for the +* XIicPs driver component. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- --------------------------------------------- +* 1.00a drg/jz 01/30/10 First release +* 1.00a sdm 09/22/11 Removed unused code +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + +#define REG_TEST_VALUE 0x00000005 + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Runs a self-test on the driver/device. The self-test is destructive in that +* a reset of the device is performed in order to check the reset values of +* the registers and to get the device into a known state. +* +* Upon successful return from the self-test, the device is reset. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return +* - XST_SUCCESS if successful. +* - XST_REGISTER_ERROR indicates a register did not read or write +* correctly +* +* @note None. +* +******************************************************************************/ +int XIicPs_SelfTest(XIicPs *InstancePtr) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * All the IIC registers should be in their default state right now. + */ + if ((XIICPS_CR_RESET_VALUE != + XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_CR_OFFSET)) || + (XIICPS_TO_RESET_VALUE != + XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_TIME_OUT_OFFSET)) || + (XIICPS_IXR_ALL_INTR_MASK != + XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_IMR_OFFSET))) { + return XST_FAILURE; + } + + XIicPs_Reset(InstancePtr); + + /* + * Write, Read then write a register + */ + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_SLV_PAUSE_OFFSET, REG_TEST_VALUE); + + if (REG_TEST_VALUE != XIicPs_ReadReg(InstancePtr->Config.BaseAddress, + XIICPS_SLV_PAUSE_OFFSET)) { + return XST_FAILURE; + } + + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_SLV_PAUSE_OFFSET, 0); + + XIicPs_Reset(InstancePtr); + + return XST_SUCCESS; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_sinit.c new file mode 100755 index 000000000..fcf30b63d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_sinit.c @@ -0,0 +1,107 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xiicps_sinit.c +* +* The implementation of the XIicPs component's static initialization +* functionality. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- -------------------------------------------- +* 1.00a drg/jz 01/30/10 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xparameters.h" +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +extern XIicPs_Config XIicPs_ConfigTable[]; + +/*****************************************************************************/ +/** +* +* Looks up the device configuration based on the unique device ID. A table +* contains the configuration info for each device in the system. +* +* @param DeviceId contains the ID of the device to look up the +* configuration for. +* +* @return A pointer to the configuration found or NULL if the specified +* device ID was not found. See xiicps.h for the definition of +* XIicPs_Config. +* +* @note None. +* +******************************************************************************/ +XIicPs_Config *XIicPs_LookupConfig(u16 DeviceId) +{ + XIicPs_Config *CfgPtr = NULL; + int Index; + + for (Index = 0; Index < XPAR_XIICPS_NUM_INSTANCES; Index++) { + if (XIicPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XIicPs_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_slave.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_slave.c new file mode 100755 index 000000000..f9170aaaf --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/iicps_v1_04_a/src/xiicps_slave.c @@ -0,0 +1,585 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xiicps_slave.c +* +* Handles slave transfers +* +* <pre> MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -- -------- --------------------------------------------- +* 1.00a jz 01/30/10 First release +* 1.04a kpc 08/30/13 Avoid buffer overwrite in SlaveRecvData function +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xiicps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ +extern int TransmitFifoFill(XIicPs *InstancePtr); + +static int SlaveRecvData(XIicPs *InstancePtr); + +/************************* Variable Definitions *****************************/ + +/*****************************************************************************/ +/** +* This function sets up the device to be a slave. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param SlaveAddr is the address of the slave we are receiving from. +* +* @return None. +* +* @note +* Interrupt is always enabled no matter the tranfer is interrupt- +* driven or polled mode. Whether device will be interrupted or not +* depends on whether the device is connected to an interrupt +* controller and interrupt for the device is enabled. +* +****************************************************************************/ +void XIicPs_SetupSlave(XIicPs *InstancePtr, u16 SlaveAddr) +{ + volatile u32 ControlReg; + u32 BaseAddr; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(XIICPS_ADDR_MASK >= SlaveAddr); + + BaseAddr = InstancePtr->Config.BaseAddress; + + ControlReg = XIicPs_In32(BaseAddr + XIICPS_CR_OFFSET); + + /* + * Set up master, AckEn, nea and also clear fifo. + */ + ControlReg |= XIICPS_CR_ACKEN_MASK | XIICPS_CR_CLR_FIFO_MASK; + ControlReg |= XIICPS_CR_NEA_MASK; + ControlReg &= ~XIICPS_CR_MS_MASK; + + XIicPs_WriteReg(BaseAddr, XIICPS_CR_OFFSET, + ControlReg); + + XIicPs_DisableAllInterrupts(BaseAddr); + + XIicPs_WriteReg(InstancePtr->Config.BaseAddress, + XIICPS_ADDR_OFFSET, SlaveAddr); + + return; +} + +/*****************************************************************************/ +/** +* This function setup a slave interrupt-driven send. It set the repeated +* start for the device is the tranfer size is larger than FIFO depth. +* Data processing for the send is initiated by the interrupt handler. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param MsgPtr is the pointer to the send buffer. +* @param ByteCount is the number of bytes to be sent. +* +* @return None. +* +* @note This send routine is for interrupt-driven transfer only. +* +****************************************************************************/ +void XIicPs_SlaveSend(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount) +{ + u32 BaseAddr; + + /* + * Assert validates the input arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(MsgPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->SendBufferPtr = MsgPtr; + InstancePtr->SendByteCount = ByteCount; + InstancePtr->RecvBufferPtr = NULL; + + XIicPs_EnableInterrupts(BaseAddr, + XIICPS_IXR_DATA_MASK | XIICPS_IXR_COMP_MASK | + XIICPS_IXR_TO_MASK | XIICPS_IXR_NACK_MASK | + XIICPS_IXR_TX_OVR_MASK); +} + +/*****************************************************************************/ +/** +* This function setup a slave interrupt-driven receive. +* Data processing for the receive is handled by the interrupt handler. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param MsgPtr is the pointer to the receive buffer. +* @param ByteCount is the number of bytes to be received. +* +* @return None. +* +* @note This routine is for interrupt-driven transfer only. +* +****************************************************************************/ +void XIicPs_SlaveRecv(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount) +{ + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(MsgPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + InstancePtr->RecvBufferPtr = MsgPtr; + InstancePtr->RecvByteCount = ByteCount; + InstancePtr->SendBufferPtr = NULL; + + XIicPs_EnableInterrupts(InstancePtr->Config.BaseAddress, + XIICPS_IXR_DATA_MASK | XIICPS_IXR_COMP_MASK | + XIICPS_IXR_NACK_MASK | XIICPS_IXR_TO_MASK | + XIICPS_IXR_RX_OVR_MASK | XIICPS_IXR_RX_UNF_MASK); + +} + +/*****************************************************************************/ +/** +* This function sends a buffer in polled mode as a slave. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param MsgPtr is the pointer to the send buffer. +* @param ByteCount is the number of bytes to be sent. +* +* @return +* - XST_SUCCESS if everything went well. +* - XST_FAILURE if master sends us data or master terminates the +* transfer before all data has sent out. +* +* @note This send routine is for polled mode transfer only. +* +****************************************************************************/ +int XIicPs_SlaveSendPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount) +{ + volatile u32 IntrStatusReg; + volatile u32 StatusReg; + u32 BaseAddr; + int Tmp; + int BytesToSend; + int Error = 0; + + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(MsgPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->SendBufferPtr = MsgPtr; + InstancePtr->SendByteCount = ByteCount; + + /* + * Use RXRW bit in status register to wait master to start a read. + */ + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + while (((StatusReg & XIICPS_SR_RXRW_MASK) == 0) && (!Error)) { + + /* + * If master tries to send us data, it is an error. + */ + if (StatusReg & XIICPS_SR_RXDV_MASK) { + Error = 1; + } + + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + } + + if (Error) { + return XST_FAILURE; + } + + /* + * Clear the interrupt status register. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg); + + /* + * Send data as long as there is more data to send and + * there are no errors. + */ + while ((InstancePtr->SendByteCount > 0) && (!Error)){ + + /* + * Find out how many can be sent. + */ + BytesToSend = InstancePtr->SendByteCount; + if (BytesToSend > XIICPS_FIFO_DEPTH) { + BytesToSend = XIICPS_FIFO_DEPTH; + } + + for(Tmp = 0; Tmp < BytesToSend; Tmp ++) { + XIicPs_SendByte(InstancePtr); + } + + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + /* + * Wait for master to read the data out of fifo. + */ + while (((StatusReg & XIICPS_SR_TXDV_MASK) != 0) && (!Error)) { + + /* + * If master terminates the transfer before all data is + * sent, it is an error. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_ISR_OFFSET); + if (IntrStatusReg & XIICPS_IXR_NACK_MASK) { + Error = 1; + } + + /* Clear ISR. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, + IntrStatusReg); + + StatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_SR_OFFSET); + } + } + + if (Error) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} +/*****************************************************************************/ +/** +* This function receives a buffer in polled mode as a slave. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* @param MsgPtr is the pointer to the receive buffer. +* @param ByteCount is the number of bytes to be received. +* +* @return +* - XST_SUCCESS if everything went well. +* - XST_FAILURE if timed out. +* +* @note This receive routine is for polled mode transfer only. +* +****************************************************************************/ +int XIicPs_SlaveRecvPolled(XIicPs *InstancePtr, u8 *MsgPtr, int ByteCount) +{ + volatile u32 IntrStatusReg; + volatile u32 StatusReg; + u32 BaseAddr; + + /* + * Assert validates the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(MsgPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + BaseAddr = InstancePtr->Config.BaseAddress; + InstancePtr->RecvBufferPtr = MsgPtr; + InstancePtr->RecvByteCount = ByteCount; + + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + /* + * Clear the interrupt status register. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg); + + /* + * Clear the status register. + */ + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + XIicPs_WriteReg(BaseAddr, XIICPS_SR_OFFSET, StatusReg); + + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + while (InstancePtr->RecvByteCount > 0) { + + /* Wait for master to put data */ + while ((StatusReg & XIICPS_SR_RXDV_MASK) == 0) { + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + /* + * If master terminates the transfer before we get all + * the data or the master tries to read from us, + * it is an error. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_ISR_OFFSET); + if ((IntrStatusReg & (XIICPS_IXR_DATA_MASK | + XIICPS_IXR_COMP_MASK)) && + ((StatusReg & XIICPS_SR_RXDV_MASK) == 0) && + (InstancePtr->RecvByteCount > 0)) { + + return XST_FAILURE; + } + + /* + * Clear the interrupt status register. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, + IntrStatusReg); + } + + /* + * Read all data from FIFO. + */ + while ((StatusReg & XIICPS_SR_RXDV_MASK) && + (InstancePtr->RecvByteCount > 0)){ + + XIicPs_RecvByte(InstancePtr); + + StatusReg = XIicPs_ReadReg(BaseAddr, + XIICPS_SR_OFFSET); + } + } + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* The interrupt handler for slave mode. It does the protocol handling for +* the interrupt-driven transfers. +* +* Completion events and errors are signaled to upper layer for proper +* handling. +* +* <pre> +* +* The interrupts that are handled are: +* - DATA +* If the instance is sending, it means that the master wants to read more +* data from us. Send more data, and check whether we are done with this +* send. +* +* If the instance is receiving, it means that the master has writen +* more data to us. Receive more data, and check whether we are done with +* with this receive. +* +* - COMP +* This marks that stop sequence has been sent from the master, transfer +* is about to terminate. However, for receiving, the master may have +* written us some data, so receive that first. +* +* It is an error if the amount of transfered data is less than expected. +* +* - NAK +* This marks that master does not want our data. It is for send only. +* +* - Other interrupts +* These interrupts are marked as error. +* +* </pre> +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XIicPs_SlaveInterruptHandler(XIicPs *InstancePtr) +{ + volatile u32 IntrStatusReg; + u32 IsSend = 0; + u32 StatusEvent = 0; + int LeftOver; + u32 BaseAddr; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + BaseAddr = InstancePtr->Config.BaseAddress; + + /* + * Read the Interrupt status register. + */ + IntrStatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_ISR_OFFSET); + + /* + * Write the status back to clear the interrupts so no events are missed + * while processing this interrupt. + */ + XIicPs_WriteReg(BaseAddr, XIICPS_ISR_OFFSET, IntrStatusReg); + + /* + * Use the Mask register AND with the Interrupt Status register so + * disabled interrupts are not processed. + */ + IntrStatusReg &= ~(XIicPs_ReadReg(BaseAddr, XIICPS_IMR_OFFSET)); + + /* + * Determine whether the device is sending. + */ + if (InstancePtr->RecvBufferPtr == NULL) { + IsSend = 1; + } + + /* Data interrupt + * + * This means master wants to do more data transfers. + * Also check for completion of transfer, signal upper layer if done. + */ + if (0 != (IntrStatusReg & XIICPS_IXR_DATA_MASK)) { + if (IsSend) { + LeftOver = TransmitFifoFill(InstancePtr); + /* + * We may finish send here + */ + if (LeftOver == 0) { + StatusEvent |= + XIICPS_EVENT_COMPLETE_SEND; + } + } else { + LeftOver = SlaveRecvData(InstancePtr); + + /* We may finish the receive here */ + if (LeftOver == 0) { + StatusEvent |= XIICPS_EVENT_COMPLETE_RECV; + } + } + } + + /* + * Complete interrupt. + * + * In slave mode, it means the master has done with this transfer, so + * we signal the application using completion event. + */ + if (0 != (IntrStatusReg & XIICPS_IXR_COMP_MASK)) { + if (IsSend) { + if (InstancePtr->SendByteCount > 0) { + StatusEvent |= XIICPS_EVENT_ERROR; + }else { + StatusEvent |= XIICPS_EVENT_COMPLETE_SEND; + } + } else { + LeftOver = SlaveRecvData(InstancePtr); + if (LeftOver > 0) { + StatusEvent |= XIICPS_EVENT_ERROR; + } else { + StatusEvent |= XIICPS_EVENT_COMPLETE_RECV; + } + } + } + + /* + * Nack interrupt, pass this information to application. + */ + if (0 != (IntrStatusReg & XIICPS_IXR_NACK_MASK)) { + StatusEvent |= XIICPS_EVENT_NACK; + } + + /* + * All other interrupts are treated as error. + */ + if (0 != (IntrStatusReg & (XIICPS_IXR_TO_MASK | + XIICPS_IXR_RX_UNF_MASK | + XIICPS_IXR_TX_OVR_MASK | + XIICPS_IXR_RX_OVR_MASK))){ + + StatusEvent |= XIICPS_EVENT_ERROR; + } + + /* + * Signal application if there are any events. + */ + if (0 != StatusEvent) { + InstancePtr->StatusHandler(InstancePtr->CallBackRef, + StatusEvent); + } +} + +/*****************************************************************************/ +/* +* +* This function handles continuation of receiving data. It is invoked +* from interrupt handler. +* +* @param InstancePtr is a pointer to the XIicPs instance. +* +* @return Number of bytes still expected by the instance. +* +* @note None. +* +****************************************************************************/ +static int SlaveRecvData(XIicPs *InstancePtr) +{ + volatile u32 StatusReg; + u32 BaseAddr; + + BaseAddr = InstancePtr->Config.BaseAddress; + + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + + while ((StatusReg & XIICPS_SR_RXDV_MASK) && + (InstancePtr->RecvByteCount > 0)) { + XIicPs_RecvByte(InstancePtr); + StatusReg = XIicPs_ReadReg(BaseAddr, XIICPS_SR_OFFSET); + } + + return InstancePtr->RecvByteCount; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/Makefile new file mode 100755 index 000000000..c05a30d97 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xqspips_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling qspips" + +xqspips_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xqspips_includes + +xqspips_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips.c new file mode 100755 index 000000000..a017dbcd0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips.c @@ -0,0 +1,1558 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips.c +* +* Contains implements the interface functions of the XQspiPs driver. +* See xqspips.h for a detailed description of the device and driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 1.00 sdm 11/25/10 First release +* 2.00a kka 07/25/12 Removed XQspiPs_GetWriteData API. +* The XQspiPs_SetSlaveSelect has been modified to remove +* the argument of the slave select as the QSPI controller +* only supports one slave. +* XQspiPs_GetSlaveSelect API has been removed +* Added logic to XQspiPs_GetReadData to handle data +* shift for normal data reads and instruction/status +* reads differently based on the ShiftReadData flag. +* Removed the selection for the following options: +* Master mode (XQSPIPS_MASTER_OPTION) and +* Flash interface mode (XQSPIPS_FLASH_MODE_OPTION) option +* as the QSPI driver supports the Master mode +* and Flash Interface mode and doesnot support +* Slave mode or the legacy mode. +* Modified the XQspiPs_PolledTransfer and XQspiPs_Transfer +* APIs so that the last argument (IsInst) specifying whether +* it is instruction or data has been removed. The first byte +* in the SendBufPtr argument of these APIs specify the +* instruction to be sent to the Flash Device. +* The XQspiPs_PolledTransfer function has been updated +* to fill the data to fifo depth. +* This version of the driver fixes CRs 670197/663787. +* 2.01a sg 02/03/13 Added flash opcodes for DUAL_IO_READ,QUAD_IO_READ. +* Created macros XQspiPs_IsManualStart and +* XQspiPs_IsManualChipSelect. +* Changed QSPI transfer logic for polled and interrupt +* modes to be based on filled tx fifo count and receive +* based on it. RXNEMPTY interrupt is not used. +* Added assertions to XQspiPs_LqspiRead function. +* +* 2.02a hk 05/14/13 Added enable and disable to the XQspiPs_LqspiRead() +* function +* Added instructions for bank selection, die erase and +* flag status register to the flash instruction table +* Handling for instructions not in flash instruction +* table added. Checking for Tx FIFO empty when switching from +* TXD1/2/3 to TXD0 added. If WRSR instruction is sent with +* byte count 3 (spansion), instruction size and TXD register +* changed accordingly. CR# 712502 and 703869. +* Added (#ifdef linear base address) in the Linear read function. +* Changed XPAR_XQSPIPS_0_LINEAR_BASEADDR to +* XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR in +* XQspiPs_LqspiRead function. Fix for CR#718141 +* +* 2.03a hk 09/05/13 Modified polled and interrupt transfers to make use of +* thresholds. This is to improve performance. +* Added RX and TX threshold reset to one in XQspiPs_Abort. +* Added RX threshold reset(1) after transfer in polled and +* interrupt transfers. Made changes to make sure threshold +* change is done only when no transfer is in progress. +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xqspips.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/** + * This typedef defines qspi flash instruction format + */ +typedef struct { + u8 OpCode; /**< Operational code of the instruction */ + u8 InstSize; /**< Size of the instruction including address bytes */ + u8 TxOffset; /**< Register address where instruction has to be + written */ +} XQspiPsInstFormat; + +/***************** Macros (Inline Functions) Definitions *********************/ + +#define ARRAY_SIZE(Array) (sizeof(Array) / sizeof((Array)[0])) + +/************************** Function Prototypes ******************************/ +static void XQspiPs_GetReadData(XQspiPs *InstancePtr, u32 Data, u8 Size); +static void StubStatusHandler(void *CallBackRef, u32 StatusEvent, + unsigned ByteCount); + +/************************** Variable Definitions *****************************/ + +/* + * List of all the QSPI instructions and its format + */ +static XQspiPsInstFormat FlashInst[] = { + { XQSPIPS_FLASH_OPCODE_WREN, 1, XQSPIPS_TXD_01_OFFSET }, + { XQSPIPS_FLASH_OPCODE_WRDS, 1, XQSPIPS_TXD_01_OFFSET }, + { XQSPIPS_FLASH_OPCODE_RDSR1, 2, XQSPIPS_TXD_10_OFFSET }, + { XQSPIPS_FLASH_OPCODE_RDSR2, 2, XQSPIPS_TXD_10_OFFSET }, + { XQSPIPS_FLASH_OPCODE_WRSR, 2, XQSPIPS_TXD_10_OFFSET }, + { XQSPIPS_FLASH_OPCODE_PP, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_SE, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_BE_32K, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_BE_4K, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_BE, 1, XQSPIPS_TXD_01_OFFSET }, + { XQSPIPS_FLASH_OPCODE_ERASE_SUS, 1, XQSPIPS_TXD_01_OFFSET }, + { XQSPIPS_FLASH_OPCODE_ERASE_RES, 1, XQSPIPS_TXD_01_OFFSET }, + { XQSPIPS_FLASH_OPCODE_RDID, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_NORM_READ, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_FAST_READ, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_DUAL_READ, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_QUAD_READ, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_DUAL_IO_READ, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_QUAD_IO_READ, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_BRWR, 2, XQSPIPS_TXD_10_OFFSET }, + { XQSPIPS_FLASH_OPCODE_BRRD, 2, XQSPIPS_TXD_10_OFFSET }, + { XQSPIPS_FLASH_OPCODE_EARWR, 2, XQSPIPS_TXD_10_OFFSET }, + { XQSPIPS_FLASH_OPCODE_EARRD, 2, XQSPIPS_TXD_10_OFFSET }, + { XQSPIPS_FLASH_OPCODE_DIE_ERASE, 4, XQSPIPS_TXD_00_OFFSET }, + { XQSPIPS_FLASH_OPCODE_READ_FLAG_SR, 2, XQSPIPS_TXD_10_OFFSET }, + { XQSPIPS_FLASH_OPCODE_CLEAR_FLAG_SR, 1, XQSPIPS_TXD_01_OFFSET }, + /* Add all the instructions supported by the flash device */ +}; + +/*****************************************************************************/ +/** +* +* Initializes a specific XQspiPs instance such that the driver is ready to use. +* +* The state of the device after initialization is: +* - Master mode +* - Active high clock polarity +* - Clock phase 0 +* - Baud rate divisor 2 +* - Transfer width 32 +* - Master reference clock = pclk +* - No chip select active +* - Manual CS and Manual Start disabled +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param ConfigPtr is a reference to a structure containing information +* about a specific QSPI device. This function initializes an +* InstancePtr object for a specific device specified by the +* contents of Config. +* @param EffectiveAddr is the device base address in the virtual memory +* address space. The caller is responsible for keeping the address +* mapping from EffectiveAddr to the device physical base address +* unchanged once this function is invoked. Unexpected errors may +* occur if the address mapping changes after this function is +* called. If address translation is not used, use +* ConfigPtr->Config.BaseAddress for this device. +* +* @return +* - XST_SUCCESS if successful. +* - XST_DEVICE_IS_STARTED if the device is already started. +* It must be stopped to re-initialize. +* +* @note None. +* +******************************************************************************/ +int XQspiPs_CfgInitialize(XQspiPs *InstancePtr, XQspiPs_Config *ConfigPtr, + u32 EffectiveAddr) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + /* + * If the device is busy, disallow the initialize and return a status + * indicating it is already started. This allows the user to stop the + * device and re-initialize, but prevents a user from inadvertently + * initializing. This assumes the busy flag is cleared at startup. + */ + if (InstancePtr->IsBusy == TRUE) { + return XST_DEVICE_IS_STARTED; + } + + /* + * Set some default values. + */ + InstancePtr->IsBusy = FALSE; + + InstancePtr->Config.BaseAddress = EffectiveAddr; + InstancePtr->StatusHandler = StubStatusHandler; + + InstancePtr->SendBufferPtr = NULL; + InstancePtr->RecvBufferPtr = NULL; + InstancePtr->RequestedBytes = 0; + InstancePtr->RemainingBytes = 0; + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + InstancePtr->Config.ConnectionMode = ConfigPtr->ConnectionMode; + + /* + * Reset the QSPI device to get it into its initial state. It is + * expected that device configuration will take place after this + * initialization is done, but before the device is started. + */ + XQspiPs_Reset(InstancePtr); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Resets the QSPI device. Reset must only be called after the driver has been +* initialized. Any data transfer that is in progress is aborted. +* +* The upper layer software is responsible for re-configuring (if necessary) +* and restarting the QSPI device after the reset. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XQspiPs_Reset(XQspiPs *InstancePtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Abort any transfer that is in progress + */ + XQspiPs_Abort(InstancePtr); + + /* + * Reset any values that are not reset by the hardware reset such that + * the software state matches the hardware device + */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPS_CR_OFFSET, + XQSPIPS_CR_RESET_STATE); +} + +/*****************************************************************************/ +/** +* +* Aborts a transfer in progress by disabling the device and flush the RxFIFO. +* The byte counts are cleared, the busy flag is cleared. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return None. +* +* @note +* +* This function does a read/modify/write of the config register. The user of +* this function needs to take care of critical sections. +* +******************************************************************************/ +void XQspiPs_Abort(XQspiPs *InstancePtr) +{ + u32 ConfigReg; + + XQspiPs_Disable(InstancePtr); + + /* + * De-assert slave select lines. + */ + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= (XQSPIPS_CR_SSCTRL_MASK | XQSPIPS_CR_SSFORCE_MASK); + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + + /* + * Set the RX and TX FIFO threshold to reset value (one) + */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_RXWR_OFFSET, XQSPIPS_RXWR_RESET_VALUE); + + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_TXWR_OFFSET, XQSPIPS_TXWR_RESET_VALUE); + + /* + * Clear the RX FIFO and drop any data. + */ + while ((XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_SR_OFFSET) & XQSPIPS_IXR_RXNEMPTY_MASK) != 0) { + XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_RXD_OFFSET); + } + + InstancePtr->RemainingBytes = 0; + InstancePtr->RequestedBytes = 0; + InstancePtr->IsBusy = FALSE; +} + +/*****************************************************************************/ +/** +* +* Transfers specified data on the QSPI bus. Initiates bus communication and +* sends/receives data to/from the selected QSPI slave. For every byte sent, +* a byte is received. +* +* The caller has the option of providing two different buffers for send and +* receive, or one buffer for both send and receive, or no buffer for receive. +* The receive buffer must be at least as big as the send buffer to prevent +* unwanted memory writes. This implies that the byte count passed in as an +* argument must be the smaller of the two buffers if they differ in size. +* Here are some sample usages: +* <pre> +* XQspiPs_Transfer(InstancePtr, SendBuf, RecvBuf, ByteCount) +* The caller wishes to send and receive, and provides two different +* buffers for send and receive. +* +* XQspiPs_Transfer(InstancePtr, SendBuf, NULL, ByteCount) +* The caller wishes only to send and does not care about the received +* data. The driver ignores the received data in this case. +* +* XQspiPs_Transfer(InstancePtr, SendBuf, SendBuf, ByteCount) +* The caller wishes to send and receive, but provides the same buffer +* for doing both. The driver sends the data and overwrites the send +* buffer with received data as it transfers the data. +* +* XQspiPs_Transfer(InstancePtr, RecvBuf, RecvBuf, ByteCount) +* The caller wishes to only receive and does not care about sending +* data. In this case, the caller must still provide a send buffer, but +* it can be the same as the receive buffer if the caller does not care +* what it sends. The device must send N bytes of data if it wishes to +* receive N bytes of data. +* </pre> +* Although this function takes entire buffers as arguments, the driver can only +* transfer a limited number of bytes at a time, limited by the size of the +* FIFO. A call to this function only starts the transfer, then subsequent +* transfers of the data is performed by the interrupt service routine until +* the entire buffer has been transferred. The status callback function is +* called when the entire buffer has been sent/received. +* +* This function is non-blocking. The SetSlaveSelect function must be called +* prior to this function. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param SendBufPtr is a pointer to a data buffer that needs to be +* transmitted. This buffer must not be NULL. +* @param RecvBufPtr is a pointer to a buffer for received data. +* This argument can be NULL if do not care about receiving. +* @param ByteCount contains the number of bytes to send/receive. +* The number of bytes received always equals the number of bytes +* sent. +* +* @return +* - XST_SUCCESS if the buffers are successfully handed off to the +* device for transfer. +* - XST_DEVICE_BUSY indicates that a data transfer is already in +* progress. This is determined by the driver. +* +* @note +* +* This function is not thread-safe. The higher layer software must ensure that +* no two threads are transferring data on the QSPI bus at the same time. +* +******************************************************************************/ +int XQspiPs_Transfer(XQspiPs *InstancePtr, u8 *SendBufPtr, u8 *RecvBufPtr, + unsigned ByteCount) +{ + u32 StatusReg; + u32 ConfigReg; + u8 Instruction; + u32 Data; + unsigned int Index; + u8 TransCount = 0; + XQspiPsInstFormat *CurrInst; + XQspiPsInstFormat NewInst[2]; + u8 SwitchFlag = 0; + + CurrInst = &NewInst[0]; + + /* + * The RecvBufPtr argument can be null + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(SendBufPtr != NULL); + Xil_AssertNonvoid(ByteCount > 0); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Check whether there is another transfer in progress. Not thread-safe. + */ + if (InstancePtr->IsBusy) { + return XST_DEVICE_BUSY; + } + + /* + * Set the busy flag, which will be cleared in the ISR when the + * transfer is entirely done. + */ + InstancePtr->IsBusy = TRUE; + + /* + * Set up buffer pointers. + */ + InstancePtr->SendBufferPtr = SendBufPtr; + InstancePtr->RecvBufferPtr = RecvBufPtr; + + InstancePtr->RequestedBytes = ByteCount; + InstancePtr->RemainingBytes = ByteCount; + + /* + * The first byte with every chip-select assertion is always + * expected to be an instruction for flash interface mode + */ + Instruction = *InstancePtr->SendBufferPtr; + + for (Index = 0 ; Index < ARRAY_SIZE(FlashInst); Index++) { + if (Instruction == FlashInst[Index].OpCode) { + break; + } + } + + /* + * Set the RX FIFO threshold + */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_RXWR_OFFSET, XQSPIPS_RXFIFO_THRESHOLD_OPT); + + /* + * If the slave select is "Forced" or under manual control, + * set the slave select now, before beginning the transfer. + */ + if (XQspiPs_IsManualChipSelect(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg &= ~XQSPIPS_CR_SSCTRL_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, + ConfigReg); + } + + /* + * Enable the device. + */ + XQspiPs_Enable(InstancePtr); + + /* + * Clear all the interrrupts. + */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPS_SR_OFFSET, + XQSPIPS_IXR_WR_TO_CLR_MASK); + + if (Index < ARRAY_SIZE(FlashInst)) { + CurrInst = &FlashInst[Index]; + /* + * Check for WRSR instruction which has different size for + * Spansion (3 bytes) and Micron (2 bytes) + */ + if( (CurrInst->OpCode == XQSPIPS_FLASH_OPCODE_WRSR) && + (ByteCount == 3) ) { + CurrInst->InstSize = 3; + CurrInst->TxOffset = XQSPIPS_TXD_11_OFFSET; + } + } + + /* + * If instruction not present in table + */ + if (Index == ARRAY_SIZE(FlashInst)) { + /* + * Assign current instruction, size and TXD register to be used + * The InstSize mentioned in case of instructions greater than + * 4 bytes is not the actual size, but is indicative of + * the TXD register used. + * The remaining bytes of the instruction will be transmitted + * through TXD0 below. + */ + switch(ByteCount%4) + { + case XQSPIPS_SIZE_ONE: + CurrInst->OpCode = Instruction; + CurrInst->InstSize = XQSPIPS_SIZE_ONE; + CurrInst->TxOffset = XQSPIPS_TXD_01_OFFSET; + if(ByteCount > 4) { + SwitchFlag = 1; + } + break; + case XQSPIPS_SIZE_TWO: + CurrInst->OpCode = Instruction; + CurrInst->InstSize = XQSPIPS_SIZE_TWO; + CurrInst->TxOffset = XQSPIPS_TXD_10_OFFSET; + if(ByteCount > 4) { + SwitchFlag = 1; + } + break; + case XQSPIPS_SIZE_THREE: + CurrInst->OpCode = Instruction; + CurrInst->InstSize = XQSPIPS_SIZE_THREE; + CurrInst->TxOffset = XQSPIPS_TXD_11_OFFSET; + if(ByteCount > 4) { + SwitchFlag = 1; + } + break; + default: + CurrInst->OpCode = Instruction; + CurrInst->InstSize = XQSPIPS_SIZE_FOUR; + CurrInst->TxOffset = XQSPIPS_TXD_00_OFFSET; + break; + } + } + + /* + * If the instruction size in not 4 bytes then the data received needs + * to be shifted + */ + if( CurrInst->InstSize != 4 ) { + InstancePtr->ShiftReadData = 1; + } else { + InstancePtr->ShiftReadData = 0; + } + + /* Get the complete command (flash inst + address/data) */ + Data = *((u32 *)InstancePtr->SendBufferPtr); + InstancePtr->SendBufferPtr += CurrInst->InstSize; + InstancePtr->RemainingBytes -= CurrInst->InstSize; + if (InstancePtr->RemainingBytes < 0) { + InstancePtr->RemainingBytes = 0; + } + + /* Write the command to the FIFO */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + CurrInst->TxOffset, Data); + TransCount++; + + /* + * If switching from TXD1/2/3 to TXD0, then start transfer and + * check for FIFO empty + */ + if(SwitchFlag == 1) { + SwitchFlag = 0; + /* + * If, in Manual Start mode, start the transfer. + */ + if (XQspiPs_IsManualStart(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg( + InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_MANSTRT_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + } + /* + * Wait for the transfer to finish by polling Tx fifo status. + */ + do { + StatusReg = XQspiPs_ReadReg( + InstancePtr->Config.BaseAddress, + XQSPIPS_SR_OFFSET); + } while ((StatusReg & XQSPIPS_IXR_TXOW_MASK) == 0); + + } + + /* + * Fill the Tx FIFO with as many bytes as it takes (or as many as + * we have to send). + */ + while ((InstancePtr->RemainingBytes > 0) && + (TransCount < XQSPIPS_FIFO_DEPTH)) { + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_TXD_00_OFFSET, + *((u32 *)InstancePtr->SendBufferPtr)); + InstancePtr->SendBufferPtr += 4; + InstancePtr->RemainingBytes -= 4; + if (InstancePtr->RemainingBytes < 0) { + InstancePtr->RemainingBytes = 0; + } + TransCount++; + } + + /* + * Enable QSPI interrupts (connecting to the interrupt controller and + * enabling interrupts should have been done by the caller). + */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_IER_OFFSET, XQSPIPS_IXR_RXNEMPTY_MASK | + XQSPIPS_IXR_TXOW_MASK | XQSPIPS_IXR_RXOVR_MASK | + XQSPIPS_IXR_TXUF_MASK); + + /* + * If, in Manual Start mode, Start the transfer. + */ + if (XQspiPs_IsManualStart(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_MANSTRT_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + } + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* Transfers specified data on the QSPI bus in polled mode. +* +* The caller has the option of providing two different buffers for send and +* receive, or one buffer for both send and receive, or no buffer for receive. +* The receive buffer must be at least as big as the send buffer to prevent +* unwanted memory writes. This implies that the byte count passed in as an +* argument must be the smaller of the two buffers if they differ in size. +* Here are some sample usages: +* <pre> +* XQspiPs_PolledTransfer(InstancePtr, SendBuf, RecvBuf, ByteCount) +* The caller wishes to send and receive, and provides two different +* buffers for send and receive. +* +* XQspiPs_PolledTransfer(InstancePtr, SendBuf, NULL, ByteCount) +* The caller wishes only to send and does not care about the received +* data. The driver ignores the received data in this case. +* +* XQspiPs_PolledTransfer(InstancePtr, SendBuf, SendBuf, ByteCount) +* The caller wishes to send and receive, but provides the same buffer +* for doing both. The driver sends the data and overwrites the send +* buffer with received data as it transfers the data. +* +* XQspiPs_PolledTransfer(InstancePtr, RecvBuf, RecvBuf, ByteCount) +* The caller wishes to only receive and does not care about sending +* data. In this case, the caller must still provide a send buffer, but +* it can be the same as the receive buffer if the caller does not care +* what it sends. The device must send N bytes of data if it wishes to +* receive N bytes of data. +* +* </pre> +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param SendBufPtr is a pointer to a data buffer that needs to be +* transmitted. This buffer must not be NULL. +* @param RecvBufPtr is a pointer to a buffer for received data. +* This argument can be NULL if do not care about receiving. +* @param ByteCount contains the number of bytes to send/receive. +* The number of bytes received always equals the number of bytes +* sent. +* @return +* - XST_SUCCESS if the buffers are successfully handed off to the +* device for transfer. +* - XST_DEVICE_BUSY indicates that a data transfer is already in +* progress. This is determined by the driver. +* +* @note +* +* This function is not thread-safe. The higher layer software must ensure that +* no two threads are transferring data on the QSPI bus at the same time. +* +******************************************************************************/ +int XQspiPs_PolledTransfer(XQspiPs *InstancePtr, u8 *SendBufPtr, + u8 *RecvBufPtr, unsigned ByteCount) +{ + u32 StatusReg; + u32 ConfigReg; + u8 Instruction; + u32 Data; + u8 TransCount; + unsigned int Index; + XQspiPsInstFormat *CurrInst; + XQspiPsInstFormat NewInst[2]; + u8 SwitchFlag = 0; + u8 IsManualStart = FALSE; + u32 RxCount = 0; + + CurrInst = &NewInst[0]; + /* + * The RecvBufPtr argument can be NULL. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(SendBufPtr != NULL); + Xil_AssertNonvoid(ByteCount > 0); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Check whether there is another transfer in progress. Not thread-safe. + */ + if (InstancePtr->IsBusy) { + return XST_DEVICE_BUSY; + } + + /* + * Set the busy flag, which will be cleared when the transfer is + * entirely done. + */ + InstancePtr->IsBusy = TRUE; + + /* + * Set up buffer pointers. + */ + InstancePtr->SendBufferPtr = SendBufPtr; + InstancePtr->RecvBufferPtr = RecvBufPtr; + + InstancePtr->RequestedBytes = ByteCount; + InstancePtr->RemainingBytes = ByteCount; + + /* + * The first byte with every chip-select assertion is always + * expected to be an instruction for flash interface mode + */ + Instruction = *InstancePtr->SendBufferPtr; + + for (Index = 0 ; Index < ARRAY_SIZE(FlashInst); Index++) { + if (Instruction == FlashInst[Index].OpCode) { + break; + } + } + + /* + * Set the RX FIFO threshold + */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_RXWR_OFFSET, XQSPIPS_RXFIFO_THRESHOLD_OPT); + + /* + * If the slave select is "Forced" or under manual control, + * set the slave select now, before beginning the transfer. + */ + if (XQspiPs_IsManualChipSelect(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg &= ~XQSPIPS_CR_SSCTRL_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, + ConfigReg); + } + + /* + * Enable the device. + */ + XQspiPs_Enable(InstancePtr); + + if (Index < ARRAY_SIZE(FlashInst)) { + + CurrInst = &FlashInst[Index]; + /* + * Check for WRSR instruction which has different size for + * Spansion (3 bytes) and Micron (2 bytes) + */ + if( (CurrInst->OpCode == XQSPIPS_FLASH_OPCODE_WRSR) && + (ByteCount == 3) ) { + CurrInst->InstSize = 3; + CurrInst->TxOffset = XQSPIPS_TXD_11_OFFSET; + } + } + + /* + * If instruction not present in table + */ + if (Index == ARRAY_SIZE(FlashInst)) { + /* + * Assign current instruction, size and TXD register to be used. + * The InstSize mentioned in case of instructions greater than 4 bytes + * is not the actual size, but is indicative of the TXD register used. + * The remaining bytes of the instruction will be transmitted + * through TXD0 below. + */ + switch(ByteCount%4) + { + case XQSPIPS_SIZE_ONE: + CurrInst->OpCode = Instruction; + CurrInst->InstSize = XQSPIPS_SIZE_ONE; + CurrInst->TxOffset = XQSPIPS_TXD_01_OFFSET; + if(ByteCount > 4) { + SwitchFlag = 1; + } + break; + case XQSPIPS_SIZE_TWO: + CurrInst->OpCode = Instruction; + CurrInst->InstSize = XQSPIPS_SIZE_TWO; + CurrInst->TxOffset = XQSPIPS_TXD_10_OFFSET; + if(ByteCount > 4) { + SwitchFlag = 1; + } + break; + case XQSPIPS_SIZE_THREE: + CurrInst->OpCode = Instruction; + CurrInst->InstSize = XQSPIPS_SIZE_THREE; + CurrInst->TxOffset = XQSPIPS_TXD_11_OFFSET; + if(ByteCount > 4) { + SwitchFlag = 1; + } + break; + default: + CurrInst->OpCode = Instruction; + CurrInst->InstSize = XQSPIPS_SIZE_FOUR; + CurrInst->TxOffset = XQSPIPS_TXD_00_OFFSET; + break; + } + } + + /* + * If the instruction size in not 4 bytes then the data received needs + * to be shifted + */ + if( CurrInst->InstSize != 4 ) { + InstancePtr->ShiftReadData = 1; + } else { + InstancePtr->ShiftReadData = 0; + } + TransCount = 0; + /* Get the complete command (flash inst + address/data) */ + Data = *((u32 *)InstancePtr->SendBufferPtr); + InstancePtr->SendBufferPtr += CurrInst->InstSize; + InstancePtr->RemainingBytes -= CurrInst->InstSize; + if (InstancePtr->RemainingBytes < 0) { + InstancePtr->RemainingBytes = 0; + } + + /* Write the command to the FIFO */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + CurrInst->TxOffset, Data); + ++TransCount; + + /* + * If switching from TXD1/2/3 to TXD0, then start transfer and + * check for FIFO empty + */ + if(SwitchFlag == 1) { + SwitchFlag = 0; + /* + * If, in Manual Start mode, start the transfer. + */ + if (XQspiPs_IsManualStart(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg( + InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_MANSTRT_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + } + /* + * Wait for the transfer to finish by polling Tx fifo status. + */ + do { + StatusReg = XQspiPs_ReadReg( + InstancePtr->Config.BaseAddress, + XQSPIPS_SR_OFFSET); + } while ((StatusReg & XQSPIPS_IXR_TXOW_MASK) == 0); + + } + + /* + * Check if manual start is selected and store it in a + * local varibale for reference. This is to avoid reading + * the config register everytime. + */ + IsManualStart = XQspiPs_IsManualStart(InstancePtr); + + /* + * Fill the DTR/FIFO with as many bytes as it will take (or as + * many as we have to send). + */ + while ((InstancePtr->RemainingBytes > 0) && + (TransCount < XQSPIPS_FIFO_DEPTH)) { + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_TXD_00_OFFSET, + *((u32 *)InstancePtr->SendBufferPtr)); + InstancePtr->SendBufferPtr += 4; + InstancePtr->RemainingBytes -= 4; + if (InstancePtr->RemainingBytes < 0) { + InstancePtr->RemainingBytes = 0; + } + ++TransCount; + } + + while((InstancePtr->RemainingBytes > 0) || + (InstancePtr->RequestedBytes > 0)) { + + /* + * Fill the TX FIFO with RX threshold no. of entries (or as + * many as we have to send, in case that's less). + */ + while ((InstancePtr->RemainingBytes > 0) && + (TransCount < XQSPIPS_RXFIFO_THRESHOLD_OPT)) { + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_TXD_00_OFFSET, + *((u32 *)InstancePtr->SendBufferPtr)); + InstancePtr->SendBufferPtr += 4; + InstancePtr->RemainingBytes -= 4; + if (InstancePtr->RemainingBytes < 0) { + InstancePtr->RemainingBytes = 0; + } + ++TransCount; + } + + /* + * If, in Manual Start mode, start the transfer. + */ + if (IsManualStart == TRUE) { + ConfigReg = XQspiPs_ReadReg( + InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_MANSTRT_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + } + + /* + * Reset TransCount - this is only used to fill TX FIFO + * in the above loop; + * RxCount is used to keep track of data received + */ + TransCount = 0; + + /* + * Wait for RX FIFO to reach threshold (or) + * TX FIFO to become empty. + * The latter check is required for + * small transfers (<32 words) and + * when the last chunk in a large data transfer is < 32 words. + */ + + do { + StatusReg = XQspiPs_ReadReg( + InstancePtr->Config.BaseAddress, + XQSPIPS_SR_OFFSET); + } while ( ((StatusReg & XQSPIPS_IXR_TXOW_MASK) == 0) && + ((StatusReg & XQSPIPS_IXR_RXNEMPTY_MASK) == 0) ); + + /* + * A transmit has just completed. Process received data + * and check for more data to transmit. + * First get the data received as a result of the + * transmit that just completed. Receive data based on the + * count obtained while filling tx fifo. Always get + * the received data, but only fill the receive + * buffer if it points to something (the upper layer + * software may not care to receive data). + */ + while ((InstancePtr->RequestedBytes > 0) && + (RxCount < XQSPIPS_RXFIFO_THRESHOLD_OPT )) { + u32 Data; + + RxCount++; + + if (InstancePtr->RecvBufferPtr != NULL) { + if (InstancePtr->RequestedBytes < 4) { + Data = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_RXD_OFFSET); + XQspiPs_GetReadData(InstancePtr, Data, + InstancePtr->RequestedBytes); + } else { + (*(u32 *)InstancePtr->RecvBufferPtr) = + XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_RXD_OFFSET); + InstancePtr->RecvBufferPtr += 4; + InstancePtr->RequestedBytes -= 4; + if (InstancePtr->RequestedBytes < 0) { + InstancePtr->RequestedBytes = 0; + } + } + } else { + Data = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_RXD_OFFSET); + InstancePtr->RequestedBytes -= 4; + } + } + RxCount = 0; + } + + /* + * If the Slave select lines are being manually controlled, disable + * them because the transfer is complete. + */ + if (XQspiPs_IsManualChipSelect(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_SSCTRL_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + } + + /* + * Clear the busy flag. + */ + InstancePtr->IsBusy = FALSE; + + /* + * Disable the device. + */ + XQspiPs_Disable(InstancePtr); + + /* + * Reset the RX FIFO threshold to one + */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_RXWR_OFFSET, XQSPIPS_RXWR_RESET_VALUE); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Read the flash in Linear QSPI mode. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RecvBufPtr is a pointer to a buffer for received data. +* @param Address is the starting address within the flash from +* from where data needs to be read. +* @param ByteCount contains the number of bytes to receive. +* +* @return +* - XST_SUCCESS if read is performed +* - XST_FAILURE if Linear mode is not set +* +* @note None. +* +* +******************************************************************************/ +int XQspiPs_LqspiRead(XQspiPs *InstancePtr, u8 *RecvBufPtr, + u32 Address, unsigned ByteCount) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(RecvBufPtr != NULL); + Xil_AssertNonvoid(ByteCount > 0); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + +#ifdef XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR + /* + * Enable the controller + */ + XQspiPs_Enable(InstancePtr); + + if (XQspiPs_GetLqspiConfigReg(InstancePtr) & + XQSPIPS_LQSPI_CR_LINEAR_MASK) { + memcpy((void*)RecvBufPtr, + (const void*)(XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR + + Address), + (size_t)ByteCount); + return XST_SUCCESS; + } else { + return XST_FAILURE; + } + + /* + * Disable the controller + */ + XQspiPs_Disable(InstancePtr); + +#else + return XST_FAILURE; +#endif + +} + +/*****************************************************************************/ +/** +* +* Selects the slave with which the master communicates. +* +* The user is not allowed to select the slave while a transfer is in progress. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return +* - XST_SUCCESS if the slave is selected or deselected +* successfully. +* - XST_DEVICE_BUSY if a transfer is in progress, slave cannot be +* changed. +* +* @note +* +* This function only sets the slave which will be selected when a transfer +* occurs. The slave is not selected when the QSPI is idle. +* +******************************************************************************/ +int XQspiPs_SetSlaveSelect(XQspiPs *InstancePtr) +{ + u32 ConfigReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Do not allow the slave select to change while a transfer is in + * progress. Not thread-safe. + */ + if (InstancePtr->IsBusy) { + return XST_DEVICE_BUSY; + } + + /* + * Select the slave + */ + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg &= ~XQSPIPS_CR_SSCTRL_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Sets the status callback function, the status handler, which the driver +* calls when it encounters conditions that should be reported to upper +* layer software. The handler executes in an interrupt context, so it must +* minimize the amount of processing performed. One of the following status +* events is passed to the status handler. +* +* <pre> +* +* XST_SPI_TRANSFER_DONE The requested data transfer is done +* +* XST_SPI_TRANSMIT_UNDERRUN As a slave device, the master clocked data +* but there were none available in the transmit +* register/FIFO. This typically means the slave +* application did not issue a transfer request +* fast enough, or the processor/driver could not +* fill the transmit register/FIFO fast enough. +* +* XST_SPI_RECEIVE_OVERRUN The QSPI device lost data. Data was received +* but the receive data register/FIFO was full. +* +* </pre> +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param CallBackRef is the upper layer callback reference passed back +* when the callback function is invoked. +* @param FuncPtr is the pointer to the callback function. +* +* @return None. +* +* @note +* +* The handler is called within interrupt context, so it should do its work +* quickly and queue potentially time-consuming work to a task-level thread. +* +******************************************************************************/ +void XQspiPs_SetStatusHandler(XQspiPs *InstancePtr, void *CallBackRef, + XQspiPs_StatusHandler FuncPtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FuncPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + InstancePtr->StatusHandler = FuncPtr; + InstancePtr->StatusRef = CallBackRef; +} + +/*****************************************************************************/ +/** +* +* This is a stub for the status callback. The stub is here in case the upper +* layers forget to set the handler. +* +* @param CallBackRef is a pointer to the upper layer callback reference +* @param StatusEvent is the event that just occurred. +* @param ByteCount is the number of bytes transferred up until the event +* occurred. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +static void StubStatusHandler(void *CallBackRef, u32 StatusEvent, + unsigned ByteCount) +{ + (void) CallBackRef; + (void) StatusEvent; + (void) ByteCount; + + Xil_AssertVoidAlways(); +} + +/*****************************************************************************/ +/** +* +* The interrupt handler for QSPI interrupts. This function must be connected +* by the user to an interrupt controller. +* +* The interrupts that are handled are: +* +* +* - Data Transmit Register (FIFO) Empty. This interrupt is generated when the +* transmit register or FIFO is empty. The driver uses this interrupt during a +* transmission to continually send/receive data until the transfer is done. +* +* - Data Transmit Register (FIFO) Underflow. This interrupt is generated when +* the QSPI device, when configured as a slave, attempts to read an empty +* DTR/FIFO. An empty DTR/FIFO usually means that software is not giving the +* device data in a timely manner. No action is taken by the driver other than +* to inform the upper layer software of the error. +* +* - Data Receive Register (FIFO) Overflow. This interrupt is generated when the +* QSPI device attempts to write a received byte to an already full DRR/FIFO. +* A full DRR/FIFO usually means software is not emptying the data in a timely +* manner. No action is taken by the driver other than to inform the upper +* layer software of the error. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return None. +* +* @note +* +* The slave select register is being set to deselect the slave when a transfer +* is complete. +* +******************************************************************************/ +void XQspiPs_InterruptHandler(void *InstancePtr) +{ + XQspiPs *QspiPtr = (XQspiPs *)InstancePtr; + u32 IntrStatus; + u32 ConfigReg; + u32 Data; + u32 TransCount; + u32 Count = 0; + unsigned BytesDone; /* Number of bytes done so far. */ + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(QspiPtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Immediately clear the interrupts in case the ISR causes another + * interrupt to be generated. If we clear at the end of the ISR, + * we may miss newly generated interrupts. This occurs because we + * transmit from within the ISR, which could potentially cause another + * TX_EMPTY interrupt. + */ + IntrStatus = XQspiPs_ReadReg(QspiPtr->Config.BaseAddress, + XQSPIPS_SR_OFFSET); + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, XQSPIPS_SR_OFFSET, + (IntrStatus & XQSPIPS_IXR_WR_TO_CLR_MASK)); + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, XQSPIPS_IDR_OFFSET, + XQSPIPS_IXR_TXOW_MASK | XQSPIPS_IXR_RXNEMPTY_MASK | + XQSPIPS_IXR_RXOVR_MASK | XQSPIPS_IXR_TXUF_MASK); + + if ((IntrStatus & XQSPIPS_IXR_TXOW_MASK) || + (IntrStatus & XQSPIPS_IXR_RXNEMPTY_MASK)) { + + /* + * Rx FIFO has just reached threshold no. of entries. + * Read threshold no. of entries from RX FIFO + * Another possiblity of entering this loop is when + * the last byte has been transmitted and TX FIFO is empty, + * in which case, read all the data from RX FIFO. + * Always get the received data, but only fill the + * receive buffer if it is not null (it can be null when + * the device does not care to receive data). + */ + TransCount = QspiPtr->RequestedBytes - QspiPtr->RemainingBytes; + if (TransCount % 4) { + TransCount = TransCount/4 + 1; + } else { + TransCount = TransCount/4; + } + + while ((Count < TransCount) && + (Count < XQSPIPS_RXFIFO_THRESHOLD_OPT)) { + + if (QspiPtr->RecvBufferPtr != NULL) { + if (QspiPtr->RequestedBytes < 4) { + Data = XQspiPs_ReadReg(QspiPtr->Config.BaseAddress, + XQSPIPS_RXD_OFFSET); + XQspiPs_GetReadData(QspiPtr, Data, + QspiPtr->RequestedBytes); + } else { + (*(u32 *)QspiPtr->RecvBufferPtr) = + XQspiPs_ReadReg(QspiPtr->Config.BaseAddress, + XQSPIPS_RXD_OFFSET); + QspiPtr->RecvBufferPtr += 4; + QspiPtr->RequestedBytes -= 4; + if (QspiPtr->RequestedBytes < 0) { + QspiPtr->RequestedBytes = 0; + } + } + } else { + XQspiPs_ReadReg(QspiPtr->Config.BaseAddress, + XQSPIPS_RXD_OFFSET); + QspiPtr->RequestedBytes -= 4; + if (QspiPtr->RequestedBytes < 0) { + QspiPtr->RequestedBytes = 0; + } + + } + Count++; + } + Count = 0; + /* + * Interrupt asserted as TX_OW got asserted + * See if there is more data to send. + * Fill TX FIFO with RX threshold no. of entries or + * remaining entries (in case that is less than threshold) + */ + while ((QspiPtr->RemainingBytes > 0) && + (Count < XQSPIPS_RXFIFO_THRESHOLD_OPT)) { + /* + * Send more data. + */ + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_TXD_00_OFFSET, + *((u32 *)QspiPtr->SendBufferPtr)); + QspiPtr->SendBufferPtr += 4; + QspiPtr->RemainingBytes -= 4; + if (QspiPtr->RemainingBytes < 0) { + QspiPtr->RemainingBytes = 0; + } + + Count++; + } + + if ((QspiPtr->RemainingBytes == 0) && + (QspiPtr->RequestedBytes == 0)) { + /* + * No more data to send. Disable the interrupt + * and inform the upper layer software that the + * transfer is done. The interrupt will be re-enabled + * when another transfer is initiated. + */ + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_IDR_OFFSET, + XQSPIPS_IXR_RXNEMPTY_MASK | + XQSPIPS_IXR_TXOW_MASK | + XQSPIPS_IXR_RXOVR_MASK | + XQSPIPS_IXR_TXUF_MASK); + + /* + * If the Slave select is being manually controlled, + * disable it because the transfer is complete. + */ + if (XQspiPs_IsManualChipSelect(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg( + QspiPtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_SSCTRL_MASK; + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, + ConfigReg); + } + + /* + * Clear the busy flag. + */ + QspiPtr->IsBusy = FALSE; + + /* + * Disable the device. + */ + XQspiPs_Disable(QspiPtr); + + /* + * Reset the RX FIFO threshold to one + */ + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_RXWR_OFFSET, XQSPIPS_RXWR_RESET_VALUE); + + QspiPtr->StatusHandler(QspiPtr->StatusRef, + XST_SPI_TRANSFER_DONE, + QspiPtr->RequestedBytes); + } else { + /* + * Enable the TXOW interrupt. + */ + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_IER_OFFSET, + XQSPIPS_IXR_RXNEMPTY_MASK | + XQSPIPS_IXR_TXOW_MASK | + XQSPIPS_IXR_RXOVR_MASK | + XQSPIPS_IXR_TXUF_MASK); + /* + * If, in Manual Start mode, start the transfer. + */ + if (XQspiPs_IsManualStart(QspiPtr)) { + ConfigReg = XQspiPs_ReadReg( + QspiPtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_MANSTRT_MASK; + XQspiPs_WriteReg( + QspiPtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + } + } + } + + /* + * Check for overflow and underflow errors. + */ + if (IntrStatus & XQSPIPS_IXR_RXOVR_MASK) { + BytesDone = QspiPtr->RequestedBytes - QspiPtr->RemainingBytes; + QspiPtr->IsBusy = FALSE; + + /* + * If the Slave select lines is being manually controlled, + * disable it because the transfer is complete. + */ + if (XQspiPs_IsManualChipSelect(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg( + QspiPtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_SSCTRL_MASK; + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + } + + /* + * Disable the device. + */ + XQspiPs_Disable(QspiPtr); + + /* + * Reset the RX FIFO threshold to one + */ + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_RXWR_OFFSET, XQSPIPS_RXWR_RESET_VALUE); + + QspiPtr->StatusHandler(QspiPtr->StatusRef, + XST_SPI_RECEIVE_OVERRUN, BytesDone); + } + + if (IntrStatus & XQSPIPS_IXR_TXUF_MASK) { + BytesDone = QspiPtr->RequestedBytes - QspiPtr->RemainingBytes; + + QspiPtr->IsBusy = FALSE; + /* + * If the Slave select lines is being manually controlled, + * disable it because the transfer is complete. + */ + if (XQspiPs_IsManualChipSelect(InstancePtr)) { + ConfigReg = XQspiPs_ReadReg( + QspiPtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + ConfigReg |= XQSPIPS_CR_SSCTRL_MASK; + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, ConfigReg); + } + + /* + * Disable the device. + */ + XQspiPs_Disable(QspiPtr); + + /* + * Reset the RX FIFO threshold to one + */ + XQspiPs_WriteReg(QspiPtr->Config.BaseAddress, + XQSPIPS_RXWR_OFFSET, XQSPIPS_RXWR_RESET_VALUE); + + QspiPtr->StatusHandler(QspiPtr->StatusRef, + XST_SPI_TRANSMIT_UNDERRUN, BytesDone); + } +} + + +/*****************************************************************************/ +/** +* +* Copies data from Data to the Receive buffer. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param Data is the data which needs to be copied to the Rx buffer. +* @param Size is the number of bytes to be copied to the Receive buffer. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +static void XQspiPs_GetReadData(XQspiPs *InstancePtr, u32 Data, u8 Size) +{ + u8 DataByte3; + + if (InstancePtr->RecvBufferPtr) { + switch (Size) { + case 1: + if (InstancePtr->ShiftReadData == 1) { + *((u8 *)InstancePtr->RecvBufferPtr) = + ((Data & 0xFF000000) >> 24); + } else { + *((u8 *)InstancePtr->RecvBufferPtr) = + (Data & 0xFF); + } + InstancePtr->RecvBufferPtr += 1; + break; + case 2: + if (InstancePtr->ShiftReadData == 1) { + *((u16 *)InstancePtr->RecvBufferPtr) = + ((Data & 0xFFFF0000) >> 16); + } else { + *((u16 *)InstancePtr->RecvBufferPtr) = + (Data & 0xFFFF); + } + InstancePtr->RecvBufferPtr += 2; + break; + case 3: + if (InstancePtr->ShiftReadData == 1) { + *((u16 *)InstancePtr->RecvBufferPtr) = + ((Data & 0x00FFFF00) >> 8); + InstancePtr->RecvBufferPtr += 2; + DataByte3 = ((Data & 0xFF000000) >> 24); + *((u8 *)InstancePtr->RecvBufferPtr) = DataByte3; + } else { + *((u16 *)InstancePtr->RecvBufferPtr) = + (Data & 0xFFFF); + InstancePtr->RecvBufferPtr += 2; + DataByte3 = ((Data & 0x00FF0000) >> 16); + *((u8 *)InstancePtr->RecvBufferPtr) = DataByte3; + } + InstancePtr->RecvBufferPtr += 1; + break; + default: + /* This will never execute */ + break; + } + } + InstancePtr->ShiftReadData = 0; + InstancePtr->RequestedBytes -= Size; + if (InstancePtr->RequestedBytes < 0) { + InstancePtr->RequestedBytes = 0; + } +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips.h new file mode 100755 index 000000000..3114f5b57 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips.h @@ -0,0 +1,790 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips.h +* +* This file contains the implementation of the XQspiPs driver. It supports only +* master mode. User documentation for the driver functions is contained in this +* file in the form of comment blocks at the front of each function. +* +* A QSPI device connects to an QSPI bus through a 4-wire serial interface. +* The QSPI bus is a full-duplex, synchronous bus that facilitates communication +* between one master and one slave. The device is always full-duplex, +* which means that for every byte sent, one is received, and vice-versa. +* The master controls the clock, so it can regulate when it wants to +* send or receive data. The slave is under control of the master, it must +* respond quickly since it has no control of the clock and must send/receive +* data as fast or as slow as the master does. +* +* <b> Linear Mode </b> +* The Linear Quad-SPI Controller extends the existing Quad-SPI Controller’s +* functionality by adding a linear addressing scheme that allows the SPI flash +* memory subsystem to behave like a typical ROM device. The new feature hides +* the normal SPI protocol from a master reading from the SPI flash memory. The +* feature improves both the user friendliness and the overall read memory +* throughput over that of the current Quad-SPI Controller by lessening the +* amount of software overheads required and by the use of the faster AXI +* interface. +* +* <b>Initialization & Configuration</b> +* +* The XQspiPs_Config structure is used by the driver to configure itself. This +* configuration structure is typically created by the tool-chain based on HW +* build properties. +* +* To support multiple runtime loading and initialization strategies employed by +* various operating systems, the driver instance can be initialized in the +* following way: +* - XQspiPs_LookupConfig(DeviceId) - Use the device identifier to find +* static configuration structure defined in xqspips_g.c. This is setup +* by the tools. For some operating systems the config structure will be +* initialized by the software and this call is not needed. +* - XQspiPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a +* configuration structure provided by the caller. If running in a system +* with address translation, the provided virtual memory base address +* replaces the physical address present in the configuration structure. +* +* <b>Multiple Masters</b> +* +* More than one master can exist, but arbitration is the responsibility of +* the higher layer software. The device driver does not perform any type of +* arbitration. +* +* <b>Modes of Operation</b> +* +* There are four modes to perform a data transfer and the selection of a mode +* is based on Chip Select(CS) and Start. These two options individually, can +* be controlled either by software(Manual) or hardware(Auto). +* - Auto CS: Chip select is automatically asserted as soon as the first word +* is written into the TXFIFO and de asserted when the TXFIFO becomes +* empty +* - Manual CS: Software must assert and de assert CS. +* - Auto Start: Data transmission starts as soon as there is data in the +* TXFIFO and stalls when the TXFIFO is empty +* - Manual Start: Software must start data transmission at the beginning of +* the transaction or whenever the TXFIFO has become empty +* +* The preferred combination is Manual CS and Auto Start. +* In this combination, the software asserts CS before loading any data into +* TXFIFO. In Auto Start mode, whenever data is in TXFIFO, controller sends it +* out until TXFIFO becomes empty. The software reads the RXFIFO whenever the +* data is available. If no further data, software disables CS. +* +* Risks/challenges of other combinations: +* - Manual CS and Manual Start: Manual Start bit should be set after each +* TXFIFO write otherwise there could be a race condition where the TXFIFO +* becomes empty before the new word is written. In that case the +* transmission stops. +* - Auto CS with Manual or Auto Start: It is very difficult for software to +* keep the TXFIFO filled. Whenever the TXFIFO runs empty, CS is de asserted. +* This results in a single transaction to be split into multiple pieces each +* with its own chip select. This will result in garbage data to be sent. +* +* <b>Interrupts</b> +* +* The user must connect the interrupt handler of the driver, +* XQspiPs_InterruptHandler, to an interrupt system such that it will be +* called when an interrupt occurs. This function does not save and restore +* the processor context such that the user must provide this processing. +* +* The driver handles the following interrupts: +* - Data Transmit Register/FIFO Underflow +* - Data Receive Register/FIFO Not Empty +* - Data Transmit Register/FIFO Overwater +* - Data Receive Register/FIFO Overrun +* +* The Data Transmit Register/FIFO Overwater interrupt -- indicates that the +* QSPI device has transmitted the data available to transmit, and now its data +* register and FIFO is ready to accept more data. The driver uses this +* interrupt to indicate progress while sending data. The driver may have +* more data to send, in which case the data transmit register and FIFO is +* filled for subsequent transmission. When this interrupt arrives and all +* the data has been sent, the driver invokes the status callback with a +* value of XST_SPI_TRANSFER_DONE to inform the upper layer software that +* all data has been sent. +* +* The Data Transmit Register/FIFO Underflow interrupt -- indicates that, +* as slave, the QSPI device was required to transmit but there was no data +* available to transmit in the transmit register (or FIFO). This may not +* be an error if the master is not expecting data. But in the case where +* the master is expecting data, this serves as a notification of such a +* condition. The driver reports this condition to the upper layer +* software through the status handler. +* +* The Data Receive Register/FIFO Overrun interrupt -- indicates that the QSPI +* device received data and subsequently dropped the data because the data +* receive register and FIFO was full. The driver reports this condition to the +* upper layer software through the status handler. This likely indicates a +* problem with the higher layer protocol, or a problem with the slave +* performance. +* +* +* <b>Polled Operation</b> +* +* Transfer in polled mode is supported through a separate interface function +* XQspiPs_PolledTransfer(). Unlike the transfer function in the interrupt mode, +* this function blocks until all data has been sent/received. +* +* <b>Device Busy</b> +* +* Some operations are disallowed when the device is busy. The driver tracks +* whether a device is busy. The device is considered busy when a data transfer +* request is outstanding, and is considered not busy only when that transfer +* completes (or is aborted with a mode fault error). +* +* <b>Device Configuration</b> +* +* The device can be configured in various ways during the FPGA implementation +* process. Configuration parameters are stored in the xqspips_g.c file or +* passed in via XQspiPs_CfgInitialize(). A table is defined where each entry +* contains configuration information for an QSPI device, including the base +* address for the device. +* +* <b>RTOS Independence</b> +* +* This driver is intended to be RTOS and processor independent. It works with +* physical addresses only. Any needs for dynamic memory management, threads or +* thread mutual exclusion, virtual memory, or cache control must be satisfied +* by the layer above this driver. +* +* NOTE: This driver was always tested with endianess set to little-endian. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 1.00a sdm 11/25/10 First release, based on the PS SPI driver. +* 1.01a sdm 11/22/11 Added TCL file for generating QSPI parameters +* in xparameters.h +* 2.00a kka 07/25/12 Added a few register defines for CR 670297 +* Removed code related to mode fault for CR 671468 +* The XQspiPs_SetSlaveSelect has been modified to remove +* the argument of the slave select as the QSPI controller +* only supports one slave. +* XQspiPs_GetSlaveSelect API has been removed +* Added a flag ShiftReadData to the instance structure +*. and is used in the XQspiPs_GetReadData API. +* The ShiftReadData Flag indicates whether the data +* read from the Rx FIFO needs to be shifted +* in cases where the data is less than 4 bytes +* Removed the selection for the following options: +* Master mode (XQSPIPS_MASTER_OPTION) and +* Flash interface mode (XQSPIPS_FLASH_MODE_OPTION) option +* as the QSPI driver supports the Master mode +* and Flash Interface mode and doesnot support +* Slave mode or the legacy mode. +* Modified the XQspiPs_PolledTransfer and XQspiPs_Transfer +* APIs so that the last argument (IsInst) specifying whether +* it is instruction or data has been removed. The first byte +* in the SendBufPtr argument of these APIs specify the +* instruction to be sent to the Flash Device. +* This version of the driver fixes CRs 670197/663787/ +* 670297/671468. +* Added the option for setting the Holdb_dr bit in the +* configuration options, XQSPIPS_HOLD_B_DRIVE_OPTION +* is the option to be used for setting this bit in the +* configuration register. +* The XQspiPs_PolledTransfer function has been updated +* to fill the data to fifo depth. +* 2.01a sg 02/03/13 Added flash opcodes for DUAL_IO_READ,QUAD_IO_READ. +* Added macros for Set/Get Rx Watermark. Changed QSPI +* Enable/Disable macro argument from BaseAddress to +* Instance Pointer. Added DelayNss argument to SetDelays +* and GetDelays API's. +* Created macros XQspiPs_IsManualStart and +* XQspiPs_IsManualChipSelect. +* Changed QSPI transfer logic for polled and interrupt +* modes to be based on filled tx fifo count and receive +* based on it. RXNEMPTY interrupt is not used. +* Added assertions to XQspiPs_LqspiRead function. +* SetDelays and GetDelays API's include DelayNss parameter. +* Added defines for DelayNss,Rx Watermark,Interrupts +* which need write to clear. Removed Read zeros mask from +* LQSPI Config register. Renamed Fixed burst error to +* data FSM error in LQSPI Status register. +* +* 2.02a hk 05/07/13 Added ConnectionMode to config structure. +* Corresponds to C_QSPI_MODE - 0:Single, 1:Stacked, 2:Parallel +* Added enable and disable to the XQspiPs_LqspiRead() function +* Removed XQspi_Reset() in Set_Options() function when +* LQSPI_MODE_OPTION is set. +* Added instructions for bank selection, die erase and +* flag status register to the flash instruction table +* Handling for instructions not in flash instruction +* table added. Checking for Tx FIFO empty when switching from +* TXD1/2/3 to TXD0 added. If WRSR instruction is sent with +* byte count 3 (spansion), instruction size and TXD register +* changed accordingly. CR# 712502 and 703869. +* Added prefix to constant definitions for ConnectionMode +* Added (#ifdef linear base address) in the Linear read function. +* Changed XPAR_XQSPIPS_0_LINEAR_BASEADDR to +* XPAR_PS7_QSPI_LINEAR_0_S_AXI_BASEADDR in +* XQspiPs_LqspiRead function. Fix for CR#718141. +* +* 2.03a hk 09/17/13 Modified polled and interrupt transfers to make use of +* thresholds. This is to improve performance. +* Added API's for QSPI reset and +* linear mode initialization for boot. +* Added RX and TX threshold reset to one in XQspiPs_Abort. +* Added RX threshold reset(1) after transfer in polled and +* interrupt transfers. Made changes to make sure threshold +* change is done only when no transfer is in progress. +* Updated linear init API for parallel and stacked modes. +* CR#737760. +* +* </pre> +* +******************************************************************************/ +#ifndef XQSPIPS_H /* prevent circular inclusions */ +#define XQSPIPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xqspips_hw.h" +#include <string.h> + +/************************** Constant Definitions *****************************/ + +/** @name Configuration options + * + * The following options are supported to enable/disable certain features of + * an QSPI device. Each of the options is a bit mask, so more than one may be + * specified. + * + * + * The <b>Active Low Clock option</b> configures the device's clock polarity. + * Setting this option means the clock is active low and the SCK signal idles + * high. By default, the clock is active high and SCK idles low. + * + * The <b>Clock Phase option</b> configures the QSPI device for one of two + * transfer formats. A clock phase of 0, the default, means data is valid on + * the first SCK edge (rising or falling) after the slave select (SS) signal + * has been asserted. A clock phase of 1 means data is valid on the second SCK + * edge (rising or falling) after SS has been asserted. + * + * + * The <b>QSPI Force Slave Select option</b> is used to enable manual control of + * the slave select signal. + * 0: The SPI_SS signal is controlled by the QSPI controller during + * transfers. (Default) + * 1: The SPI_SS signal is forced active (driven low) regardless of any + * transfers in progress. + * + * NOTE: The driver will handle setting and clearing the Slave Select when + * the user sets the "FORCE_SSELECT_OPTION". Using this option will allow the + * QSPI clock to be set to a faster speed. If the QSPI clock is too fast, the + * processor cannot empty and refill the FIFOs before the TX FIFO is empty + * When the QSPI hardware is controlling the Slave Select signals, this + * will cause slave to be de-selected and terminate the transfer. + * + * The <b>Manual Start option</b> is used to enable manual control of + * the Start command to perform data transfer. + * 0: The Start command is controlled by the QSPI controller during + * transfers(Default). Data transmission starts as soon as there is data in + * the TXFIFO and stalls when the TXFIFO is empty + * 1: The Start command must be issued by software to perform data transfer. + * Bit 15 of Configuration register is used to issue Start command. This bit + * must be set whenever TXFIFO is filled with new data. + * + * NOTE: The driver will set the Manual Start Enable bit in Configuration + * Register, if Manual Start option is selected. Software will issue + * Manual Start command whenever TXFIFO is filled with data. When there is + * no further data, driver will clear the Manual Start Enable bit. + * + * @{ + */ +#define XQSPIPS_CLK_ACTIVE_LOW_OPTION 0x2 /**< Active Low Clock option */ +#define XQSPIPS_CLK_PHASE_1_OPTION 0x4 /**< Clock Phase one option */ +#define XQSPIPS_FORCE_SSELECT_OPTION 0x10 /**< Force Slave Select */ +#define XQSPIPS_MANUAL_START_OPTION 0x20 /**< Manual Start enable */ +#define XQSPIPS_LQSPI_MODE_OPTION 0x80 /**< Linear QPSI mode */ +#define XQSPIPS_HOLD_B_DRIVE_OPTION 0x100 /**< Drive HOLD_B Pin */ +/*@}*/ + + +/** @name QSPI Clock Prescaler options + * The QSPI Clock Prescaler Configuration bits are used to program master mode + * bit rate. The bit rate can be programmed in divide-by-two decrements from + * pclk/2 to pclk/256. + * + * @{ + */ +#define XQSPIPS_CLK_PRESCALE_2 0x00 /**< PCLK/2 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_4 0x01 /**< PCLK/4 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_8 0x02 /**< PCLK/8 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_16 0x03 /**< PCLK/16 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_32 0x04 /**< PCLK/32 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_64 0x05 /**< PCLK/64 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_128 0x06 /**< PCLK/128 Prescaler */ +#define XQSPIPS_CLK_PRESCALE_256 0x07 /**< PCLK/256 Prescaler */ + +/*@}*/ + + +/** @name Callback events + * + * These constants specify the handler events that are passed to + * a handler from the driver. These constants are not bit masks such that + * only one will be passed at a time to the handler. + * + * @{ + */ +#define XQSPIPS_EVENT_TRANSFER_DONE 2 /**< Transfer done */ +#define XQSPIPS_EVENT_TRANSMIT_UNDERRUN 3 /**< TX FIFO empty */ +#define XQSPIPS_EVENT_RECEIVE_OVERRUN 4 /**< Receive data loss because + RX FIFO full */ +/*@}*/ + +/** @name Flash commands + * + * The following constants define most of the commands supported by flash + * devices. Users can add more commands supported by the flash devices + * + * @{ + */ +#define XQSPIPS_FLASH_OPCODE_WRSR 0x01 /* Write status register */ +#define XQSPIPS_FLASH_OPCODE_PP 0x02 /* Page program */ +#define XQSPIPS_FLASH_OPCODE_NORM_READ 0x03 /* Normal read data bytes */ +#define XQSPIPS_FLASH_OPCODE_WRDS 0x04 /* Write disable */ +#define XQSPIPS_FLASH_OPCODE_RDSR1 0x05 /* Read status register 1 */ +#define XQSPIPS_FLASH_OPCODE_WREN 0x06 /* Write enable */ +#define XQSPIPS_FLASH_OPCODE_FAST_READ 0x0B /* Fast read data bytes */ +#define XQSPIPS_FLASH_OPCODE_BE_4K 0x20 /* Erase 4KiB block */ +#define XQSPIPS_FLASH_OPCODE_RDSR2 0x35 /* Read status register 2 */ +#define XQSPIPS_FLASH_OPCODE_DUAL_READ 0x3B /* Dual read data bytes */ +#define XQSPIPS_FLASH_OPCODE_BE_32K 0x52 /* Erase 32KiB block */ +#define XQSPIPS_FLASH_OPCODE_QUAD_READ 0x6B /* Quad read data bytes */ +#define XQSPIPS_FLASH_OPCODE_ERASE_SUS 0x75 /* Erase suspend */ +#define XQSPIPS_FLASH_OPCODE_ERASE_RES 0x7A /* Erase resume */ +#define XQSPIPS_FLASH_OPCODE_RDID 0x9F /* Read JEDEC ID */ +#define XQSPIPS_FLASH_OPCODE_BE 0xC7 /* Erase whole flash block */ +#define XQSPIPS_FLASH_OPCODE_SE 0xD8 /* Sector erase (usually 64KB)*/ +#define XQSPIPS_FLASH_OPCODE_DUAL_IO_READ 0xBB /* Read data using Dual I/O */ +#define XQSPIPS_FLASH_OPCODE_QUAD_IO_READ 0xEB /* Read data using Quad I/O */ +#define XQSPIPS_FLASH_OPCODE_BRWR 0x17 /* Bank Register Write */ +#define XQSPIPS_FLASH_OPCODE_BRRD 0x16 /* Bank Register Read */ +/* Extende Address Register Write - Micron's equivalent of Bank Register */ +#define XQSPIPS_FLASH_OPCODE_EARWR 0xC5 +/* Extende Address Register Read - Micron's equivalent of Bank Register */ +#define XQSPIPS_FLASH_OPCODE_EARRD 0xC8 +#define XQSPIPS_FLASH_OPCODE_DIE_ERASE 0xC4 +#define XQSPIPS_FLASH_OPCODE_READ_FLAG_SR 0x70 +#define XQSPIPS_FLASH_OPCODE_CLEAR_FLAG_SR 0x50 +#define XQSPIPS_FLASH_OPCODE_READ_LOCK_REG 0xE8 /* Lock register Read */ +#define XQSPIPS_FLASH_OPCODE_WRITE_LOCK_REG 0xE5 /* Lock Register Write */ + +/*@}*/ + +/** @name Instruction size + * + * The following constants define numbers 1 to 4. + * Used to identify whether TXD0,1,2 or 3 is to be used. + * + * @{ + */ +#define XQSPIPS_SIZE_ONE 1 +#define XQSPIPS_SIZE_TWO 2 +#define XQSPIPS_SIZE_THREE 3 +#define XQSPIPS_SIZE_FOUR 4 + +/*@}*/ + +/** @name ConnectionMode + * + * The following constants are the possible values of ConnectionMode in + * Config structure. + * + * @{ + */ +#define XQSPIPS_CONNECTION_MODE_SINGLE 0 +#define XQSPIPS_CONNECTION_MODE_STACKED 1 +#define XQSPIPS_CONNECTION_MODE_PARALLEL 2 + +/*@}*/ + +/** @name FIFO threshold value + * + * This is the Rx FIFO threshold (in words) that was found to be most + * optimal in terms of performance + * + * @{ + */ +#define XQSPIPS_RXFIFO_THRESHOLD_OPT 32 + +/*@}*/ + +/**************************** Type Definitions *******************************/ +/** + * The handler data type allows the user to define a callback function to + * handle the asynchronous processing for the QSPI device. The application + * using this driver is expected to define a handler of this type to support + * interrupt driven mode. The handler executes in an interrupt context, so + * only minimal processing should be performed. + * + * @param CallBackRef is the callback reference passed in by the upper + * layer when setting the callback functions, and passed back to + * the upper layer when the callback is invoked. Its type is + * not important to the driver, so it is a void pointer. + * @param StatusEvent holds one or more status events that have occurred. + * See the XQspiPs_SetStatusHandler() for details on the status + * events that can be passed in the callback. + * @param ByteCount indicates how many bytes of data were successfully + * transferred. This may be less than the number of bytes + * requested if the status event indicates an error. + */ +typedef void (*XQspiPs_StatusHandler) (void *CallBackRef, u32 StatusEvent, + unsigned ByteCount); + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Base address of the device */ + u32 InputClockHz; /**< Input clock frequency */ + u8 ConnectionMode; /**< Single, Stacked and Parallel mode */ +} XQspiPs_Config; + +/** + * The XQspiPs driver instance data. The user is required to allocate a + * variable of this type for every QSPI device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XQspiPs_Config Config; /**< Configuration structure */ + u32 IsReady; /**< Device is initialized and ready */ + + u8 *SendBufferPtr; /**< Buffer to send (state) */ + u8 *RecvBufferPtr; /**< Buffer to receive (state) */ + int RequestedBytes; /**< Number of bytes to transfer (state) */ + int RemainingBytes; /**< Number of bytes left to transfer(state) */ + u32 IsBusy; /**< A transfer is in progress (state) */ + XQspiPs_StatusHandler StatusHandler; + void *StatusRef; /**< Callback reference for status handler */ + u32 ShiftReadData; /**< Flag to indicate whether the data + * read from the Rx FIFO needs to be shifted + * in cases where the data is less than 4 + * bytes + */ +} XQspiPs; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/* +* +* Check in OptionsTable if Manual Start Option is enabled or disabled. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return +* - TRUE if option is set +* - FALSE if option is not set +* +* @note C-Style signature: +* u8 XQspiPs_IsManualStart(XQspiPs *InstancePtr); +* +*****************************************************************************/ +#define XQspiPs_IsManualStart(InstancePtr) \ + ((XQspiPs_GetOptions(InstancePtr) & \ + XQSPIPS_MANUAL_START_OPTION) ? TRUE : FALSE) + +/****************************************************************************/ +/* +* +* Check in OptionsTable if Manual Chip Select Option is enabled or disabled. +* +* @param InstancePtr is a pointer to the XSpiPs instance. +* +* @return +* - TRUE if option is set +* - FALSE if option is not set +* +* @note C-Style signature: +* u8 XQspiPs_IsManualChipSelect(XQspiPs *InstancePtr); +* +*****************************************************************************/ +#define XQspiPs_IsManualChipSelect(InstancePtr) \ + ((XQspiPs_GetOptions(InstancePtr) & \ + XQSPIPS_FORCE_SSELECT_OPTION) ? TRUE : FALSE) + +/****************************************************************************/ +/** +* +* Set the contents of the slave idle count register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RegisterValue is the value to be written, valid values are +* 0-255. +* +* @return None +* +* @note +* C-Style signature: +* void XQspiPs_SetSlaveIdle(XQspiPs *InstancePtr, u32 RegisterValue) +* +*****************************************************************************/ +#define XQspiPs_SetSlaveIdle(InstancePtr, RegisterValue) \ + XQspiPs_Out32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_SICR_OFFSET, (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the contents of the slave idle count register. Use the XQSPIPS_SICR_* +* constants defined in xqspips_hw.h to interpret the bit-mask returned. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return An 8-bit value representing Slave Idle Count. +* +* @note C-Style signature: +* u32 XQspiPs_GetSlaveIdle(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_GetSlaveIdle(InstancePtr) \ + XQspiPs_In32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_SICR_OFFSET) + +/****************************************************************************/ +/** +* +* Set the contents of the transmit FIFO watermark register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RegisterValue is the value to be written, valid values are 1-63. +* +* @return None. +* +* @note +* C-Style signature: +* void XQspiPs_SetTXWatermark(XQspiPs *InstancePtr, u32 RegisterValue) +* +*****************************************************************************/ +#define XQspiPs_SetTXWatermark(InstancePtr, RegisterValue) \ + XQspiPs_Out32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_TXWR_OFFSET, (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the contents of the transmit FIFO watermark register. +* Valid values are in the range 1-63. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return A 6-bit value representing Tx Watermark level. +* +* @note C-Style signature: +* u32 XQspiPs_GetTXWatermark(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_GetTXWatermark(InstancePtr) \ + XQspiPs_In32((InstancePtr->Config.BaseAddress) + XQSPIPS_TXWR_OFFSET) + +/****************************************************************************/ +/** +* +* Set the contents of the receive FIFO watermark register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RegisterValue is the value to be written, valid values are 1-63. +* +* @return None. +* +* @note +* C-Style signature: +* void XQspiPs_SetRXWatermark(XQspiPs *InstancePtr, u32 RegisterValue) +* +*****************************************************************************/ +#define XQspiPs_SetRXWatermark(InstancePtr, RegisterValue) \ + XQspiPs_Out32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_RXWR_OFFSET, (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the contents of the receive FIFO watermark register. +* Valid values are in the range 1-63. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return A 6-bit value representing Rx Watermark level. +* +* @note C-Style signature: +* u32 XQspiPs_GetRXWatermark(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_GetRXWatermark(InstancePtr) \ + XQspiPs_In32((InstancePtr->Config.BaseAddress) + XQSPIPS_RXWR_OFFSET) + +/****************************************************************************/ +/** +* +* Enable the device and uninhibit master transactions. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XQspiPs_Enable(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_Enable(InstancePtr) \ + XQspiPs_Out32((InstancePtr->Config.BaseAddress) + XQSPIPS_ER_OFFSET, \ + XQSPIPS_ER_ENABLE_MASK) + +/****************************************************************************/ +/** +* +* Disable the device. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XQspiPs_Disable(XQspiPs *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_Disable(InstancePtr) \ + XQspiPs_Out32((InstancePtr->Config.BaseAddress) + XQSPIPS_ER_OFFSET, 0) + +/****************************************************************************/ +/** +* +* Set the contents of the Linear QSPI Configuration register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param RegisterValue is the value to be written to the Linear QSPI +* configuration register. +* +* @return None. +* +* @note +* C-Style signature: +* void XQspiPs_SetLqspiConfigReg(XQspiPs *InstancePtr, +* u32 RegisterValue) +* +*****************************************************************************/ +#define XQspiPs_SetLqspiConfigReg(InstancePtr, RegisterValue) \ + XQspiPs_Out32(((InstancePtr)->Config.BaseAddress) + \ + XQSPIPS_LQSPI_CR_OFFSET, (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the contents of the Linear QSPI Configuration register. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return A 32-bit value representing the contents of the LQSPI Config +* register. +* +* @note C-Style signature: +* u32 XQspiPs_GetLqspiConfigReg(u32 *InstancePtr) +* +*****************************************************************************/ +#define XQspiPs_GetLqspiConfigReg(InstancePtr) \ + XQspiPs_In32((InstancePtr->Config.BaseAddress) + \ + XQSPIPS_LQSPI_CR_OFFSET) + +/************************** Function Prototypes ******************************/ + +/* + * Initialization function, implemented in xqspips_sinit.c + */ +XQspiPs_Config *XQspiPs_LookupConfig(u16 DeviceId); + +/* + * Functions implemented in xqspips.c + */ +int XQspiPs_CfgInitialize(XQspiPs *InstancePtr, XQspiPs_Config * Config, + u32 EffectiveAddr); +void XQspiPs_Reset(XQspiPs *InstancePtr); +void XQspiPs_Abort(XQspiPs *InstancePtr); + +int XQspiPs_Transfer(XQspiPs *InstancePtr, u8 *SendBufPtr, u8 *RecvBufPtr, + unsigned ByteCount); +int XQspiPs_PolledTransfer(XQspiPs *InstancePtr, u8 *SendBufPtr, + u8 *RecvBufPtr, unsigned ByteCount); +int XQspiPs_LqspiRead(XQspiPs *InstancePtr, u8 *RecvBufPtr, + u32 Address, unsigned ByteCount); + +int XQspiPs_SetSlaveSelect(XQspiPs *InstancePtr); + +void XQspiPs_SetStatusHandler(XQspiPs *InstancePtr, void *CallBackRef, + XQspiPs_StatusHandler FuncPtr); +void XQspiPs_InterruptHandler(void *InstancePtr); + +/* + * Functions for selftest, in xqspips_selftest.c + */ +int XQspiPs_SelfTest(XQspiPs *InstancePtr); + +/* + * Functions for options, in xqspips_options.c + */ +int XQspiPs_SetOptions(XQspiPs *InstancePtr, u32 Options); +u32 XQspiPs_GetOptions(XQspiPs *InstancePtr); + +int XQspiPs_SetClkPrescaler(XQspiPs *InstancePtr, u8 Prescaler); +u8 XQspiPs_GetClkPrescaler(XQspiPs *InstancePtr); + +int XQspiPs_SetDelays(XQspiPs *InstancePtr, u8 DelayNss, u8 DelayBtwn, + u8 DelayAfter, u8 DelayInit); +void XQspiPs_GetDelays(XQspiPs *InstancePtr, u8 *DelayNss, u8 *DelayBtwn, + u8 *DelayAfter, u8 *DelayInit); +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_g.c new file mode 100644 index 000000000..cc1542136 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_g.c @@ -0,0 +1,32 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xqspips.h" + +/* +* The configuration table for devices +*/ + +XQspiPs_Config XQspiPs_ConfigTable[] = +{ + { + XPAR_PS7_QSPI_0_DEVICE_ID, + XPAR_PS7_QSPI_0_BASEADDR, + XPAR_PS7_QSPI_0_QSPI_CLK_FREQ_HZ, + XPAR_PS7_QSPI_0_QSPI_MODE + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_hw.c new file mode 100755 index 000000000..db8657053 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_hw.c @@ -0,0 +1,228 @@ +/****************************************************************************** +* +* (c) Copyright 2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_hw.c +* +* Contains low level functions, primarily reset related. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 2.03a hk 09/17/13 First release +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xqspips_hw.h" +#include "xqspips.h" + +/************************** Constant Definitions *****************************/ + +/** @name Pre-scaler value for divided by 4 + * + * Pre-scaler value for divided by 4 + * + * @{ + */ +#define XQSPIPS_CR_PRESC_DIV_BY_4 0x01 +/* @} */ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Resets QSPI by disabling the device and bringing it to reset state through +* register writes. +* +* @param None +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XQspiPs_ResetHw(u32 BaseAddress) +{ + u32 ConfigReg; + + /* + * Disable interrupts + */ + XQspiPs_WriteReg(BaseAddress, XQSPIPS_IDR_OFFSET, + XQSPIPS_IXR_DISABLE_ALL); + + /* + * Disable device + */ + XQspiPs_WriteReg(BaseAddress, XQSPIPS_ER_OFFSET, + 0); + + /* + * De-assert slave select lines. + */ + ConfigReg = XQspiPs_ReadReg(BaseAddress, XQSPIPS_CR_OFFSET); + ConfigReg |= (XQSPIPS_CR_SSCTRL_MASK | XQSPIPS_CR_SSFORCE_MASK); + XQspiPs_WriteReg(BaseAddress, XQSPIPS_CR_OFFSET, ConfigReg); + + /* + * Write default value to RX and TX threshold registers + * RX threshold should be set to 1 here because the corresponding + * status bit is used next to clear the RXFIFO + */ + XQspiPs_WriteReg(BaseAddress, XQSPIPS_TXWR_OFFSET, + (XQSPIPS_TXWR_RESET_VALUE & XQSPIPS_TXWR_MASK)); + XQspiPs_WriteReg(BaseAddress, XQSPIPS_RXWR_OFFSET, + (XQSPIPS_RXWR_RESET_VALUE & XQSPIPS_RXWR_MASK)); + + /* + * Clear RXFIFO + */ + while ((XQspiPs_ReadReg(BaseAddress,XQSPIPS_SR_OFFSET) & + XQSPIPS_IXR_RXNEMPTY_MASK) != 0) { + XQspiPs_ReadReg(BaseAddress, XQSPIPS_RXD_OFFSET); + } + + /* + * Clear status register by reading register and + * writing 1 to clear the write to clear bits + */ + XQspiPs_ReadReg(BaseAddress, XQSPIPS_SR_OFFSET); + XQspiPs_WriteReg(BaseAddress, XQSPIPS_SR_OFFSET, + XQSPIPS_IXR_WR_TO_CLR_MASK); + + /* + * Write default value to configuration register + */ + XQspiPs_WriteReg(BaseAddress, XQSPIPS_CR_OFFSET, + XQSPIPS_CR_RESET_STATE); + + + /* + * De-select linear mode + */ + XQspiPs_WriteReg(BaseAddress, XQSPIPS_LQSPI_CR_OFFSET, + 0x0); + +} + +/*****************************************************************************/ +/** +* +* Initializes QSPI to Linear mode with default QSPI boot settings. +* +* @param None +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XQspiPs_LinearInit(u32 BaseAddress) +{ + u32 BaudRateDiv; + u32 LinearCfg; + + /* + * Baud rate divisor for dividing by 4. Value of CR bits [5:3] + * should be set to 0x001; hence shift the value and use the mask. + */ + BaudRateDiv = ( (XQSPIPS_CR_PRESC_DIV_BY_4) << + XQSPIPS_CR_PRESC_SHIFT) & XQSPIPS_CR_PRESC_MASK; + /* + * Write configuration register with default values, slave selected & + * pre-scaler value for divide by 4 + */ + XQspiPs_WriteReg(BaseAddress, XQSPIPS_CR_OFFSET, + ((XQSPIPS_CR_RESET_STATE | + XQSPIPS_CR_HOLD_B_MASK | BaudRateDiv) & + (~XQSPIPS_CR_SSCTRL_MASK) )); + + /* + * Write linear configuration register with default value - + * enable linear mode and use fast read. + */ + + if(XPAR_PS7_QSPI_0_QSPI_MODE == XQSPIPS_CONNECTION_MODE_SINGLE){ + + LinearCfg = XQSPIPS_LQSPI_CR_RST_STATE; + + }else if(XPAR_PS7_QSPI_0_QSPI_MODE == + XQSPIPS_CONNECTION_MODE_STACKED){ + + LinearCfg = XQSPIPS_LQSPI_CR_RST_STATE | + XQSPIPS_LQSPI_CR_TWO_MEM_MASK; + + }else if(XPAR_PS7_QSPI_0_QSPI_MODE == + XQSPIPS_CONNECTION_MODE_PARALLEL){ + + LinearCfg = XQSPIPS_LQSPI_CR_RST_STATE | + XQSPIPS_LQSPI_CR_TWO_MEM_MASK | + XQSPIPS_LQSPI_CR_SEP_BUS_MASK; + + } + + XQspiPs_WriteReg(BaseAddress, XQSPIPS_LQSPI_CR_OFFSET, + LinearCfg); + + /* + * Enable device + */ + XQspiPs_WriteReg(BaseAddress, XQSPIPS_ER_OFFSET, + XQSPIPS_ER_ENABLE_MASK); + +} + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_hw.h new file mode 100755 index 000000000..8e77c75ab --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_hw.h @@ -0,0 +1,381 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_hw.h +* +* This header file contains the identifiers and basic HW access driver +* functions (or macros) that can be used to access the device. Other driver +* functions are defined in xqspips.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 1.00 sdm 11/25/10 First release +* 2.00a ka 07/25/12 Added a few register defines for CR 670297 +* and removed some defines of reserved fields for +* CR 671468 +* Added define XQSPIPS_CR_HOLD_B_MASK for Holdb_dr +* bit in Configuration register. +* 2.01a sg 02/03/13 Added defines for DelayNss,Rx Watermark,Interrupts +* which need write to clear. Removed Read zeros mask from +* LQSPI Config register. +* 2.03a hk 08/22/13 Added prototypes of API's for QSPI reset and +* linear mode initialization for boot. Added related +* constant definitions. +* +* </pre> +* +******************************************************************************/ +#ifndef XQSPIPS_HW_H /* prevent circular inclusions */ +#define XQSPIPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * + * Register offsets from the base address of an QSPI device. + * @{ + */ +#define XQSPIPS_CR_OFFSET 0x00 /**< Configuration Register */ +#define XQSPIPS_SR_OFFSET 0x04 /**< Interrupt Status */ +#define XQSPIPS_IER_OFFSET 0x08 /**< Interrupt Enable */ +#define XQSPIPS_IDR_OFFSET 0x0c /**< Interrupt Disable */ +#define XQSPIPS_IMR_OFFSET 0x10 /**< Interrupt Enabled Mask */ +#define XQSPIPS_ER_OFFSET 0x14 /**< Enable/Disable Register */ +#define XQSPIPS_DR_OFFSET 0x18 /**< Delay Register */ +#define XQSPIPS_TXD_00_OFFSET 0x1C /**< Transmit 4-byte inst/data */ +#define XQSPIPS_RXD_OFFSET 0x20 /**< Data Receive Register */ +#define XQSPIPS_SICR_OFFSET 0x24 /**< Slave Idle Count */ +#define XQSPIPS_TXWR_OFFSET 0x28 /**< Transmit FIFO Watermark */ +#define XQSPIPS_RXWR_OFFSET 0x2C /**< Receive FIFO Watermark */ +#define XQSPIPS_GPIO_OFFSET 0x30 /**< GPIO Register */ +#define XQSPIPS_LPBK_DLY_ADJ_OFFSET 0x38 /**< Loopback Delay Adjust Reg */ +#define XQSPIPS_TXD_01_OFFSET 0x80 /**< Transmit 1-byte inst */ +#define XQSPIPS_TXD_10_OFFSET 0x84 /**< Transmit 2-byte inst */ +#define XQSPIPS_TXD_11_OFFSET 0x88 /**< Transmit 3-byte inst */ +#define XQSPIPS_LQSPI_CR_OFFSET 0xA0 /**< Linear QSPI config register */ +#define XQSPIPS_LQSPI_SR_OFFSET 0xA4 /**< Linear QSPI status register */ +#define XQSPIPS_MOD_ID_OFFSET 0xFC /**< Module ID register */ + +/* @} */ + +/** @name Configuration Register + * + * This register contains various control bits that + * affect the operation of the QSPI device. Read/Write. + * @{ + */ + +#define XQSPIPS_CR_IFMODE_MASK 0x80000000 /**< Flash mem interface mode */ +#define XQSPIPS_CR_ENDIAN_MASK 0x04000000 /**< Tx/Rx FIFO endianness */ +#define XQSPIPS_CR_MANSTRT_MASK 0x00010000 /**< Manual Transmission Start */ +#define XQSPIPS_CR_MANSTRTEN_MASK 0x00008000 /**< Manual Transmission Start + Enable */ +#define XQSPIPS_CR_SSFORCE_MASK 0x00004000 /**< Force Slave Select */ +#define XQSPIPS_CR_SSCTRL_MASK 0x00000400 /**< Slave Select Decode */ +#define XQSPIPS_CR_SSCTRL_SHIFT 10 /**< Slave Select Decode shift */ +#define XQSPIPS_CR_DATA_SZ_MASK 0x000000C0 /**< Size of word to be + transferred */ +#define XQSPIPS_CR_PRESC_MASK 0x00000038 /**< Prescaler Setting */ +#define XQSPIPS_CR_PRESC_SHIFT 3 /**< Prescaler shift */ +#define XQSPIPS_CR_PRESC_MAXIMUM 0x07 /**< Prescaler maximum value */ + +#define XQSPIPS_CR_CPHA_MASK 0x00000004 /**< Phase Configuration */ +#define XQSPIPS_CR_CPOL_MASK 0x00000002 /**< Polarity Configuration */ + +#define XQSPIPS_CR_MSTREN_MASK 0x00000001 /**< Master Mode Enable */ + +#define XQSPIPS_CR_HOLD_B_MASK 0x00080000 /**< HOLD_B Pin Drive Enable */ + +/* Deselect the Slave select line and set the transfer size to 32 at reset */ +#define XQSPIPS_CR_RESET_STATE (XQSPIPS_CR_IFMODE_MASK | \ + XQSPIPS_CR_SSCTRL_MASK | \ + XQSPIPS_CR_DATA_SZ_MASK | \ + XQSPIPS_CR_MSTREN_MASK) +/* @} */ + + +/** @name QSPI Interrupt Registers + * + * <b>QSPI Status Register</b> + * + * This register holds the interrupt status flags for an QSPI device. Some + * of the flags are level triggered, which means that they are set as long + * as the interrupt condition exists. Other flags are edge triggered, + * which means they are set once the interrupt condition occurs and remain + * set until they are cleared by software. The interrupts are cleared by + * writing a '1' to the interrupt bit position in the Status Register. + * Read/Write. + * + * <b>QSPI Interrupt Enable Register</b> + * + * This register is used to enable chosen interrupts for an QSPI device. + * Writing a '1' to a bit in this register sets the corresponding bit in the + * QSPI Interrupt Mask register. Write only. + * + * <b>QSPI Interrupt Disable Register </b> + * + * This register is used to disable chosen interrupts for an QSPI device. + * Writing a '1' to a bit in this register clears the corresponding bit in the + * QSPI Interrupt Mask register. Write only. + * + * <b>QSPI Interrupt Mask Register</b> + * + * This register shows the enabled/disabled interrupts of an QSPI device. + * Read only. + * + * All four registers have the same bit definitions. They are only defined once + * for each of the Interrupt Enable Register, Interrupt Disable Register, + * Interrupt Mask Register, and Channel Interrupt Status Register + * @{ + */ + +#define XQSPIPS_IXR_TXUF_MASK 0x00000040 /**< QSPI Tx FIFO Underflow */ +#define XQSPIPS_IXR_RXFULL_MASK 0x00000020 /**< QSPI Rx FIFO Full */ +#define XQSPIPS_IXR_RXNEMPTY_MASK 0x00000010 /**< QSPI Rx FIFO Not Empty */ +#define XQSPIPS_IXR_TXFULL_MASK 0x00000008 /**< QSPI Tx FIFO Full */ +#define XQSPIPS_IXR_TXOW_MASK 0x00000004 /**< QSPI Tx FIFO Overwater */ +#define XQSPIPS_IXR_RXOVR_MASK 0x00000001 /**< QSPI Rx FIFO Overrun */ +#define XQSPIPS_IXR_DFLT_MASK 0x00000025 /**< QSPI default interrupts + mask */ +#define XQSPIPS_IXR_WR_TO_CLR_MASK 0x00000041 /**< Interrupts which + need write to clear */ +#define XQSPIPS_ISR_RESET_STATE 0x00000004 /**< Default to tx/rx empty */ +#define XQSPIPS_IXR_DISABLE_ALL 0x0000007D /**< Disable all interrupts */ +/* @} */ + + +/** @name Enable Register + * + * This register is used to enable or disable an QSPI device. + * Read/Write + * @{ + */ +#define XQSPIPS_ER_ENABLE_MASK 0x00000001 /**< QSPI Enable Bit Mask */ +/* @} */ + + +/** @name Delay Register + * + * This register is used to program timing delays in + * slave mode. Read/Write + * @{ + */ +#define XQSPIPS_DR_NSS_MASK 0xFF000000 /**< Delay to de-assert slave select + between two words mask */ +#define XQSPIPS_DR_NSS_SHIFT 24 /**< Delay to de-assert slave select + between two words shift */ +#define XQSPIPS_DR_BTWN_MASK 0x00FF0000 /**< Delay Between Transfers + mask */ +#define XQSPIPS_DR_BTWN_SHIFT 16 /**< Delay Between Transfers shift */ +#define XQSPIPS_DR_AFTER_MASK 0x0000FF00 /**< Delay After Transfers mask */ +#define XQSPIPS_DR_AFTER_SHIFT 8 /**< Delay After Transfers shift */ +#define XQSPIPS_DR_INIT_MASK 0x000000FF /**< Delay Initially mask */ +/* @} */ + +/** @name Slave Idle Count Registers + * + * This register defines the number of pclk cycles the slave waits for a the + * QSPI clock to become stable in quiescent state before it can detect the start + * of the next transfer in CPHA = 1 mode. + * Read/Write + * + * @{ + */ +#define XQSPIPS_SICR_MASK 0x000000FF /**< Slave Idle Count Mask */ +/* @} */ + + +/** @name Transmit FIFO Watermark Register + * + * This register defines the watermark setting for the Transmit FIFO. + * + * @{ + */ +#define XQSPIPS_TXWR_MASK 0x0000003F /**< Transmit Watermark Mask */ +#define XQSPIPS_TXWR_RESET_VALUE 0x00000001 /**< Transmit Watermark + * register reset value */ + +/* @} */ + +/** @name Receive FIFO Watermark Register + * + * This register defines the watermark setting for the Receive FIFO. + * + * @{ + */ +#define XQSPIPS_RXWR_MASK 0x0000003F /**< Receive Watermark Mask */ +#define XQSPIPS_RXWR_RESET_VALUE 0x00000001 /**< Receive Watermark + * register reset value */ + +/* @} */ + +/** @name FIFO Depth + * + * This macro provides the depth of transmit FIFO and receive FIFO. + * + * @{ + */ +#define XQSPIPS_FIFO_DEPTH 63 /**< FIFO depth (words) */ +/* @} */ + + +/** @name Linear QSPI Configuration Register + * + * This register contains various control bits that + * affect the operation of the Linear QSPI controller. Read/Write. + * + * @{ + */ +#define XQSPIPS_LQSPI_CR_LINEAR_MASK 0x80000000 /**< LQSPI mode enable */ +#define XQSPIPS_LQSPI_CR_TWO_MEM_MASK 0x40000000 /**< Both memories or one */ +#define XQSPIPS_LQSPI_CR_SEP_BUS_MASK 0x20000000 /**< Seperate memory bus */ +#define XQSPIPS_LQSPI_CR_U_PAGE_MASK 0x10000000 /**< Upper memory page */ +#define XQSPIPS_LQSPI_CR_MODE_EN_MASK 0x02000000 /**< Enable mode bits */ +#define XQSPIPS_LQSPI_CR_MODE_ON_MASK 0x01000000 /**< Mode on */ +#define XQSPIPS_LQSPI_CR_MODE_BITS_MASK 0x00FF0000 /**< Mode value for dual I/O + or quad I/O */ +#define XQSPIPS_LQSPI_CR_DUMMY_MASK 0x00000700 /**< Number of dummy bytes + between addr and return + read data */ +#define XQSPIPS_LQSPI_CR_INST_MASK 0x000000FF /**< Read instr code */ +#define XQSPIPS_LQSPI_CR_RST_STATE 0x8000016B /**< Default CR value */ +/* @} */ + +/** @name Linear QSPI Status Register + * + * This register contains various status bits of the Linear QSPI controller. + * Read/Write. + * + * @{ + */ +#define XQSPIPS_LQSPI_SR_D_FSM_ERR_MASK 0x00000004 /**< AXI Data FSM Error + received */ +#define XQSPIPS_LQSPI_SR_WR_RECVD_MASK 0x00000002 /**< AXI write command + received */ +/* @} */ + + +/** @name Loopback Delay Adjust Register + * + * This register contains various bit masks of Loopback Delay Adjust Register. + * + * @{ + */ + +#define XQSPIPS_LPBK_DLY_ADJ_USE_LPBK_MASK 0x00000020 /**< Loopback Bit */ + +/* @} */ + + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +#define XQspiPs_In32 Xil_In32 +#define XQspiPs_Out32 Xil_Out32 + +/****************************************************************************/ +/** +* Read a register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the 1st register of the +* device to the target register. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u32 XQspiPs_ReadReg(u32 BaseAddress. int RegOffset) +* +******************************************************************************/ +#define XQspiPs_ReadReg(BaseAddress, RegOffset) \ + XQspiPs_In32((BaseAddress) + (RegOffset)) + +/***************************************************************************/ +/** +* Write to a register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the 1st register of the +* device to target register. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XQspiPs_WriteReg(u32 BaseAddress, int RegOffset, +* u32 RegisterValue) +* +******************************************************************************/ +#define XQspiPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + XQspiPs_Out32((BaseAddress) + (RegOffset), (RegisterValue)) + +/************************** Function Prototypes ******************************/ + +/* + * Functions implemented in xqspips_hw.c + */ +void XQspiPs_ResetHw(u32 BaseAddress); +void XQspiPs_LinearInit(u32 BaseAddress); + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_options.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_options.c new file mode 100755 index 000000000..f3cbe8b48 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_options.c @@ -0,0 +1,434 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_options.c +* +* Contains functions for the configuration of the XQspiPs driver component. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 1.00 sdm 11/25/10 First release +* 2.00a kka 07/25/12 Removed the selection for the following options: +* Master mode (XQSPIPS_MASTER_OPTION) and +* Flash interface mode (XQSPIPS_FLASH_MODE_OPTION) option +* as the QSPI driver supports the Master mode +* and Flash Interface mode. The driver doesnot support +* Slave mode or the legacy mode. +* Added the option for setting the Holdb_dr bit in the +* configuration options, XQSPIPS_HOLD_B_DRIVE_OPTION +* is the option to be used for setting this bit in the +* configuration register. +* 2.01a sg 02/03/13 SetDelays and GetDelays API's include DelayNss parameter. +* +* 2.02a hk 26/03/13 Removed XQspi_Reset() in Set_Options() function when +* LQSPI_MODE_OPTION is set. Moved Enable() to XQpsiPs_LqspiRead(). +*</pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xqspips.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/* + * Create the table of options which are processed to get/set the device + * options. These options are table driven to allow easy maintenance and + * expansion of the options. + */ +typedef struct { + u32 Option; + u32 Mask; +} OptionsMap; + +static OptionsMap OptionsTable[] = { + {XQSPIPS_CLK_ACTIVE_LOW_OPTION, XQSPIPS_CR_CPOL_MASK}, + {XQSPIPS_CLK_PHASE_1_OPTION, XQSPIPS_CR_CPHA_MASK}, + {XQSPIPS_FORCE_SSELECT_OPTION, XQSPIPS_CR_SSFORCE_MASK}, + {XQSPIPS_MANUAL_START_OPTION, XQSPIPS_CR_MANSTRTEN_MASK}, + {XQSPIPS_HOLD_B_DRIVE_OPTION, XQSPIPS_CR_HOLD_B_MASK}, +}; + +#define XQSPIPS_NUM_OPTIONS (sizeof(OptionsTable) / sizeof(OptionsMap)) + +/*****************************************************************************/ +/** +* +* This function sets the options for the QSPI device driver. The options control +* how the device behaves relative to the QSPI bus. The device must be idle +* rather than busy transferring data before setting these device options. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param Options contains the specified options to be set. This is a bit +* mask where a 1 means to turn the option on, and a 0 means to +* turn the option off. One or more bit values may be contained in +* the mask. See the bit definitions named XQSPIPS_*_OPTIONS in +* the file xqspips.h. +* +* @return +* - XST_SUCCESS if options are successfully set. +* - XST_DEVICE_BUSY if the device is currently transferring data. +* The transfer must complete or be aborted before setting options. +* +* @note +* This function is not thread-safe. +* +******************************************************************************/ +int XQspiPs_SetOptions(XQspiPs *InstancePtr, u32 Options) +{ + u32 ConfigReg; + unsigned int Index; + u32 QspiOptions; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Do not allow to modify the Control Register while a transfer is in + * progress. Not thread-safe. + */ + if (InstancePtr->IsBusy) { + return XST_DEVICE_BUSY; + } + + QspiOptions = Options & XQSPIPS_LQSPI_MODE_OPTION; + Options &= ~XQSPIPS_LQSPI_MODE_OPTION; + + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + + /* + * Loop through the options table, turning the option on or off + * depending on whether the bit is set in the incoming options flag. + */ + for (Index = 0; Index < XQSPIPS_NUM_OPTIONS; Index++) { + if (Options & OptionsTable[Index].Option) { + /* Turn it on */ + ConfigReg |= OptionsTable[Index].Mask; + } else { + /* Turn it off */ + ConfigReg &= ~(OptionsTable[Index].Mask); + } + } + + /* + * Now write the control register. Leave it to the upper layers + * to restart the device. + */ + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, XQSPIPS_CR_OFFSET, + ConfigReg); + + /* + * Check for the LQSPI configuration options. + */ + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_LQSPI_CR_OFFSET); + + + if (QspiOptions & XQSPIPS_LQSPI_MODE_OPTION) { + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_LQSPI_CR_OFFSET, + XQSPIPS_LQSPI_CR_RST_STATE); + XQspiPs_SetSlaveSelect(InstancePtr); + } else { + ConfigReg &= ~XQSPIPS_LQSPI_CR_LINEAR_MASK; + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_LQSPI_CR_OFFSET, ConfigReg); + } + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function gets the options for the QSPI device. The options control how +* the device behaves relative to the QSPI bus. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return +* +* Options contains the specified options currently set. This is a bit value +* where a 1 means the option is on, and a 0 means the option is off. +* See the bit definitions named XQSPIPS_*_OPTIONS in file xqspips.h. +* +* @note None. +* +******************************************************************************/ +u32 XQspiPs_GetOptions(XQspiPs *InstancePtr) +{ + u32 OptionsFlag = 0; + u32 ConfigReg; + unsigned int Index; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Get the current options from QSPI configuration register. + */ + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + + /* + * Loop through the options table to grab options + */ + for (Index = 0; Index < XQSPIPS_NUM_OPTIONS; Index++) { + if (ConfigReg & OptionsTable[Index].Mask) { + OptionsFlag |= OptionsTable[Index].Option; + } + } + + /* + * Check for the LQSPI configuration options. + */ + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_LQSPI_CR_OFFSET); + + if ((ConfigReg & XQSPIPS_LQSPI_CR_LINEAR_MASK) != 0) { + OptionsFlag |= XQSPIPS_LQSPI_MODE_OPTION; + } + + return OptionsFlag; +} + +/*****************************************************************************/ +/** +* +* This function sets the clock prescaler for an QSPI device. The device +* must be idle rather than busy transferring data before setting these device +* options. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param Prescaler is the value that determine how much the clock should +* be divided by. Use the XQSPIPS_CLK_PRESCALE_* constants defined +* in xqspips.h for this setting. +* +* @return +* - XST_SUCCESS if options are successfully set. +* - XST_DEVICE_BUSY if the device is currently transferring data. +* The transfer must complete or be aborted before setting options. +* +* @note +* This function is not thread-safe. +* +******************************************************************************/ +int XQspiPs_SetClkPrescaler(XQspiPs *InstancePtr, u8 Prescaler) +{ + u32 ConfigReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Prescaler <= XQSPIPS_CR_PRESC_MAXIMUM); + + /* + * Do not allow the slave select to change while a transfer is in + * progress. Not thread-safe. + */ + if (InstancePtr->IsBusy) { + return XST_DEVICE_BUSY; + } + + /* + * Read the configuration register, mask out the interesting bits, and set + * them with the shifted value passed into the function. Write the + * results back to the configuration register. + */ + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + + ConfigReg &= ~XQSPIPS_CR_PRESC_MASK; + ConfigReg |= (u32) (Prescaler & XQSPIPS_CR_PRESC_MAXIMUM) << + XQSPIPS_CR_PRESC_SHIFT; + + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET, + ConfigReg); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function gets the clock prescaler of an QSPI device. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return The prescaler value. +* +* @note None. +* +* +******************************************************************************/ +u8 XQspiPs_GetClkPrescaler(XQspiPs *InstancePtr) +{ + u32 ConfigReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + ConfigReg = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + + ConfigReg &= XQSPIPS_CR_PRESC_MASK; + + return (u8)(ConfigReg >> XQSPIPS_CR_PRESC_SHIFT); +} + +/*****************************************************************************/ +/** +* +* This function sets the delay register for the QSPI device driver. +* The delay register controls the Delay Between Transfers, Delay After +* Transfers, and the Delay Initially. The default value is 0x0. The range of +* each delay value is 0-255. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param DelayNss is the delay to de-assert slave select between +* two word transfers. +* @param DelayBtwn is the delay between one Slave Select being +* de-activated and the activation of another slave. The delay is +* the number of master clock periods given by DelayBtwn + 2. +* @param DelayAfter define the delay between the last bit of the current +* byte transfer and the first bit of the next byte transfer. +* The delay in number of master clock periods is given as: +* CHPA=0:DelayInit+DelayAfter+3 +* CHPA=1:DelayAfter+1 +* @param DelayInit is the delay between asserting the slave select signal +* and the first bit transfer. The delay int number of master clock +* periods is DelayInit+1. +* +* @return +* - XST_SUCCESS if delays are successfully set. +* - XST_DEVICE_BUSY if the device is currently transferring data. +* The transfer must complete or be aborted before setting options. +* +* @note None. +* +******************************************************************************/ +int XQspiPs_SetDelays(XQspiPs *InstancePtr, u8 DelayNss, u8 DelayBtwn, + u8 DelayAfter, u8 DelayInit) +{ + u32 DelayRegister; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Do not allow the delays to change while a transfer is in + * progress. Not thread-safe. + */ + if (InstancePtr->IsBusy) { + return XST_DEVICE_BUSY; + } + + /* Shift, Mask and OR the values to build the register settings */ + DelayRegister = (u32) DelayNss << XQSPIPS_DR_NSS_SHIFT; + DelayRegister |= (u32) DelayBtwn << XQSPIPS_DR_BTWN_SHIFT; + DelayRegister |= (u32) DelayAfter << XQSPIPS_DR_AFTER_SHIFT; + DelayRegister |= (u32) DelayInit; + + XQspiPs_WriteReg(InstancePtr->Config.BaseAddress, + XQSPIPS_DR_OFFSET, DelayRegister); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function gets the delay settings for an QSPI device. +* The delay register controls the Delay Between Transfers, Delay After +* Transfers, and the Delay Initially. The default value is 0x0. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* @param DelayNss is a pointer to the Delay to de-assert slave select +* between two word transfers. +* @param DelayBtwn is a pointer to the Delay Between transfers value. +* This is a return parameter. +* @param DelayAfter is a pointer to the Delay After transfer value. +* This is a return parameter. +* @param DelayInit is a pointer to the Delay Initially value. This is +* a return parameter. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XQspiPs_GetDelays(XQspiPs *InstancePtr, u8 *DelayNss, u8 *DelayBtwn, + u8 *DelayAfter, u8 *DelayInit) +{ + u32 DelayRegister; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + DelayRegister = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_DR_OFFSET); + + *DelayInit = (u8)(DelayRegister & XQSPIPS_DR_INIT_MASK); + + *DelayAfter = (u8)((DelayRegister & XQSPIPS_DR_AFTER_MASK) >> + XQSPIPS_DR_AFTER_SHIFT); + + *DelayBtwn = (u8)((DelayRegister & XQSPIPS_DR_BTWN_MASK) >> + XQSPIPS_DR_BTWN_SHIFT); + + *DelayNss = (u8)((DelayRegister & XQSPIPS_DR_NSS_MASK) >> + XQSPIPS_DR_NSS_SHIFT); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_selftest.c new file mode 100755 index 000000000..9ad32eaa2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_selftest.c @@ -0,0 +1,159 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_selftest.c +* +* This file contains the implementation of selftest function for the QSPI +* device. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 1.00 sdm 11/25/10 First release +* 2.01a sg 02/03/13 Delay Register test is added with DelayNss parameter. +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xqspips.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/*****************************************************************************/ +/** +* +* Runs a self-test on the driver/device. The self-test is destructive in that +* a reset of the device is performed in order to check the reset values of +* the registers and to get the device into a known state. +* +* Upon successful return from the self-test, the device is reset. +* +* @param InstancePtr is a pointer to the XQspiPs instance. +* +* @return +* - XST_SUCCESS if successful +* - XST_REGISTER_ERROR indicates a register did not read or write +* correctly. +* +* @note None. +* +******************************************************************************/ +int XQspiPs_SelfTest(XQspiPs *InstancePtr) +{ + int Status; + u32 Register; + u8 DelayTestNss; + u8 DelayTestBtwn; + u8 DelayTestAfter; + u8 DelayTestInit; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Reset the QSPI device to leave it in a known good state + */ + XQspiPs_Reset(InstancePtr); + + /* + * All the QSPI registers should be in their default state right now. + */ + Register = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_CR_OFFSET); + if (Register != XQSPIPS_CR_RESET_STATE) { + return XST_REGISTER_ERROR; + } + + Register = XQspiPs_ReadReg(InstancePtr->Config.BaseAddress, + XQSPIPS_SR_OFFSET); + if (Register != XQSPIPS_ISR_RESET_STATE) { + return XST_REGISTER_ERROR; + } + + DelayTestNss = 0x5A; + DelayTestBtwn = 0xA5; + DelayTestAfter = 0xAA; + DelayTestInit = 0x55; + + /* + * Write and read the delay register, just to be sure there is some + * hardware out there. + */ + Status = XQspiPs_SetDelays(InstancePtr, DelayTestNss, DelayTestBtwn, + DelayTestAfter, DelayTestInit); + if (Status != XST_SUCCESS) { + return Status; + } + + XQspiPs_GetDelays(InstancePtr, &DelayTestNss, &DelayTestBtwn, + &DelayTestAfter, &DelayTestInit); + if ((0x5A != DelayTestNss) || (0xA5 != DelayTestBtwn) || + (0xAA != DelayTestAfter) || (0x55 != DelayTestInit)) { + return XST_REGISTER_ERROR; + } + + Status = XQspiPs_SetDelays(InstancePtr, 0, 0, 0, 0); + if (Status != XST_SUCCESS) { + return Status; + } + + /* + * Reset the QSPI device to leave it in a known good state + */ + XQspiPs_Reset(InstancePtr); + + return XST_SUCCESS; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_sinit.c new file mode 100755 index 000000000..27ba3750b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/qspips_v2_03_a/src/xqspips_sinit.c @@ -0,0 +1,106 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xqspips_sinit.c +* +* The implementation of the XQspiPs component's static initialization +* functionality. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- ----------------------------------------------- +* 1.00 sdm 11/25/10 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xqspips.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +extern XQspiPs_Config XQspiPs_ConfigTable[]; + +/*****************************************************************************/ +/** +* +* Looks up the device configuration based on the unique device ID. A table +* contains the configuration info for each device in the system. +* +* @param DeviceId contains the ID of the device to look up the +* configuration for. +* +* @return +* +* A pointer to the configuration found or NULL if the specified device ID was +* not found. See xqspips.h for the definition of XQspiPs_Config. +* +* @note None. +* +******************************************************************************/ +XQspiPs_Config *XQspiPs_LookupConfig(u16 DeviceId) +{ + XQspiPs_Config *CfgPtr = NULL; + int Index; + + for (Index = 0; Index < XPAR_XQSPIPS_NUM_INSTANCES; Index++) { + if (XQspiPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XQspiPs_ConfigTable[Index]; + break; + } + } + return CfgPtr; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/Makefile new file mode 100755 index 000000000..f32ad9b52 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner scugic_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling scugic" + +scugic_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: scugic_includes + +scugic_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic.c new file mode 100755 index 000000000..8847646a0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic.c @@ -0,0 +1,716 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic.c +* +* Contains required functions for the XScuGic driver for the Interrupt +* Controller. See xscugic.h for a detailed description of the driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- -------------------------------------------------------- +* 1.00a drg 01/19/10 First release +* 1.01a sdm 11/09/11 Changes are made in function XScuGic_CfgInitialize. Since +* "Config" entry is now made as pointer in the XScuGic +* structure, necessary changes are made. +* The HandlerTable can now be populated through the low +* level routine XScuGic_RegisterHandler added in this +* release. Hence necessary checks are added not to +* overwrite the HandlerTable entriesin function +* XScuGic_CfgInitialize. +* 1.03a srt 02/27/13 Added APIs +* - XScuGic_SetPriTrigTypeByDistAddr() +* - XScuGic_GetPriTrigTypeByDistAddr() +* Removed Offset calculation macros, defined in _hw.h +* (CR 702687) +* Added support to direct interrupts to the appropriate CPU. Earlier +* interrupts were directed to CPU1 (hard coded). Now depending +* upon the CPU selected by the user (xparameters.h), interrupts +* will be directed to the relevant CPU. This fixes CR 699688. +* +* 1.04a hk 05/04/13 Assigned EffectiveAddr to CpuBaseAddress in +* XScuGic_CfgInitialize. Fix for CR#704400 to remove warnings. +* Moved functions XScuGic_SetPriTrigTypeByDistAddr and +* XScuGic_GetPriTrigTypeByDistAddr to xscugic_hw.c. +* This is fix for CR#705621. +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ +#include "xparameters.h" +#include "xil_types.h" +#include "xil_assert.h" +#include "xscugic.h" + + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +static void StubHandler(void *CallBackRef); + +/*****************************************************************************/ +/** +* +* DistInit initializes the distributor of the GIC. The +* initialization entails: +* +* - Write the trigger mode, priority and target CPU +* - All interrupt sources are disabled +* - Enable the distributor +* +* @param InstancePtr is a pointer to the XScuGic instance. +* @param CpuID is the Cpu ID to be initialized. +* +* @return None +* +* @note None. +* +******************************************************************************/ +static void DistInit(XScuGic *InstancePtr, u32 CpuID) +{ + u32 Int_Id; + +#if USE_AMP==1 + #warning "Building GIC for AMP" + + /* + * The distrubutor should not be initialized by FreeRTOS in the case of + * AMP -- it is assumed that Linux is the master of this device in that + * case. + */ + return; +#endif + + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_DIST_EN_OFFSET, 0UL); + + /* + * Set the security domains in the int_security registers for + * non-secure interrupts + * All are secure, so leave at the default. Set to 1 for non-secure + * interrupts. + */ + + /* + * For the Shared Peripheral Interrupts INT_ID[MAX..32], set: + */ + + /* + * 1. The trigger mode in the int_config register + * Only write to the SPI interrupts, so start at 32 + */ + for (Int_Id = 32; Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS; Int_Id+=16) { + /* + * Each INT_ID uses two bits, or 16 INT_ID per register + * Set them all to be level sensitive, active HIGH. + */ + XScuGic_DistWriteReg(InstancePtr, + XSCUGIC_INT_CFG_OFFSET_CALC(Int_Id), + 0UL); + } + + +#define DEFAULT_PRIORITY 0xa0a0a0a0UL + for (Int_Id = 0; Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS; Int_Id+=4) { + /* + * 2. The priority using int the priority_level register + * The priority_level and spi_target registers use one byte per + * INT_ID. + * Write a default value that can be changed elsewhere. + */ + XScuGic_DistWriteReg(InstancePtr, + XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id), + DEFAULT_PRIORITY); + } + + for (Int_Id = 32; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id+=4) { + /* + * 3. The CPU interface in the spi_target register + * Only write to the SPI interrupts, so start at 32 + */ + CpuID |= CpuID << 8; + CpuID |= CpuID << 16; + + XScuGic_DistWriteReg(InstancePtr, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id), + CpuID); + } + + for (Int_Id = 0; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id+=32) { + /* + * 4. Enable the SPI using the enable_set register. Leave all + * disabled for now. + */ + XScuGic_DistWriteReg(InstancePtr, + XSCUGIC_ENABLE_DISABLE_OFFSET_CALC(XSCUGIC_DISABLE_OFFSET, Int_Id), + 0xFFFFFFFFUL); + + } + + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_DIST_EN_OFFSET, + XSCUGIC_EN_INT_MASK); + +} + +/*****************************************************************************/ +/** +* +* CPUInit initializes the CPU Interface of the GIC. The initialization entails: +* +* - Set the priority of the CPU +* - Enable the CPU interface +* +* @param InstancePtr is a pointer to the XScuGic instance. +* +* @return None +* +* @note None. +* +******************************************************************************/ +static void CPUInit(XScuGic *InstancePtr) +{ + /* + * Program the priority mask of the CPU using the Priority mask register + */ + XScuGic_CPUWriteReg(InstancePtr, XSCUGIC_CPU_PRIOR_OFFSET, 0xF0); + + + /* + * If the CPU operates in both security domains, set parameters in the + * control_s register. + * 1. Set FIQen=1 to use FIQ for secure interrupts, + * 2. Program the AckCtl bit + * 3. Program the SBPR bit to select the binary pointer behavior + * 4. Set EnableS = 1 to enable secure interrupts + * 5. Set EnbleNS = 1 to enable non secure interrupts + */ + + /* + * If the CPU operates only in the secure domain, setup the + * control_s register. + * 1. Set FIQen=1, + * 2. Set EnableS=1, to enable the CPU interface to signal secure interrupts. + * Only enable the IRQ output unless secure interrupts are needed. + */ + XScuGic_CPUWriteReg(InstancePtr, XSCUGIC_CONTROL_OFFSET, 0x07); + +} + +/*****************************************************************************/ +/** +* +* CfgInitialize a specific interrupt controller instance/driver. The +* initialization entails: +* +* - Initialize fields of the XScuGic structure +* - Initial vector table with stub function calls +* - All interrupt sources are disabled +* +* @param InstancePtr is a pointer to the XScuGic instance. +* @param ConfigPtr is a pointer to a config table for the particular +* device this driver is associated with. +* @param EffectiveAddr is the device base address in the virtual memory +* address space. The caller is responsible for keeping the address +* mapping from EffectiveAddr to the device physical base address +* unchanged once this function is invoked. Unexpected errors may +* occur if the address mapping changes after this function is +* called. If address translation is not used, use +* Config->BaseAddress for this parameters, passing the physical +* address instead. +* +* @return +* - XST_SUCCESS if initialization was successful +* +* @note None. +* +******************************************************************************/ +int XScuGic_CfgInitialize(XScuGic *InstancePtr, + XScuGic_Config *ConfigPtr, + u32 EffectiveAddr) +{ + u32 Int_Id; + u8 Cpu_Id = XPAR_CPU_ID + 1; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + /* + * Set some default values + */ + InstancePtr->Config->CpuBaseAddress = EffectiveAddr; + InstancePtr->IsReady = 0; + InstancePtr->Config = ConfigPtr; + + + for (Int_Id = 0; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id++) { + /* + * Initalize the handler to point to a stub to handle an + * interrupt which has not been connected to a handler. Only + * initialize it if the handler is 0 which means it was not + * initialized statically by the tools/user. Set the callback + * reference to this instance so that unhandled interrupts + * can be tracked. + */ + if ((InstancePtr->Config->HandlerTable[Int_Id].Handler == 0)) { + InstancePtr->Config->HandlerTable[Int_Id].Handler = + StubHandler; + } + InstancePtr->Config->HandlerTable[Int_Id].CallBackRef = + InstancePtr; + } + + DistInit(InstancePtr, Cpu_Id); + CPUInit(InstancePtr); + + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Makes the connection between the Int_Id of the interrupt source and the +* associated handler that is to run when the interrupt is recognized. The +* argument provided in this call as the Callbackref is used as the argument +* for the handler when it is called. +* +* @param InstancePtr is a pointer to the XScuGic instance. +* @param Int_Id contains the ID of the interrupt source and should be +* in the range of 0 to XSCUGIC_MAX_NUM_INTR_INPUTS - 1 +* @param Handler to the handler for that interrupt. +* @param CallBackRef is the callback reference, usually the instance +* pointer of the connecting driver. +* +* @return +* +* - XST_SUCCESS if the handler was connected correctly. +* +* @note +* +* WARNING: The handler provided as an argument will overwrite any handler +* that was previously connected. +* +****************************************************************************/ +int XScuGic_Connect(XScuGic *InstancePtr, u32 Int_Id, + Xil_InterruptHandler Handler, void *CallBackRef) +{ + /* + * Assert the arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertNonvoid(Handler != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * The Int_Id is used as an index into the table to select the proper + * handler + */ + InstancePtr->Config->HandlerTable[Int_Id].Handler = Handler; + InstancePtr->Config->HandlerTable[Int_Id].CallBackRef = CallBackRef; + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Updates the interrupt table with the Null Handler and NULL arguments at the +* location pointed at by the Int_Id. This effectively disconnects that interrupt +* source from any handler. The interrupt is disabled also. +* +* @param InstancePtr is a pointer to the XScuGic instance to be worked on. +* @param Int_Id contains the ID of the interrupt source and should +* be in the range of 0 to XSCUGIC_MAX_NUM_INTR_INPUTS - 1 +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XScuGic_Disconnect(XScuGic *InstancePtr, u32 Int_Id) +{ + u32 Mask; + + /* + * Assert the arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * The Int_Id is used to create the appropriate mask for the + * desired bit position. Int_Id currently limited to 0 - 31 + */ + Mask = 0x00000001 << (Int_Id % 32); + + /* + * Disable the interrupt such that it won't occur while disconnecting + * the handler, only disable the specified interrupt id without modifying + * the other interrupt ids + */ + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_DISABLE_OFFSET + + ((Int_Id / 32) * 4), Mask); + + /* + * Disconnect the handler and connect a stub, the callback reference + * must be set to this instance to allow unhandled interrupts to be + * tracked + */ + InstancePtr->Config->HandlerTable[Int_Id].Handler = StubHandler; + InstancePtr->Config->HandlerTable[Int_Id].CallBackRef = InstancePtr; +} + +/*****************************************************************************/ +/** +* +* Enables the interrupt source provided as the argument Int_Id. Any pending +* interrupt condition for the specified Int_Id will occur after this function is +* called. +* +* @param InstancePtr is a pointer to the XScuGic instance. +* @param Int_Id contains the ID of the interrupt source and should be +* in the range of 0 to XSCUGIC_MAX_NUM_INTR_INPUTS - 1 +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XScuGic_Enable(XScuGic *InstancePtr, u32 Int_Id) +{ + u32 Mask; + + /* + * Assert the arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * The Int_Id is used to create the appropriate mask for the + * desired bit position. Int_Id currently limited to 0 - 31 + */ + Mask = 0x00000001 << (Int_Id % 32); + + /* + * Enable the selected interrupt source by setting the + * corresponding bit in the Enable Set register. + */ + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_ENABLE_SET_OFFSET + + ((Int_Id / 32) * 4), Mask); +} + +/*****************************************************************************/ +/** +* +* Disables the interrupt source provided as the argument Int_Id such that the +* interrupt controller will not cause interrupts for the specified Int_Id. The +* interrupt controller will continue to hold an interrupt condition for the +* Int_Id, but will not cause an interrupt. +* +* @param InstancePtr is a pointer to the XScuGic instance. +* @param Int_Id contains the ID of the interrupt source and should be +* in the range of 0 to XSCUGIC_MAX_NUM_INTR_INPUTS - 1 +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XScuGic_Disable(XScuGic *InstancePtr, u32 Int_Id) +{ + u32 Mask; + + /* + * Assert the arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * The Int_Id is used to create the appropriate mask for the + * desired bit position. Int_Id currently limited to 0 - 31 + */ + Mask = 0x00000001 << (Int_Id % 32); + + /* + * Disable the selected interrupt source by setting the + * corresponding bit in the IDR. + */ + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_DISABLE_OFFSET + + ((Int_Id / 32) * 4), Mask); +} + +/*****************************************************************************/ +/** +* +* Allows software to simulate an interrupt in the interrupt controller. This +* function will only be successful when the interrupt controller has been +* started in simulation mode. A simulated interrupt allows the interrupt +* controller to be tested without any device to drive an interrupt input +* signal into it. +* +* @param InstancePtr is a pointer to the XScuGic instance. +* @param Int_Id is the software interrupt ID to simulate an interrupt. +* @param Cpu_Id is the list of CPUs to send the interrupt. +* +* @return +* +* XST_SUCCESS if successful, or XST_FAILURE if the interrupt could not be +* simulated +* +* @note None. +* +******************************************************************************/ +int XScuGic_SoftwareIntr(XScuGic *InstancePtr, u32 Int_Id, u32 Cpu_Id) +{ + u32 Mask; + + /* + * Assert the arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(Int_Id <= 15) ; + Xil_AssertNonvoid(Cpu_Id <= 255) ; + + + /* + * The Int_Id is used to create the appropriate mask for the + * desired interrupt. Int_Id currently limited to 0 - 15 + * Use the target list for the Cpu ID. + */ + Mask = ((Cpu_Id << 16) | Int_Id) & + (XSCUGIC_SFI_TRIG_CPU_MASK | XSCUGIC_SFI_TRIG_INTID_MASK); + + /* + * Write to the Software interrupt trigger register. Use the appropriate + * CPU Int_Id. + */ + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_SFI_TRIG_OFFSET, Mask); + + /* Indicate the interrupt was successfully simulated */ + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* A stub for the asynchronous callback. The stub is here in case the upper +* layers forget to set the handler. +* +* @param CallBackRef is a pointer to the upper layer callback reference +* +* @return None. +* +* @note None. +* +******************************************************************************/ +static void StubHandler(void *CallBackRef) { + /* + * verify that the inputs are valid + */ + Xil_AssertVoid(CallBackRef != NULL); + + /* + * Indicate another unhandled interrupt for stats + */ + ((XScuGic *)CallBackRef)->UnhandledInterrupts++; +} + +/****************************************************************************/ +/** +* Sets the interrupt priority and trigger type for the specificd IRQ source. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Int_Id is the IRQ source number to modify +* @param Priority is the new priority for the IRQ source. 0 is highest +* priority, 0xF8 (248) is lowest. There are 32 priority levels +* supported with a step of 8. Hence the supported priorities are +* 0, 8, 16, 32, 40 ..., 248. +* @param Trigger is the new trigger type for the IRQ source. +* Each bit pair describes the configuration for an INT_ID. +* SFI Read Only b10 always +* PPI Read Only depending on how the PPIs are configured. +* b01 Active HIGH level sensitive +* b11 Rising edge sensitive +* SPI LSB is read only. +* b01 Active HIGH level sensitive +* b11 Rising edge sensitive/ +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, + u8 Priority, u8 Trigger) +{ + u32 RegValue; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(Trigger <= XSCUGIC_INT_CFG_MASK); + Xil_AssertVoid(Priority <= XSCUGIC_MAX_INTR_PRIO_VAL); + + /* + * Determine the register to write to using the Int_Id. + */ + RegValue = XScuGic_DistReadReg(InstancePtr, + XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id)); + + /* + * The priority bits are Bits 7 to 3 in GIC Priority Register. This + * means the number of priority levels supported are 32 and they are + * in steps of 8. The priorities can be 0, 8, 16, 32, 48, ... etc. + * The lower order 3 bits are masked before putting it in the register. + */ + Priority = Priority & XSCUGIC_INTR_PRIO_MASK; + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue &= ~(XSCUGIC_PRIORITY_MASK << ((Int_Id%4)*8)); + RegValue |= Priority << ((Int_Id%4)*8); + + /* + * Write the value back to the register. + */ + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id), + RegValue); + + /* + * Determine the register to write to using the Int_Id. + */ + RegValue = XScuGic_DistReadReg(InstancePtr, + XSCUGIC_INT_CFG_OFFSET_CALC (Int_Id)); + + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue &= ~(XSCUGIC_INT_CFG_MASK << ((Int_Id%16)*2)); + RegValue |= Trigger << ((Int_Id%16)*2); + + /* + * Write the value back to the register. + */ + XScuGic_DistWriteReg(InstancePtr, XSCUGIC_INT_CFG_OFFSET_CALC(Int_Id), + RegValue); + +} + +/****************************************************************************/ +/** +* Gets the interrupt priority and trigger type for the specificd IRQ source. +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param Int_Id is the IRQ source number to modify +* @param Priority is a pointer to the value of the priority of the IRQ +* source. This is a return value. +* @param Trigger is pointer to the value of the trigger of the IRQ +* source. This is a return value. +* +* @return None. +* +* @note None +* +*****************************************************************************/ +void XScuGic_GetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, + u8 *Priority, u8 *Trigger) +{ + u32 RegValue; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(Priority != NULL); + Xil_AssertVoid(Trigger != NULL); + + /* + * Determine the register to read to using the Int_Id. + */ + RegValue = XScuGic_DistReadReg(InstancePtr, + XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id)); + + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue = RegValue >> ((Int_Id%4)*8); + *Priority = RegValue & XSCUGIC_PRIORITY_MASK; + + /* + * Determine the register to read to using the Int_Id. + */ + RegValue = XScuGic_DistReadReg(InstancePtr, + XSCUGIC_INT_CFG_OFFSET_CALC (Int_Id)); + + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue = RegValue >> ((Int_Id%16)*2); + + *Trigger = RegValue & XSCUGIC_INT_CFG_MASK; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic.h new file mode 100755 index 000000000..d119872e9 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic.h @@ -0,0 +1,318 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic.h +* +* The generic interrupt controller driver component. +* +* The interrupt controller driver uses the idea of priority for the various +* handlers. Priority is an integer within the range of 1 and 31 inclusive with +* default of 1 being the highest priority interrupt source. The priorities +* of the various sources can be dynamically altered as needed through +* hardware configuration. +* +* The generic interrupt controller supports the following +* features: +* +* - specific individual interrupt enabling/disabling +* - specific individual interrupt acknowledging +* - attaching specific callback function to handle interrupt source +* - assigning desired priority to interrupt source if default is not +* acceptable. +* +* Details about connecting the interrupt handler of the driver are contained +* in the source file specific to interrupt processing, xscugic_intr.c. +* +* This driver is intended to be RTOS and processor independent. It works with +* physical addresses only. Any needs for dynamic memory management, threads +* or thread mutual exclusion, virtual memory, or cache control must be +* satisfied by the layer above this driver. +* +* <b>Interrupt Vector Tables</b> +* +* The device ID of the interrupt controller device is used by the driver as a +* direct index into the configuration data table. The user should populate the +* vector table with handlers and callbacks at run-time using the +* XScuGic_Connect() and XScuGic_Disconnect() functions. +* +* Each vector table entry corresponds to a device that can generate an +* interrupt. Each entry contains an interrupt handler function and an +* argument to be passed to the handler when an interrupt occurs. The +* user must use XScuGic_Connect() when the interrupt handler takes an +* argument other than the base address. +* +* <b>Nested Interrupts Processing</b> +* +* Nested interrupts are not supported by this driver. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------------- +* 1.00a drg 01/19/00 First release +* 1.01a sdm 11/09/11 The XScuGic and XScuGic_Config structures have changed. +* The HandlerTable (of type XScuGic_VectorTableEntry) is +* moved to XScuGic_Config structure from XScuGic structure. +* +* The "Config" entry in XScuGic structure is made as +* pointer for better efficiency. +* +* A new file named as xscugic_hw.c is now added. It is +* to implement low level driver routines without using +* any xscugic instance pointer. They are useful when the +* user wants to use xscugic through device id or +* base address. The driver routines provided are explained +* below. +* XScuGic_DeviceInitialize that takes device id as +* argument and initializes the device (without calling +* XScuGic_CfgInitialize). +* XScuGic_DeviceInterruptHandler that takes device id +* as argument and calls appropriate handlers from the +* HandlerTable. +* XScuGic_RegisterHandler that registers a new handler +* by taking xscugic hardware base address as argument. +* LookupConfigByBaseAddress is used to return the +* corresponding config structure from XScuGic_ConfigTable +* based on the scugic base address passed. +* 1.02a sdm 12/20/11 Removed AckBeforeService from the XScuGic_Config +* structure. +* 1.03a srt 02/27/13 Moved Offset calculation macros from *.c and *_hw.c to +* *_hw.h +* Added APIs +* - XScuGic_SetPriTrigTypeByDistAddr() +* - XScuGic_GetPriTrigTypeByDistAddr() +* (CR 702687) +* Added support to direct interrupts to the appropriate CPU. Earlier +* interrupts were directed to CPU1 (hard coded). Now depending +* upon the CPU selected by the user (xparameters.h), interrupts +* will be directed to the relevant CPU. This fixes CR 699688. +* 1.04a hk 05/04/13 Assigned EffectiveAddr to CpuBaseAddress in +* XScuGic_CfgInitialize. Fix for CR#704400 to remove warnings. +* Moved functions XScuGic_SetPriTrigTypeByDistAddr and +* XScuGic_GetPriTrigTypeByDistAddr to xscugic_hw.c. +* This is fix for CR#705621. +* 1.05a hk 06/26/13 Modified tcl to export external interrupts correctly to +* xparameters.h. Fix for CR's 690505, 708928 & 719359. +* +* </pre> +* +******************************************************************************/ + +#ifndef XSCUGIC_H /* prevent circular inclusions */ +#define XSCUGIC_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xil_io.h" +#include "xscugic_hw.h" +#include "xil_exception.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/* The following data type defines each entry in an interrupt vector table. + * The callback reference is the base address of the interrupting device + * for the low level driver and an instance pointer for the high level driver. + */ +typedef struct +{ + Xil_InterruptHandler Handler; + void *CallBackRef; +} XScuGic_VectorTableEntry; + +/** + * This typedef contains configuration information for the device. + */ +typedef struct +{ + u16 DeviceId; /**< Unique ID of device */ + u32 CpuBaseAddress; /**< CPU Interface Register base address */ + u32 DistBaseAddress; /**< Distributor Register base address */ + XScuGic_VectorTableEntry HandlerTable[XSCUGIC_MAX_NUM_INTR_INPUTS];/**< + Vector table of interrupt handlers */ +} XScuGic_Config; + +/** + * The XScuGic driver instance data. The user is required to allocate a + * variable of this type for every intc device in the system. A pointer + * to a variable of this type is then passed to the driver API functions. + */ +typedef struct +{ + XScuGic_Config *Config; /**< Configuration table entry */ + u32 IsReady; /**< Device is initialized and ready */ + u32 UnhandledInterrupts; /**< Intc Statistics */ +} XScuGic; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Write the given CPU Interface register +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note +* C-style signature: +* void XScuGic_CPUWriteReg(XScuGic *InstancePtr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuGic_CPUWriteReg(InstancePtr, RegOffset, Data) \ +(XScuGic_WriteReg(((InstancePtr)->Config->CpuBaseAddress), (RegOffset), \ + ((u32)Data))) + +/****************************************************************************/ +/** +* +* Read the given CPU Interface register +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note +* C-style signature: +* u32 XScuGic_CPUReadReg(XScuGic *InstancePtr, u32 RegOffset) +* +*****************************************************************************/ +#define XScuGic_CPUReadReg(InstancePtr, RegOffset) \ + (XScuGic_ReadReg(((InstancePtr)->Config->CpuBaseAddress), (RegOffset))) + +/****************************************************************************/ +/** +* +* Write the given Distributor Interface register +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note +* C-style signature: +* void XScuGic_DistWriteReg(XScuGic *InstancePtr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuGic_DistWriteReg(InstancePtr, RegOffset, Data) \ +(XScuGic_WriteReg(((InstancePtr)->Config->DistBaseAddress), (RegOffset), \ + ((u32)Data))) + +/****************************************************************************/ +/** +* +* Read the given Distributor Interface register +* +* @param InstancePtr is a pointer to the instance to be worked on. +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note +* C-style signature: +* u32 XScuGic_DistReadReg(XScuGic *InstancePtr, u32 RegOffset) +* +*****************************************************************************/ +#define XScuGic_DistReadReg(InstancePtr, RegOffset) \ +(XScuGic_ReadReg(((InstancePtr)->Config->DistBaseAddress), (RegOffset))) + +/************************** Function Prototypes ******************************/ + +/* + * Required functions in xscugic.c + */ + +int XScuGic_Connect(XScuGic *InstancePtr, u32 Int_Id, + Xil_InterruptHandler Handler, void *CallBackRef); +void XScuGic_Disconnect(XScuGic *InstancePtr, u32 Int_Id); + +void XScuGic_Enable(XScuGic *InstancePtr, u32 Int_Id); +void XScuGic_Disable(XScuGic *InstancePtr, u32 Int_Id); + +int XScuGic_CfgInitialize(XScuGic *InstancePtr, XScuGic_Config *ConfigPtr, + u32 EffectiveAddr); + +int XScuGic_SoftwareIntr(XScuGic *InstancePtr, u32 Int_Id, u32 Cpu_Id); + +void XScuGic_GetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, + u8 *Priority, u8 *Trigger); +void XScuGic_SetPriorityTriggerType(XScuGic *InstancePtr, u32 Int_Id, + u8 Priority, u8 Trigger); + +/* + * Initialization functions in xscugic_sinit.c + */ +XScuGic_Config *XScuGic_LookupConfig(u16 DeviceId); + +/* + * Interrupt functions in xscugic_intr.c + */ +void XScuGic_InterruptHandler(XScuGic *InstancePtr); + +/* + * Self-test functions in xscugic_selftest.c + */ +int XScuGic_SelfTest(XScuGic *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_g.c new file mode 100644 index 000000000..60986e6b4 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_g.c @@ -0,0 +1,31 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xscugic.h" + +/* +* The configuration table for devices +*/ + +XScuGic_Config XScuGic_ConfigTable[] = +{ + { + XPAR_PS7_SCUGIC_0_DEVICE_ID, + XPAR_PS7_SCUGIC_0_BASEADDR, + XPAR_PS7_SCUGIC_0_DIST_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_hw.c new file mode 100755 index 000000000..488428ecf --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_hw.c @@ -0,0 +1,567 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_hw.c +* +* This file contains low-level driver functions that can be used to access the +* device. The user should refer to the hardware device specification for more +* details of the device operation. +* These routines are used when the user does not want to create an instance of +* XScuGic structure but still wants to use the ScuGic device. Hence the +* routines provided here take device id or scugic base address as arguments. +* Separate static versions of DistInit and CPUInit are provided to implement +* the low level driver routines. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.01a sdm 07/18/11 First release +* 1.03a srt 02/27/13 Moved Offset calculation macros from *_hw.c (CR +* 702687). +* Added support to direct interrupts to the appropriate CPU. +* Earlier interrupts were directed to CPU1 (hard coded). Now +* depending upon the CPU selected by the user (xparameters.h), +* interrupts will be directed to the relevant CPU. +* This fixes CR 699688. +* 1.04a hk 05/04/13 Fix for CR#705621. Moved functions +* XScuGic_SetPriTrigTypeByDistAddr and +* XScuGic_GetPriTrigTypeByDistAddr here from xscugic.c +* +* </pre> +* +******************************************************************************/ + + +/***************************** Include Files *********************************/ + +#include "xparameters.h" +#include "xil_types.h" +#include "xil_assert.h" +#include "xscugic.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +static void DistInit(XScuGic_Config *Config, u32 CpuID); +static void CPUInit(XScuGic_Config *Config); +static XScuGic_Config *LookupConfigByBaseAddress(u32 BaseAddress); + +/************************** Variable Definitions *****************************/ + +extern XScuGic_Config XScuGic_ConfigTable[]; + +/*****************************************************************************/ +/** +* +* DistInit initializes the distributor of the GIC. The +* initialization entails: +* +* - Write the trigger mode, priority and target CPU +* - All interrupt sources are disabled +* - Enable the distributor +* +* @param InstancePtr is a pointer to the XScuGic instance. +* @param CpuID is the Cpu ID to be initialized. +* +* @return None +* +* @note None. +* +******************************************************************************/ +static void DistInit(XScuGic_Config *Config, u32 CpuID) +{ + u32 Int_Id; + +#if USE_AMP==1 + #warning "Building GIC for AMP" + + /* + * The distrubutor should not be initialized by FreeRTOS in the case of + * AMP -- it is assumed that Linux is the master of this device in that + * case. + */ + return; +#endif + + XScuGic_WriteReg(Config->DistBaseAddress, XSCUGIC_DIST_EN_OFFSET, 0UL); + + /* + * Set the security domains in the int_security registers for non-secure + * interrupts. All are secure, so leave at the default. Set to 1 for + * non-secure interrupts. + */ + + + /* + * For the Shared Peripheral Interrupts INT_ID[MAX..32], set: + */ + + /* + * 1. The trigger mode in the int_config register + * Only write to the SPI interrupts, so start at 32 + */ + for (Int_Id = 32; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id+=16) { + /* + * Each INT_ID uses two bits, or 16 INT_ID per register + * Set them all to be level sensitive, active HIGH. + */ + XScuGic_WriteReg(Config->DistBaseAddress, + XSCUGIC_INT_CFG_OFFSET_CALC(Int_Id), 0UL); + } + + +#define DEFAULT_PRIORITY 0xa0a0a0a0UL + for (Int_Id = 0; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id+=4) { + /* + * 2. The priority using int the priority_level register + * The priority_level and spi_target registers use one byte per + * INT_ID. + * Write a default value that can be changed elsewhere. + */ + XScuGic_WriteReg(Config->DistBaseAddress, + XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id), + DEFAULT_PRIORITY); + } + + for (Int_Id = 32; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id+=4) { + /* + * 3. The CPU interface in the spi_target register + * Only write to the SPI interrupts, so start at 32 + */ + CpuID |= CpuID << 8; + CpuID |= CpuID << 16; + + XScuGic_WriteReg(Config->DistBaseAddress, + XSCUGIC_SPI_TARGET_OFFSET_CALC(Int_Id), CpuID); + } + + for (Int_Id = 0; Int_Id<XSCUGIC_MAX_NUM_INTR_INPUTS;Int_Id+=32) { + /* + * 4. Enable the SPI using the enable_set register. Leave all disabled + * for now. + */ + XScuGic_WriteReg(Config->DistBaseAddress, + XSCUGIC_ENABLE_DISABLE_OFFSET_CALC(XSCUGIC_DISABLE_OFFSET, + Int_Id), + 0xFFFFFFFFUL); + + } + + XScuGic_WriteReg(Config->DistBaseAddress, XSCUGIC_DIST_EN_OFFSET, + XSCUGIC_EN_INT_MASK); + +} + +/*****************************************************************************/ +/** +* +* CPUInit initializes the CPU Interface of the GIC. The initialization entails: +* +* - Set the priority of the CPU. +* - Enable the CPU interface +* +* @param ConfigPtr is a pointer to a config table for the particular +* device this driver is associated with. +* +* @return None +* +* @note None. +* +******************************************************************************/ +static void CPUInit(XScuGic_Config *Config) +{ + /* + * Program the priority mask of the CPU using the Priority mask + * register + */ + XScuGic_WriteReg(Config->CpuBaseAddress, XSCUGIC_CPU_PRIOR_OFFSET, + 0xF0); + + /* + * If the CPU operates in both security domains, set parameters in the + * control_s register. + * 1. Set FIQen=1 to use FIQ for secure interrupts, + * 2. Program the AckCtl bit + * 3. Program the SBPR bit to select the binary pointer behavior + * 4. Set EnableS = 1 to enable secure interrupts + * 5. Set EnbleNS = 1 to enable non secure interrupts + */ + + /* + * If the CPU operates only in the secure domain, setup the + * control_s register. + * 1. Set FIQen=1, + * 2. Set EnableS=1, to enable the CPU interface to signal secure . + * interrupts Only enable the IRQ output unless secure interrupts + * are needed. + */ + XScuGic_WriteReg(Config->CpuBaseAddress, XSCUGIC_CONTROL_OFFSET, 0x07); + +} + +/*****************************************************************************/ +/** +* +* CfgInitialize a specific interrupt controller instance/driver. The +* initialization entails: +* +* - Initialize fields of the XScuGic structure +* - Initial vector table with stub function calls +* - All interrupt sources are disabled +* +* @param InstancePtr is a pointer to the XScuGic instance to be worked on. +* @param ConfigPtr is a pointer to a config table for the particular device +* this driver is associated with. +* @param EffectiveAddr is the device base address in the virtual memory address +* space. The caller is responsible for keeping the address mapping +* from EffectiveAddr to the device physical base address unchanged +* once this function is invoked. Unexpected errors may occur if the +* address mapping changes after this function is called. If address +* translation is not used, use Config->BaseAddress for this parameters, +* passing the physical address instead. +* +* @return +* +* - XST_SUCCESS if initialization was successful +* +* @note +* +* None. +* +******************************************************************************/ +int XScuGic_DeviceInitialize(u32 DeviceId) +{ + XScuGic_Config *Config; + u8 Cpu_Id = XPAR_CPU_ID + 1; + + Config = &XScuGic_ConfigTable[(u32 )DeviceId]; + + DistInit(Config, Cpu_Id); + + CPUInit(Config); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* This function is the primary interrupt handler for the driver. It must be +* connected to the interrupt source such that it is called when an interrupt of +* the interrupt controller is active. It will resolve which interrupts are +* active and enabled and call the appropriate interrupt handler. It uses +* the Interrupt Type information to determine when to acknowledge the +* interrupt.Highest priority interrupts are serviced first. +* +* This function assumes that an interrupt vector table has been previously +* initialized. It does not verify that entries in the table are valid before +* calling an interrupt handler. +* +* @param DeviceId is the unique identifier for the ScuGic device. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XScuGic_DeviceInterruptHandler(void *DeviceId) +{ + + u32 IntID; + XScuGic_VectorTableEntry *TablePtr; + XScuGic_Config *CfgPtr; + + CfgPtr = &XScuGic_ConfigTable[(u32 )DeviceId]; + + /* + * Read the int_ack register to identify the highest priority + * interrupt ID and make sure it is valid. Reading Int_Ack will + * clear the interrupt in the GIC. + */ + IntID = XScuGic_ReadReg(CfgPtr->CpuBaseAddress, XSCUGIC_INT_ACK_OFFSET) + & XSCUGIC_ACK_INTID_MASK; + if(XSCUGIC_MAX_NUM_INTR_INPUTS < IntID){ + goto IntrExit; + } + + /* + * If the interrupt is shared, do some locking here if there are + * multiple processors. + */ + /* + * If pre-eption is required: + * Re-enable pre-emption by setting the CPSR I bit for non-secure , + * interrupts or the F bit for secure interrupts + */ + + /* + * If we need to change security domains, issue a SMC instruction here. + */ + + /* + * Execute the ISR. Jump into the Interrupt service routine based on + * the IRQSource. A software trigger is cleared by the ACK. + */ + TablePtr = &(CfgPtr->HandlerTable[IntID]); + TablePtr->Handler(TablePtr->CallBackRef); + +IntrExit: + /* + * Write to the EOI register, we are all done here. + * Let this function return, the boot code will restore the stack. + */ + XScuGic_WriteReg(CfgPtr->CpuBaseAddress, XSCUGIC_EOI_OFFSET, IntID); + + /* + * Return from the interrupt. Change security domains could happen + * here. + */ +} + +/*****************************************************************************/ +/** +* +* Register a handler function for a specific interrupt ID. The vector table +* of the interrupt controller is updated, overwriting any previous handler. +* The handler function will be called when an interrupt occurs for the given +* interrupt ID. +* +* @param BaseAddress is the CPU Interface Register base address of the +* interrupt controller whose vector table will be modified. +* @param InterruptId is the interrupt ID to be associated with the input +* handler. +* @param Handler is the function pointer that will be added to +* the vector table for the given interrupt ID. +* @param CallBackRef is the argument that will be passed to the new +* handler function when it is called. This is user-specific. +* +* @return None. +* +* @note +* +* Note that this function has no effect if the input base address is invalid. +* +******************************************************************************/ +void XScuGic_RegisterHandler(u32 BaseAddress, int InterruptId, + Xil_InterruptHandler Handler, void *CallBackRef) +{ + XScuGic_Config *CfgPtr; + + CfgPtr = LookupConfigByBaseAddress(BaseAddress); + if (CfgPtr != NULL) { + CfgPtr->HandlerTable[InterruptId].Handler = Handler; + CfgPtr->HandlerTable[InterruptId].CallBackRef = CallBackRef; + } +} + +/*****************************************************************************/ +/** +* +* Looks up the device configuration based on the CPU interface base address of +* the device. A table contains the configuration info for each device in the +* system. +* +* @param CpuBaseAddress is the CPU Interface Register base address. +* +* @return A pointer to the configuration structure for the specified +* device, or NULL if the device was not found. +* +* @note None. +* +******************************************************************************/ +static XScuGic_Config *LookupConfigByBaseAddress(u32 CpuBaseAddress) +{ + XScuGic_Config *CfgPtr = NULL; + int Index; + + for (Index = 0; Index < XPAR_SCUGIC_NUM_INSTANCES; Index++) { + if (XScuGic_ConfigTable[Index].CpuBaseAddress == + CpuBaseAddress) { + CfgPtr = &XScuGic_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} + +/****************************************************************************/ +/** +* Sets the interrupt priority and trigger type for the specificd IRQ source. +* +* @param BaseAddr is the device base address +* @param Int_Id is the IRQ source number to modify +* @param Priority is the new priority for the IRQ source. 0 is highest +* priority, 0xF8 (248) is lowest. There are 32 priority levels +* supported with a step of 8. Hence the supported priorities are +* 0, 8, 16, 32, 40 ..., 248. +* @param Trigger is the new trigger type for the IRQ source. +* Each bit pair describes the configuration for an INT_ID. +* SFI Read Only b10 always +* PPI Read Only depending on how the PPIs are configured. +* b01 Active HIGH level sensitive +* b11 Rising edge sensitive +* SPI LSB is read only. +* b01 Active HIGH level sensitive +* b11 Rising edge sensitive/ +* +* @return None. +* +* @note This API has the similar functionality of XScuGic_SetPriority +* TriggerType() and should be used when there is no InstancePtr. +* +*****************************************************************************/ +void XScuGic_SetPriTrigTypeByDistAddr(u32 DistBaseAddress, u32 Int_Id, + u8 Priority, u8 Trigger) +{ + u32 RegValue; + + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(Trigger <= XSCUGIC_INT_CFG_MASK); + Xil_AssertVoid(Priority <= XSCUGIC_MAX_INTR_PRIO_VAL); + + /* + * Determine the register to write to using the Int_Id. + */ + RegValue = XScuGic_ReadReg(DistBaseAddress, + XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id)); + + /* + * The priority bits are Bits 7 to 3 in GIC Priority Register. This + * means the number of priority levels supported are 32 and they are + * in steps of 8. The priorities can be 0, 8, 16, 32, 48, ... etc. + * The lower order 3 bits are masked before putting it in the register. + */ + Priority = Priority & XSCUGIC_INTR_PRIO_MASK; + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue &= ~(XSCUGIC_PRIORITY_MASK << ((Int_Id%4)*8)); + RegValue |= Priority << ((Int_Id%4)*8); + + /* + * Write the value back to the register. + */ + XScuGic_WriteReg(DistBaseAddress, XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id), + RegValue); + /* + * Determine the register to write to using the Int_Id. + */ + RegValue = XScuGic_ReadReg(DistBaseAddress, + XSCUGIC_INT_CFG_OFFSET_CALC (Int_Id)); + + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue &= ~(XSCUGIC_INT_CFG_MASK << ((Int_Id%16)*2)); + RegValue |= Trigger << ((Int_Id%16)*2); + + /* + * Write the value back to the register. + */ + XScuGic_WriteReg(DistBaseAddress, XSCUGIC_INT_CFG_OFFSET_CALC(Int_Id), + RegValue); +} + +/****************************************************************************/ +/** +* Gets the interrupt priority and trigger type for the specificd IRQ source. +* +* @param BaseAddr is the device base address +* @param Int_Id is the IRQ source number to modify +* @param Priority is a pointer to the value of the priority of the IRQ +* source. This is a return value. +* @param Trigger is pointer to the value of the trigger of the IRQ +* source. This is a return value. +* +* @return None. +* +* @note This API has the similar functionality of XScuGic_GetPriority +* TriggerType() and should be used when there is no InstancePtr. +* +*****************************************************************************/ +void XScuGic_GetPriTrigTypeByDistAddr(u32 DistBaseAddress, u32 Int_Id, + u8 *Priority, u8 *Trigger) +{ + u32 RegValue; + + Xil_AssertVoid(Int_Id < XSCUGIC_MAX_NUM_INTR_INPUTS); + Xil_AssertVoid(Priority != NULL); + Xil_AssertVoid(Trigger != NULL); + + /* + * Determine the register to read to using the Int_Id. + */ + RegValue = XScuGic_ReadReg(DistBaseAddress, + XSCUGIC_PRIORITY_OFFSET_CALC(Int_Id)); + + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue = RegValue >> ((Int_Id%4)*8); + *Priority = RegValue & XSCUGIC_PRIORITY_MASK; + + /* + * Determine the register to read to using the Int_Id. + */ + RegValue = XScuGic_ReadReg(DistBaseAddress, + XSCUGIC_INT_CFG_OFFSET_CALC (Int_Id)); + + /* + * Shift and Mask the correct bits for the priority and trigger in the + * register + */ + RegValue = RegValue >> ((Int_Id%16)*2); + + *Trigger = RegValue & XSCUGIC_INT_CFG_MASK; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_hw.h new file mode 100755 index 000000000..4f8354fe9 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_hw.h @@ -0,0 +1,641 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_hw.h +* +* This header file contains identifiers and HW access functions (or +* macros) that can be used to access the device. The user should refer to the +* hardware device specification for more details of the device operation. +* The driver functions/APIs are defined in xscugic.h. +* +* This GIC device has two parts, a distributor and CPU interface(s). Each part +* has separate register definition sections. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------------- +* 1.00a drg 01/19/10 First release +* 1.01a sdm 11/09/11 "xil_exception.h" added as include. +* Macros XScuGic_EnableIntr and XScuGic_DisableIntr are +* added to enable or disable interrupts based on +* Distributor Register base address. Normally users use +* XScuGic instance and call XScuGic_Enable or +* XScuGic_Disable to enable/disable interrupts. These +* new macros are provided when user does not want to +* use an instance pointer but still wants to enable or +* disable interrupts. +* Function prototypes for functions (present in newly +* added file xscugic_hw.c) are added. +* 1.03a srt 02/27/13 Moved Offset calculation macros from *_hw.c (CR +* 702687). +* 1.04a hk 05/04/13 Fix for CR#705621. Moved function prototypes +* XScuGic_SetPriTrigTypeByDistAddr and +* XScuGic_GetPriTrigTypeByDistAddr here from xscugic.h +* +* </pre> +* +******************************************************************************/ + +#ifndef XSCUGIC_HW_H /* prevent circular inclusions */ +#define XSCUGIC_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" +#include "xil_exception.h" + +/************************** Constant Definitions *****************************/ + +/* + * The maximum number of interrupts supported by the hardware. + */ +#define XSCUGIC_MAX_NUM_INTR_INPUTS 95 + +/* + * The maximum priority value that can be used in the GIC. + */ +#define XSCUGIC_MAX_INTR_PRIO_VAL 248 +#define XSCUGIC_INTR_PRIO_MASK 0xF8 + +/** @name Distributor Interface Register Map + * + * Define the offsets from the base address for all Distributor registers of + * the interrupt controller, some registers may be reserved in the hardware + * device. + * @{ + */ +#define XSCUGIC_DIST_EN_OFFSET 0x00000000 /**< Distributor Enable + Register */ +#define XSCUGIC_IC_TYPE_OFFSET 0x00000004 /**< Interrupt Controller + Type Register */ +#define XSCUGIC_DIST_IDENT_OFFSET 0x00000008 /**< Implementor ID + Register */ +#define XSCUGIC_SECURITY_OFFSET 0x00000080 /**< Interrupt Security + Register */ +#define XSCUGIC_ENABLE_SET_OFFSET 0x00000100 /**< Enable Set + Register */ +#define XSCUGIC_DISABLE_OFFSET 0x00000180 /**< Enable Clear Register */ +#define XSCUGIC_PENDING_SET_OFFSET 0x00000200 /**< Pending Set + Register */ +#define XSCUGIC_PENDING_CLR_OFFSET 0x00000280 /**< Pending Clear + Register */ +#define XSCUGIC_ACTIVE_OFFSET 0x00000300 /**< Active Status Register */ +#define XSCUGIC_PRIORITY_OFFSET 0x00000400 /**< Priority Level Register */ +#define XSCUGIC_SPI_TARGET_OFFSET 0x00000800 /**< SPI Target + Register 0x800-0x8FB */ +#define XSCUGIC_INT_CFG_OFFSET 0x00000C00 /**< Interrupt Configuration + Register 0xC00-0xCFC */ +#define XSCUGIC_PPI_STAT_OFFSET 0x00000D00 /**< PPI Status Register */ +#define XSCUGIC_SPI_STAT_OFFSET 0x00000D04 /**< SPI Status Register + 0xd04-0xd7C */ +#define XSCUGIC_AHB_CONFIG_OFFSET 0x00000D80 /**< AHB Configuration + Register */ +#define XSCUGIC_SFI_TRIG_OFFSET 0x00000F00 /**< Software Triggered + Interrupt Register */ +#define XSCUGIC_PERPHID_OFFSET 0x00000FD0 /**< Peripheral ID Reg */ +#define XSCUGIC_PCELLID_OFFSET 0x00000FF0 /**< Pcell ID Register */ +/* @} */ + +/** @name Distributor Enable Register + * Controls if the distributor response to external interrupt inputs. + * @{ + */ +#define XSCUGIC_EN_INT_MASK 0x00000001 /**< Interrupt In Enable */ +/* @} */ + +/** @name Interrupt Controller Type Register + * @{ + */ +#define XSCUGIC_LSPI_MASK 0x0000F800 /**< Number of Lockable + Shared Peripheral + Interrupts*/ +#define XSCUGIC_DOMAIN_MASK 0x00000400 /**< Number os Security domains*/ +#define XSCUGIC_CPU_NUM_MASK 0x000000E0 /**< Number of CPU Interfaces */ +#define XSCUGIC_NUM_INT_MASK 0x0000001F /**< Number of Interrupt IDs */ +/* @} */ + +/** @name Implementor ID Register + * Implementor and revision information. + * @{ + */ +#define XSCUGIC_REV_MASK 0x00FFF000 /**< Revision Number */ +#define XSCUGIC_IMPL_MASK 0x00000FFF /**< Implementor */ +/* @} */ + +/** @name Interrupt Security Registers + * Each bit controls the security level of an interrupt, either secure or non + * secure. These registers can only be accessed using secure read and write. + * There are registers for each of the CPU interfaces at offset 0x080. A + * register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x084. + * @{ + */ +#define XSCUGIC_INT_NS_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Enable Set Register + * Each bit controls the enabling of an interrupt, a 0 is disabled, a 1 is + * enabled. Writing a 0 has no effect. Use the ENABLE_CLR register to set a + * bit to 0. + * There are registers for each of the CPU interfaces at offset 0x100. With up + * to 8 registers aliased to the same address. A register set for the SPI + * interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x104. + * @{ + */ +#define XSCUGIC_INT_EN_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Enable Clear Register + * Each bit controls the disabling of an interrupt, a 0 is disabled, a 1 is + * enabled. Writing a 0 has no effect. Writing a 1 disables an interrupt and + * sets the corresponding bit to 0. + * There are registers for each of the CPU interfaces at offset 0x180. With up + * to 8 registers aliased to the same address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x184. + * @{ + */ +#define XSCUGIC_INT_CLR_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Pending Set Register + * Each bit controls the Pending or Active and Pending state of an interrupt, a + * 0 is not pending, a 1 is pending. Writing a 0 has no effect. Writing a 1 sets + * an interrupt to the pending state. + * There are registers for each of the CPU interfaces at offset 0x200. With up + * to 8 registers aliased to the same address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x204. + * @{ + */ +#define XSCUGIC_PEND_SET_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Pending Clear Register + * Each bit can clear the Pending or Active and Pending state of an interrupt, a + * 0 is not pending, a 1 is pending. Writing a 0 has no effect. Writing a 1 + * clears the pending state of an interrupt. + * There are registers for each of the CPU interfaces at offset 0x280. With up + * to 8 registers aliased to the same address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x284. + * @{ + */ +#define XSCUGIC_PEND_CLR_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Active Status Register + * Each bit provides the Active status of an interrupt, a + * 0 is not Active, a 1 is Active. This is a read only register. + * There are registers for each of the CPU interfaces at offset 0x300. With up + * to 8 registers aliased to each address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 32 of these registers staring at location 0x380. + * @{ + */ +#define XSCUGIC_ACTIVE_MASK 0x00000001 /**< Each bit corresponds to an + INT_ID */ +/* @} */ + +/** @name Priority Level Register + * Each byte in a Priority Level Register sets the priority level of an + * interrupt. Reading the register provides the priority level of an interrupt. + * There are registers for each of the CPU interfaces at offset 0x400 through + * 0x41C. With up to 8 registers aliased to each address. + * 0 is highest priority, 0xFF is lowest. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 255 of these registers staring at location 0x420. + * @{ + */ +#define XSCUGIC_PRIORITY_MASK 0x000000FF /**< Each Byte corresponds to an + INT_ID */ +#define XSCUGIC_PRIORITY_MAX 0x000000FF /**< Highest value of a priority + actually the lowest priority*/ +/* @} */ + +/** @name SPI Target Register 0x800-0x8FB + * Each byte references a separate SPI and programs which of the up to 8 CPU + * interfaces are sent a Pending interrupt. + * There are registers for each of the CPU interfaces at offset 0x800 through + * 0x81C. With up to 8 registers aliased to each address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 255 of these registers staring at location 0x820. + * + * This driver does not support multiple CPU interfaces. These are included + * for complete documentation. + * @{ + */ +#define XSCUGIC_SPI_CPU7_MASK 0x00000080 /**< CPU 7 Mask*/ +#define XSCUGIC_SPI_CPU6_MASK 0x00000040 /**< CPU 6 Mask*/ +#define XSCUGIC_SPI_CPU5_MASK 0x00000020 /**< CPU 5 Mask*/ +#define XSCUGIC_SPI_CPU4_MASK 0x00000010 /**< CPU 4 Mask*/ +#define XSCUGIC_SPI_CPU3_MASK 0x00000008 /**< CPU 3 Mask*/ +#define XSCUGIC_SPI_CPU2_MASK 0x00000003 /**< CPU 2 Mask*/ +#define XSCUGIC_SPI_CPU1_MASK 0x00000002 /**< CPU 1 Mask*/ +#define XSCUGIC_SPI_CPU0_MASK 0x00000001 /**< CPU 0 Mask*/ +/* @} */ + +/** @name Interrupt Configuration Register 0xC00-0xCFC + * The interrupt configuration registers program an SFI to be active HIGH level + * sensitive or rising edge sensitive. + * Each bit pair describes the configuration for an INT_ID. + * SFI Read Only b10 always + * PPI Read Only depending on how the PPIs are configured. + * b01 Active HIGH level sensitive + * b11 Rising edge sensitive + * SPI LSB is read only. + * b01 Active HIGH level sensitive + * b11 Rising edge sensitive/ + * There are registers for each of the CPU interfaces at offset 0xC00 through + * 0xC04. With up to 8 registers aliased to each address. + * A register set for the SPI interrupts is available to all CPU interfaces. + * There are up to 255 of these registers staring at location 0xC08. + * @{ + */ +#define XSCUGIC_INT_CFG_MASK 0x00000003 /**< */ +/* @} */ + +/** @name PPI Status Register + * Enables an external AMBA master to access the status of the PPI inputs. + * A CPU can only read the status of its local PPI signals and cannot read the + * status for other CPUs. + * This register is aliased for each CPU interface. + * @{ + */ +#define XSCUGIC_PPI_C15_MASK 0x00008000 /**< PPI Status */ +#define XSCUGIC_PPI_C14_MASK 0x00004000 /**< PPI Status */ +#define XSCUGIC_PPI_C13_MASK 0x00002000 /**< PPI Status */ +#define XSCUGIC_PPI_C12_MASK 0x00001000 /**< PPI Status */ +#define XSCUGIC_PPI_C11_MASK 0x00000800 /**< PPI Status */ +#define XSCUGIC_PPI_C10_MASK 0x00000400 /**< PPI Status */ +#define XSCUGIC_PPI_C09_MASK 0x00000200 /**< PPI Status */ +#define XSCUGIC_PPI_C08_MASK 0x00000100 /**< PPI Status */ +#define XSCUGIC_PPI_C07_MASK 0x00000080 /**< PPI Status */ +#define XSCUGIC_PPI_C06_MASK 0x00000040 /**< PPI Status */ +#define XSCUGIC_PPI_C05_MASK 0x00000020 /**< PPI Status */ +#define XSCUGIC_PPI_C04_MASK 0x00000010 /**< PPI Status */ +#define XSCUGIC_PPI_C03_MASK 0x00000008 /**< PPI Status */ +#define XSCUGIC_PPI_C02_MASK 0x00000004 /**< PPI Status */ +#define XSCUGIC_PPI_C01_MASK 0x00000002 /**< PPI Status */ +#define XSCUGIC_PPI_C00_MASK 0x00000001 /**< PPI Status */ +/* @} */ + +/** @name SPI Status Register 0xd04-0xd7C + * Enables an external AMBA master to access the status of the SPI inputs. + * There are up to 63 registers if the maximum number of SPI inputs are + * configured. + * @{ + */ +#define XSCUGIC_SPI_N_MASK 0x00000001 /**< Each bit corresponds to an SPI + input */ +/* @} */ + +/** @name AHB Configuration Register + * Provides the status of the CFGBIGEND input signal and allows the endianess + * of the GIC to be set. + * @{ + */ +#define XSCUGIC_AHB_END_MASK 0x00000004 /**< 0-GIC uses little Endian, + 1-GIC uses Big Endian */ +#define XSCUGIC_AHB_ENDOVR_MASK 0x00000002 /**< 0-Uses CFGBIGEND control, + 1-use the AHB_END bit */ +#define XSCUGIC_AHB_TIE_OFF_MASK 0x00000001 /**< State of CFGBIGEND */ + +/* @} */ + +/** @name Software Triggered Interrupt Register + * Controls issueing of software interrupts. + * @{ + */ +#define XSCUGIC_SFI_SELFTRIG_MASK 0x02010000 +#define XSCUGIC_SFI_TRIG_TRGFILT_MASK 0x03000000 /**< Target List filter + b00-Use the target List + b01-All CPUs except requester + b10-To Requester + b11-reserved */ +#define XSCUGIC_SFI_TRIG_CPU_MASK 0x00FF0000 /**< CPU Target list */ +#define XSCUGIC_SFI_TRIG_SATT_MASK 0x00008000 /**< 0= Use a secure interrupt */ +#define XSCUGIC_SFI_TRIG_INTID_MASK 0x0000000F /**< Set to the INTID + signaled to the CPU*/ +/* @} */ + +/** @name CPU Interface Register Map + * + * Define the offsets from the base address for all CPU registers of the + * interrupt controller, some registers may be reserved in the hardware device. + * @{ + */ +#define XSCUGIC_CONTROL_OFFSET 0x00000000 /**< CPU Interface Control + Register */ +#define XSCUGIC_CPU_PRIOR_OFFSET 0x00000004 /**< Priority Mask Reg */ +#define XSCUGIC_BIN_PT_OFFSET 0x00000008 /**< Binary Point Register */ +#define XSCUGIC_INT_ACK_OFFSET 0x0000000C /**< Interrupt ACK Reg */ +#define XSCUGIC_EOI_OFFSET 0x00000010 /**< End of Interrupt Reg */ +#define XSCUGIC_RUN_PRIOR_OFFSET 0x00000014 /**< Running Priority Reg */ +#define XSCUGIC_HI_PEND_OFFSET 0x00000018 /**< Highest Pending Interrupt + Register */ +#define XSCUGIC_ALIAS_BIN_PT_OFFSET 0x0000001C /**< Aliased non-Secure + Binary Point Register */ + +/**< 0x00000020 to 0x00000FBC are reserved and should not be read or written + * to. */ +/* @} */ + + +/** @name Control Register + * CPU Interface Control register definitions + * All bits are defined here although some are not available in the non-secure + * mode. + * @{ + */ +#define XSCUGIC_CNTR_SBPR_MASK 0x00000010 /**< Secure Binary Pointer, + 0=separate registers, + 1=both use bin_pt_s */ +#define XSCUGIC_CNTR_FIQEN_MASK 0x00000008 /**< Use nFIQ_C for secure + interrupts, + 0= use IRQ for both, + 1=Use FIQ for secure, IRQ for non*/ +#define XSCUGIC_CNTR_ACKCTL_MASK 0x00000004 /**< Ack control for secure or non secure */ +#define XSCUGIC_CNTR_EN_NS_MASK 0x00000002 /**< Non Secure enable */ +#define XSCUGIC_CNTR_EN_S_MASK 0x00000001 /**< Secure enable, 0=Disabled, 1=Enabled */ +/* @} */ + +/** @name Priority Mask Register + * Priority Mask register definitions + * The CPU interface does not send interrupt if the level of the interrupt is + * lower than the level of the register. + * @{ + */ +#define XSCUGIC_PRIORITY_MASK 0x000000FF /**< All interrupts */ +/* @} */ + +/** @name Binary Point Register + * Binary Point register definitions + * @{ + */ + +#define XSCUGIC_BIN_PT_MASK 0x00000007 /**< Binary point mask value + Value Secure Non-secure + b000 0xFE 0xFF + b001 0xFC 0xFE + b010 0xF8 0xFC + b011 0xF0 0xF8 + b100 0xE0 0xF0 + b101 0xC0 0xE0 + b110 0x80 0xC0 + b111 0x00 0x80 + */ +/*@}*/ + +/** @name Interrupt Acknowledge Register + * Interrupt Acknowledge register definitions + * Identifies the current Pending interrupt, and the CPU ID for software + * interrupts. + */ +#define XSCUGIC_ACK_INTID_MASK 0x000003FF /**< Interrupt ID */ +#define XSCUGIC_CPUID_MASK 0x00000C00 /**< CPU ID */ +/* @} */ + +/** @name End of Interrupt Register + * End of Interrupt register definitions + * Allows the CPU to signal the GIC when it completes an interrupt service + * routine. + */ +#define XSCUGIC_EOI_INTID_MASK 0x000003FF /**< Interrupt ID */ + +/* @} */ + +/** @name Running Priority Register + * Running Priority register definitions + * Identifies the interrupt priority level of the highest priority active + * interrupt. + */ +#define XSCUGIC_RUN_PRIORITY_MASK 0x00000FF /**< Interrupt Priority */ +/* @} */ + +/* + * Highest Pending Interrupt register definitions + * Identifies the interrupt priority of the highest priority pending interupt + */ +#define XSCUGIC_PEND_INTID_MASK 0x000003FF /**< Pending Interrupt ID */ +#define XSCUGIC_CPUID_MASK 0x00000C00 /**< CPU ID */ +/* @} */ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Read the Interrupt Configuration Register offset for an interrupt id. +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_INT_CFG_OFFSET_CALC(InterruptID) \ + (XSCUGIC_INT_CFG_OFFSET + ((InterruptID/16) * 4)) + +/****************************************************************************/ +/** +* +* Read the Interrupt Priority Register offset for an interrupt id. +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_PRIORITY_OFFSET_CALC(InterruptID) \ + (XSCUGIC_PRIORITY_OFFSET + ((InterruptID/4) * 4)) + +/****************************************************************************/ +/** +* +* Read the SPI Target Register offset for an interrupt id. +* +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_SPI_TARGET_OFFSET_CALC(InterruptID) \ + (XSCUGIC_SPI_TARGET_OFFSET + ((InterruptID/4) * 4)) + +/****************************************************************************/ +/** +* +* Read the Interrupt Clear-Enable Register offset for an interrupt ID +* +* @param Register is the register offset for the clear/enable bank. +* @param InterruptID is the interrupt number. +* +* @return The 32-bit value of the offset +* +* @note +* +*****************************************************************************/ +#define XSCUGIC_ENABLE_DISABLE_OFFSET_CALC(Register, InterruptID) \ + (Register + ((InterruptID/32) * 4)) + +/****************************************************************************/ +/** +* +* Read the given Intc register. +* +* @param BaseAddress is the base address of the device. +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note +* C-style signature: +* u32 XScuGic_ReadReg(u32 BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XScuGic_ReadReg(BaseAddress, RegOffset) \ + (Xil_In32((BaseAddress) + (RegOffset))) + + +/****************************************************************************/ +/** +* +* Write the given Intc register. +* +* @param BaseAddress is the base address of the device. +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note +* C-style signature: +* void XScuGic_WriteReg(u32 BaseAddress, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuGic_WriteReg(BaseAddress, RegOffset, Data) \ + (Xil_Out32(((BaseAddress) + (RegOffset)), ((u32)Data))) + + +/****************************************************************************/ +/** +* +* Enable specific interrupt(s) in the interrupt controller. +* +* @param DistBaseAddress is the Distributor Register base address of the +* device +* @param Int_Id is the ID of the interrupt source and should be in the +* range of 0 to XSCUGIC_MAX_NUM_INTR_INPUTS - 1 +* +* @return None. +* +* @note C-style signature: +* void XScuGic_EnableIntr(u32 DistBaseAddress, u32 Int_Id); +* +*****************************************************************************/ +#define XScuGic_EnableIntr(DistBaseAddress, Int_Id) \ + XScuGic_WriteReg((DistBaseAddress), \ + XSCUGIC_ENABLE_SET_OFFSET + ((Int_Id / 32) * 4), \ + (1 << (Int_Id % 32))) + +/****************************************************************************/ +/** +* +* Disable specific interrupt(s) in the interrupt controller. +* +* @param DistBaseAddress is the Distributor Register base address of the +* device +* @param Int_Id is the ID of the interrupt source and should be in the +* range of 0 to XSCUGIC_MAX_NUM_INTR_INPUTS - 1 +* +* +* @return None. +* +* @note C-style signature: +* void XScuGic_DisableIntr(u32 DistBaseAddress, u32 Int_Id); +* +*****************************************************************************/ +#define XScuGic_DisableIntr(DistBaseAddress, Int_Id) \ + XScuGic_WriteReg((DistBaseAddress), \ + XSCUGIC_DISABLE_OFFSET + ((Int_Id / 32) * 4), \ + (1 << (Int_Id % 32))) + + +/************************** Function Prototypes ******************************/ + +void XScuGic_DeviceInterruptHandler(void *DeviceId); +int XScuGic_DeviceInitialize(u32 DeviceId); +void XScuGic_RegisterHandler(u32 BaseAddress, int InterruptId, + Xil_InterruptHandler Handler, void *CallBackRef); +void XScuGic_SetPriTrigTypeByDistAddr(u32 DistBaseAddress, u32 Int_Id, + u8 Priority, u8 Trigger); +void XScuGic_GetPriTrigTypeByDistAddr(u32 DistBaseAddress, u32 Int_Id, + u8 *Priority, u8 *Trigger); +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_intr.c new file mode 100755 index 000000000..05415c086 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_intr.c @@ -0,0 +1,174 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_intr.c +* +* This file contains the interrupt processing for the driver for the Xilinx +* Interrupt Controller. The interrupt processing is partitioned separately such +* that users are not required to use the provided interrupt processing. This +* file requires other files of the driver to be linked in also. +* +* The interrupt handler, XScuGic_InterruptHandler, uses an input argument which +* is an instance pointer to an interrupt controller driver such that multiple +* interrupt controllers can be supported. This handler requires the calling +* function to pass it the appropriate argument, so another level of indirection +* may be required. +* +* The interrupt processing may be used by connecting the interrupt handler to +* the interrupt system. The handler does not save and restore the processor +* context but only handles the processing of the Interrupt Controller. The user +* is encouraged to supply their own interrupt handler when performance tuning is +* deemed necessary. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------------- +* 1.00a drg 01/19/10 First release +* 1.01a sdm 11/09/11 XScuGic_InterruptHandler has changed correspondingly +* since the HandlerTable has now moved to XScuGic_Config. +* +* </pre> +* +* @internal +* +* This driver assumes that the context of the processor has been saved prior to +* the calling of the Interrupt Controller interrupt handler and then restored +* after the handler returns. This requires either the running RTOS to save the +* state of the machine or that a wrapper be used as the destination of the +* interrupt vector to save the state of the processor and restore the state +* after the interrupt handler returns. +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xscugic.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/*****************************************************************************/ +/** +* This function is the primary interrupt handler for the driver. It must be +* connected to the interrupt source such that it is called when an interrupt of +* the interrupt controller is active. It will resolve which interrupts are +* active and enabled and call the appropriate interrupt handler. It uses +* the Interrupt Type information to determine when to acknowledge the interrupt. +* Highest priority interrupts are serviced first. +* +* This function assumes that an interrupt vector table has been previously +* initialized. It does not verify that entries in the table are valid before +* calling an interrupt handler. +* +* +* @param InstancePtr is a pointer to the XScuGic instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XScuGic_InterruptHandler(XScuGic *InstancePtr) +{ + + u32 IntID; + XScuGic_VectorTableEntry *TablePtr; + + /* Assert that the pointer to the instance is valid + */ + Xil_AssertVoid(InstancePtr != NULL); + + /* + * Read the int_ack register to identify the highest priority interrupt ID + * and make sure it is valid. Reading Int_Ack will clear the interrupt + * in the GIC. + */ + IntID = XScuGic_CPUReadReg(InstancePtr, XSCUGIC_INT_ACK_OFFSET) & + XSCUGIC_ACK_INTID_MASK; + if(XSCUGIC_MAX_NUM_INTR_INPUTS < IntID){ + goto IntrExit; + } + + /* + * If the interrupt is shared, do some locking here if there are multiple + * processors. + */ + /* + * If pre-eption is required: + * Re-enable pre-emption by setting the CPSR I bit for non-secure , + * interrupts or the F bit for secure interrupts + */ + + /* + * If we need to change security domains, issue a SMC instruction here. + */ + + /* + * Execute the ISR. Jump into the Interrupt service routine based on the + * IRQSource. A software trigger is cleared by the ACK. + */ + TablePtr = &(InstancePtr->Config->HandlerTable[IntID]); + TablePtr->Handler(TablePtr->CallBackRef); + +IntrExit: + /* + * Write to the EOI register, we are all done here. + * Let this function return, the boot code will restore the stack. + */ + XScuGic_CPUWriteReg(InstancePtr, XSCUGIC_EOI_OFFSET, IntID); + + /* + * Return from the interrupt. Change security domains could happen here. + */ +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_selftest.c new file mode 100755 index 000000000..3c0d42a5b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_selftest.c @@ -0,0 +1,119 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_selftest.c +* +* Contains diagnostic self-test functions for the XScuGic driver. +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a drg 01/19/10 First release +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xscugic.h" + +/************************** Constant Definitions *****************************/ + +#define XSCUGIC_PCELL_ID 0xB105F00D + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/*****************************************************************************/ +/** +* +* Run a self-test on the driver/device. This test reads the ID registers and +* compares them. +* +* @param InstancePtr is a pointer to the XScuGic instance. +* +* @return +* +* - XST_SUCCESS if self-test is successful. +* - XST_FAILURE if the self-test is not successful. +* +* @note None. +* +******************************************************************************/ +int XScuGic_SelfTest(XScuGic *InstancePtr) +{ + u32 RegValue1 =0; + int Index; + + /* + * Assert the arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the ID registers. + */ + for(Index=0; Index<=3; Index++) { + RegValue1 |= XScuGic_DistReadReg(InstancePtr, + (XSCUGIC_PCELLID_OFFSET + (Index * 4))) << (Index * 8); + } + + if(XSCUGIC_PCELL_ID != RegValue1){ + return XST_FAILURE; + } + + return XST_SUCCESS; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_sinit.c new file mode 100755 index 000000000..c1e635adb --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scugic_v1_05_a/src/xscugic_sinit.c @@ -0,0 +1,109 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscugic_sinit.c +* +* Contains static init functions for the XScuGic driver for the Interrupt +* Controller. See xscugic.h for a detailed description of the driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- -------------------------------------------------------- +* 1.00a drg 01/19/10 First release +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xparameters.h" +#include "xscugic.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +extern XScuGic_Config XScuGic_ConfigTable[]; + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* +* Looks up the device configuration based on the unique device ID. A table +* contains the configuration info for each device in the system. +* +* @param DeviceId is the unique identifier for a device. +* +* @return A pointer to the XScuGic configuration structure for the +* specified device, or NULL if the device was not found. +* +* @note None. +* +******************************************************************************/ +XScuGic_Config *XScuGic_LookupConfig(u16 DeviceId) +{ + XScuGic_Config *CfgPtr = NULL; + int Index; + + for (Index=0; Index < XPAR_SCUGIC_NUM_INSTANCES; Index++) { + if (XScuGic_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XScuGic_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/Makefile new file mode 100755 index 000000000..f50acb48d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner scutimer_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling scutimer" + +scutimer_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: scutimer_includes + +scutimer_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer.c new file mode 100755 index 000000000..c3b4b72eb --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer.c @@ -0,0 +1,289 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +/****************************************************************************/ +/** +* +* @file xscutimer.c +* +* Contains the implementation of interface functions of the SCU Timer driver. +* See xscutimer.h for a description of the driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a nm 03/10/10 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscutimer.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/****************************************************************************/ +/** +* +* Initialize a specific timer instance/driver. This function must be called +* before other functions of the driver are called. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* @param ConfigPtr points to the XScuTimer configuration structure. +* @param EffectiveAddress is the base address for the device. It could be +* a virtual address if address translation is supported in the +* system, otherwise it is the physical address. +* +* @return +* - XST_SUCCESS if initialization was successful. +* - XST_DEVICE_IS_STARTED if the device has already been started. +* +* @note None. +* +******************************************************************************/ +int XScuTimer_CfgInitialize(XScuTimer *InstancePtr, + XScuTimer_Config *ConfigPtr, u32 EffectiveAddress) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + /* + * If the device is started, disallow the initialize and return a + * status indicating it is started. This allows the user to stop the + * device and reinitialize, but prevents a user from inadvertently + * initializing. + */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return XST_DEVICE_IS_STARTED; + } + + /* + * Copy configuration into the instance structure. + */ + InstancePtr->Config.DeviceId = ConfigPtr->DeviceId; + + /* + * Save the base address pointer such that the registers of the block + * can be accessed and indicate it has not been started yet. + */ + InstancePtr->Config.BaseAddr = EffectiveAddress; + + InstancePtr->IsStarted = 0; + + /* + * Indicate the instance is ready to use, successfully initialized. + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* Start the timer. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XScuTimer_Start(XScuTimer *InstancePtr) +{ + u32 Register; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the contents of the Control register. + */ + Register = XScuTimer_ReadReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET); + + /* + * Set the 'timer enable' bit in the register. + */ + Register |= XSCUTIMER_CONTROL_ENABLE_MASK; + + /* + * Update the Control register with the new value. + */ + XScuTimer_WriteReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET, Register); + + /* + * Indicate that the device is started. + */ + InstancePtr->IsStarted = XIL_COMPONENT_IS_STARTED; +} + +/****************************************************************************/ +/** +* +* Stop the timer. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XScuTimer_Stop(XScuTimer *InstancePtr) +{ + u32 Register; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the contents of the Control register. + */ + Register = XScuTimer_ReadReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET); + + /* + * Clear the 'timer enable' bit in the register. + */ + Register &= ~XSCUTIMER_CONTROL_ENABLE_MASK; + + /* + * Update the Control register with the new value. + */ + XScuTimer_WriteReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET, Register); + + /* + * Indicate that the device is stopped. + */ + InstancePtr->IsStarted = 0; +} + +/*****************************************************************************/ +/** +* +* This function sets the prescaler bits in the timer control register. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* @param PrescalerValue is a 8 bit value that sets the prescaler to use. +* +* @return None +* +* @note None +* +****************************************************************************/ +void XScuTimer_SetPrescaler(XScuTimer *InstancePtr, u8 PrescalerValue) +{ + u32 ControlReg; + + /* + * Assert to validate input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + /* + * Read the Timer control register. + */ + ControlReg = XScuTimer_ReadReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET); + + /* + * Clear all of the prescaler control bits in the register. + */ + ControlReg &= ~XSCUTIMER_CONTROL_PRESCALER_MASK; + + /* + * Set the prescaler value. + */ + ControlReg |= (PrescalerValue << XSCUTIMER_CONTROL_PRESCALER_SHIFT); + + /* + * Write the register with the new values. + */ + XScuTimer_WriteReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET, ControlReg); +} + +/*****************************************************************************/ +/** +* +* This function returns the current prescaler value. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return The prescaler value. +* +* @note None. +* +****************************************************************************/ +u8 XScuTimer_GetPrescaler(XScuTimer *InstancePtr) +{ + u32 ControlReg; + + /* + * Assert to validate input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Timer control register. + */ + ControlReg = XScuTimer_ReadReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET); + ControlReg &= XSCUTIMER_CONTROL_PRESCALER_MASK; + + return (ControlReg >> XSCUTIMER_CONTROL_PRESCALER_SHIFT); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer.h new file mode 100755 index 000000000..464cf22a1 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer.h @@ -0,0 +1,365 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer.h +* +* The timer driver supports the Cortex A9 private timer. +* +* The timer driver supports the following features: +* - Normal mode and Auto reload mode +* - Interrupts (Interrupt handler is not provided in this driver. Application +* has to register it's own handler) +* +* <b> Initialization and Configuration </b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate with the Timer. +* +* XScuTimer_CfgInitialize() API is used to initialize the Timer. The +* user needs to first call the XScuTimer_LookupConfig() API which returns +* the Configuration structure pointer which is passed as a parameter to +* the XScuTimer_CfgInitialize() API. +* +* <b> Interrupts </b> +* +* The Timer hardware supports interrupts. +* +* This driver does not provide a Interrupt Service Routine (ISR) for the device. +* It is the responsibility of the application to provide one if needed. Refer to +* the interrupt example provided with this driver for details on using the +* Timer in interrupt mode. +* +* <b> Virtual Memory </b> +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* <b> Threads </b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* <b> Asserts </b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* <b> Building the driver </b> +* +* The XScuTimer driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* +* <br><br> +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a nm 03/10/10 First release +* 1.02a sg 07/17/12 Included xil_assert.h for CR 667947. This is an issue +* when the xstatus.h in the common driver overwrites +* the xstatus.h of the standalone BSP during the +* libgen. +* </pre> +* +******************************************************************************/ +#ifndef XSCUTIMER_H /* prevent circular inclusions */ +#define XSCUTIMER_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xscutimer_hw.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Base address of the device */ +} XScuTimer_Config; + +/** + * The XScuTimer driver instance data. The user is required to allocate a + * variable of this type for every timer device in the system. + * A pointer to a variable of this type is then passed to the driver API + * functions. + */ +typedef struct { + XScuTimer_Config Config; /**< Hardware Configuration */ + u32 IsReady; /**< Device is initialized and ready */ + u32 IsStarted; /**< Device timer is running */ +} XScuTimer; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Check if the timer has expired. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return +* - TRUE if the timer has expired. +* - FALSE if the timer has not expired. +* +* @note C-style signature: +* int XScuTimer_IsExpired(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_IsExpired(InstancePtr) \ + ((XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_ISR_OFFSET) & \ + XSCUTIMER_ISR_EVENT_FLAG_MASK) == \ + XSCUTIMER_ISR_EVENT_FLAG_MASK) + +/****************************************************************************/ +/** +* +* Re-start the timer. This macro will read the timer load register +* and writes the same value to load register to update the counter register. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_RestartTimer(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_RestartTimer(InstancePtr) \ + XScuTimer_LoadTimer(InstancePtr, \ + XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_LOAD_OFFSET)) + +/****************************************************************************/ +/** +* +* Write to the timer load register. This will also update the +* timer counter register with the new value. This macro can be used to +* change the time-out value. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* @param Value is the count to be loaded in to the load register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_LoadTimer(XScuTimer *InstancePtr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_LoadTimer(InstancePtr, Value) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_LOAD_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer counter register value. It can be called at any +* time. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return Contents of the timer counter register. +* +* @note C-style signature: + u32 XScuTimer_GetCounterValue(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_GetCounterValue(InstancePtr) \ + XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_COUNTER_OFFSET) + +/****************************************************************************/ +/** +* +* Enable auto-reload mode. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_EnableAutoReload(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_EnableAutoReload(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET, \ + (XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET) | \ + XSCUTIMER_CONTROL_AUTO_RELOAD_MASK)) + +/****************************************************************************/ +/** +* +* Disable auto-reload mode. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_DisableAutoReload(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_DisableAutoReload(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET, \ + (XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET) & \ + ~(XSCUTIMER_CONTROL_AUTO_RELOAD_MASK))) + +/****************************************************************************/ +/** +* +* Enable the Timer interrupt. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_EnableInterrupt(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_EnableInterrupt(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET, \ + (XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET) | \ + XSCUTIMER_CONTROL_IRQ_ENABLE_MASK)) + +/****************************************************************************/ +/** +* +* Disable the Timer interrupt. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_DisableInterrupt(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_DisableInterrupt(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET, \ + (XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_CONTROL_OFFSET) & \ + ~(XSCUTIMER_CONTROL_IRQ_ENABLE_MASK))) + +/*****************************************************************************/ +/** +* +* This function reads the interrupt status. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_GetInterruptStatus(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_GetInterruptStatus(InstancePtr) \ + XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_ISR_OFFSET) + +/*****************************************************************************/ +/** +* +* This function clears the interrupt status. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_ClearInterruptStatus(XScuTimer *InstancePtr) +* +******************************************************************************/ +#define XScuTimer_ClearInterruptStatus(InstancePtr) \ + XScuTimer_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUTIMER_ISR_OFFSET, XSCUTIMER_ISR_EVENT_FLAG_MASK) + +/************************** Function Prototypes ******************************/ + +/* + * Lookup configuration in xscutimer_sinit.c + */ +XScuTimer_Config *XScuTimer_LookupConfig(u16 DeviceId); + +/* + * Selftest function in xscutimer_selftest.c + */ +int XScuTimer_SelfTest(XScuTimer *InstancePtr); + +/* + * Interface functions in xscutimer.c + */ +int XScuTimer_CfgInitialize(XScuTimer *InstancePtr, + XScuTimer_Config *ConfigPtr, u32 EffectiveAddress); +void XScuTimer_Start(XScuTimer *InstancePtr); +void XScuTimer_Stop(XScuTimer *InstancePtr); +void XScuTimer_SetPrescaler(XScuTimer *InstancePtr, u8 PrescalerValue); +u8 XScuTimer_GetPrescaler(XScuTimer *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_g.c new file mode 100644 index 000000000..e03cf4631 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_g.c @@ -0,0 +1,30 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xscutimer.h" + +/* +* The configuration table for devices +*/ + +XScuTimer_Config XScuTimer_ConfigTable[] = +{ + { + XPAR_PS7_SCUTIMER_0_DEVICE_ID, + XPAR_PS7_SCUTIMER_0_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_hw.h new file mode 100755 index 000000000..d18cf6366 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_hw.h @@ -0,0 +1,292 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer_hw.h +* +* This file contains the hardware interface to the Timer. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a nm 03/10/10 First release +* 1.01a sdm 02/02/12 Added low level macros to read/write load, counter, control +* and interrupt registers +* 1.02a sg 07/17/12 Included xil_assert.h for CR 667947. This is an issue +* when the xstatus.h in the common driver overwrites +* the xstatus.h of the standalone BSP during the +* libgen. +* </pre> +* +******************************************************************************/ +#ifndef XSCUTIMER_HW_H /* prevent circular inclusions */ +#define XSCUTIMER_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xil_types.h" +#include "xil_io.h" +#include "xil_assert.h" +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * Offsets of registers from the start of the device + * @{ + */ + +#define XSCUTIMER_LOAD_OFFSET 0x00 /**< Timer Load Register */ +#define XSCUTIMER_COUNTER_OFFSET 0x04 /**< Timer Counter Register */ +#define XSCUTIMER_CONTROL_OFFSET 0x08 /**< Timer Control Register */ +#define XSCUTIMER_ISR_OFFSET 0x0C /**< Timer Interrupt + Status Register */ +/* @} */ + +/** @name Timer Control register + * This register bits control the prescaler, Intr enable, + * auto-reload and timer enable. + * @{ + */ + +#define XSCUTIMER_CONTROL_PRESCALER_MASK 0x0000FF00 /**< Prescaler */ +#define XSCUTIMER_CONTROL_PRESCALER_SHIFT 8 +#define XSCUTIMER_CONTROL_IRQ_ENABLE_MASK 0x00000004 /**< Intr enable */ +#define XSCUTIMER_CONTROL_AUTO_RELOAD_MASK 0x00000002 /**< Auto-reload */ +#define XSCUTIMER_CONTROL_ENABLE_MASK 0x00000001 /**< Timer enable */ +/* @} */ + +/** @name Interrupt Status register + * This register indicates the Timer counter register has reached zero. + * @{ + */ + +#define XSCUTIMER_ISR_EVENT_FLAG_MASK 0x00000001 /**< Event flag */ +/*@}*/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Write to the timer load register. This will also update the +* timer counter register with the new value. This macro can be used to +* change the time-out value. +* +* @param BaseAddr is the base address of the scu timer. +* @param Value is the count to be loaded in to the load register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_SetLoadReg(u32 BaseAddr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_SetLoadReg(BaseAddr, Value) \ + XScuTimer_WriteReg(BaseAddr, XSCUTIMER_LOAD_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer load register value. +* +* @param BaseAddr is the base address of the scu timer. +* +* @return Contents of the timer load register. +* +* @note C-style signature: +* u32 XScuTimer_GetLoadReg(u32 BaseAddr) +* +******************************************************************************/ +#define XScuTimer_GetLoadReg(BaseAddr) \ + XScuTimer_ReadReg(BaseAddr, XSCUTIMER_LOAD_OFFSET) + +/****************************************************************************/ +/** +* +* Write to the timer counter register. +* +* @param BaseAddr is the base address of the scu timer. +* @param Value is the count to be loaded in to the counter register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_SetCounterReg(u32 BaseAddr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_SetCounterReg(BaseAddr, Value) \ + XScuTimer_WriteReg(BaseAddr, XSCUTIMER_COUNTER_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer counter register value. +* +* @param BaseAddr is the base address of the scu timer. +* +* @return Contents of the timer counter register. +* +* @note C-style signature: + u32 XScuTimer_GetCounterReg(u32 BaseAddr) +* +******************************************************************************/ +#define XScuTimer_GetCounterReg(BaseAddr) \ + XScuTimer_ReadReg(BaseAddr, XSCUTIMER_COUNTER_OFFSET) + +/****************************************************************************/ +/** +* +* Write to the timer load register. This will also update the +* timer counter register with the new value. This macro can be used to +* change the time-out value. +* +* @param BaseAddr is the base address of the scu timer. +* @param Value is the count to be loaded in to the load register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_SetControlReg(u32 BaseAddr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_SetControlReg(BaseAddr, Value) \ + XScuTimer_WriteReg(BaseAddr, XSCUTIMER_CONTROL_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer load register value. +* +* @param BaseAddr is the base address of the scu timer. +* +* @return Contents of the timer load register. +* +* @note C-style signature: + u32 XScuTimer_GetControlReg(u32 BaseAddr) +* +******************************************************************************/ +#define XScuTimer_GetControlReg(BaseAddr) \ + XScuTimer_ReadReg(BaseAddr, XSCUTIMER_CONTROL_OFFSET) + +/****************************************************************************/ +/** +* +* Write to the timer counter register. +* +* @param BaseAddr is the base address of the scu timer. +* @param Value is the count to be loaded in to the counter register. +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_SetIntrReg(u32 BaseAddr, u32 Value) +* +******************************************************************************/ +#define XScuTimer_SetIntrReg(BaseAddr, Value) \ + XScuTimer_WriteReg(BaseAddr, XSCUTIMER_ISR_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Returns the current timer counter register value. +* +* @param BaseAddr is the base address of the scu timer. +* +* @return Contents of the timer counter register. +* +* @note C-style signature: + u32 XScuTimer_GetIntrReg(u32 BaseAddr) +* +******************************************************************************/ +#define XScuTimer_GetIntrReg(BaseAddr) \ + XScuTimer_ReadReg(BaseAddr, XSCUTIMER_ISR_OFFSET) + +/****************************************************************************/ +/** +* +* Read from the given Timer register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note C-style signature: +* u32 XScuTimer_ReadReg(u32 BaseAddr, u32 RegOffset) +* +*****************************************************************************/ +#define XScuTimer_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (RegOffset)) + +/****************************************************************************/ +/** +* +* Write to the given Timer register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note C-style signature: +* void XScuTimer_WriteReg(u32 BaseAddr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuTimer_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (RegOffset), (Data)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_selftest.c new file mode 100755 index 000000000..8aedc2295 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_selftest.c @@ -0,0 +1,140 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscutimer_selftest.c +* +* Contains diagnostic self-test functions for the XScuTimer driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a nm 03/10/10 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscutimer.h" + +/************************** Constant Definitions *****************************/ + +#define XSCUTIMER_SELFTEST_VALUE 0xA55AF00F + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/****************************************************************************/ +/** +* +* Run a self-test on the timer. This test clears the timer enable bit in +* the control register, writes to the timer load register and verifies the +* value read back matches the value written and restores the control register +* and the timer load register. +* +* @param InstancePtr is a pointer to the XScuTimer instance. +* +* @return +* - XST_SUCCESS if self-test was successful. +* - XST_FAILURE if self test was not successful. +* +* @note None. +* +******************************************************************************/ +int XScuTimer_SelfTest(XScuTimer *InstancePtr) +{ + u32 Register; + u32 CtrlOrig; + u32 LoadOrig; + + /* + * Assert to ensure the inputs are valid and the instance has been + * initialized. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Save the contents of the Control Register and stop the timer. + */ + CtrlOrig = XScuTimer_ReadReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET); + Register = CtrlOrig & ~XSCUTIMER_CONTROL_ENABLE_MASK; + XScuTimer_WriteReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET, Register); + + /* + * Save the contents of the Load Register. + * Load a new test value in the Load Register, read it back and + * compare it with the written value. + */ + LoadOrig = XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, + XSCUTIMER_LOAD_OFFSET); + XScuTimer_LoadTimer(InstancePtr, XSCUTIMER_SELFTEST_VALUE); + Register = XScuTimer_ReadReg((InstancePtr)->Config.BaseAddr, + XSCUTIMER_LOAD_OFFSET); + + /* + * Restore the contents of the Load Register and Control Register. + */ + XScuTimer_LoadTimer(InstancePtr, LoadOrig); + XScuTimer_WriteReg(InstancePtr->Config.BaseAddr, + XSCUTIMER_CONTROL_OFFSET, CtrlOrig); + + /* + * Return a Failure if the contents of the Load Register do not + * match with the value written to it. + */ + if (Register != XSCUTIMER_SELFTEST_VALUE) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_sinit.c new file mode 100755 index 000000000..65652897e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scutimer_v1_02_a/src/xscutimer_sinit.c @@ -0,0 +1,99 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscutimer_sinit.c +* +* This file contains method for static initialization (compile-time) of the +* driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a nm 03/10/10 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscutimer.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* Lookup the device configuration based on the unique device ID. The table +* contains the configuration info for each device in the system. +* +* @param DeviceId is the unique device ID of the device being looked up. +* +* @return A pointer to the configuration table entry corresponding to the +* given device ID, or NULL if no match is found. +* +* @note None. +* +******************************************************************************/ +XScuTimer_Config *XScuTimer_LookupConfig(u16 DeviceId) +{ + extern XScuTimer_Config XScuTimer_ConfigTable[]; + XScuTimer_Config *CfgPtr = NULL; + int Index; + + for (Index = 0; Index < XPAR_XSCUTIMER_NUM_INSTANCES; Index++) { + if (XScuTimer_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XScuTimer_ConfigTable[Index]; + break; + } + } + + return (CfgPtr); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/Makefile new file mode 100755 index 000000000..2c783d4a7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner scuwdt_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling scuwdt" + +scuwdt_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: scuwdt_includes + +scuwdt_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt.c new file mode 100755 index 000000000..f561d8d7f --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt.c @@ -0,0 +1,219 @@ +/* $Id: xscuwdt.c,v 1.1.2.1 2011/01/20 04:04:40 sadanan Exp $ */ +/****************************************************************************** +* +* (c) Copyright 2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt.c +* +* Contains the implementation of interface functions of the XScuWdt driver. +* See xscuwdt.h for a description of the driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a sdm 01/15/10 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscuwdt.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/****************************************************************************/ +/** +* +* Initialize a specific watchdog timer instance/driver. This function +* must be called before other functions of the driver are called. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* @param ConfigPtr is the config structure. +* @param EffectiveAddress is the base address for the device. It could be +* a virtual address if address translation is supported in the +* system, otherwise it is the physical address. +* +* @return +* - XST_SUCCESS if initialization was successful. +* - XST_DEVICE_IS_STARTED if the device has already been started. +* +* @note This function enables the watchdog mode. +* +******************************************************************************/ +int XScuWdt_CfgInitialize(XScuWdt *InstancePtr, + XScuWdt_Config *ConfigPtr, u32 EffectiveAddress) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + /* + * If the device is started, disallow the initialize and return a + * status indicating it is started. This allows the user to stop the + * device and reinitialize, but prevents a user from inadvertently + * initializing. + */ + if (InstancePtr->IsStarted == XIL_COMPONENT_IS_STARTED) { + return XST_DEVICE_IS_STARTED; + } + + /* + * Copy configuration into instance. + */ + InstancePtr->Config.DeviceId = ConfigPtr->DeviceId; + + /* + * Save the base address pointer such that the registers of the block + * can be accessed and indicate it has not been started yet. + */ + InstancePtr->Config.BaseAddr = EffectiveAddress; + InstancePtr->IsStarted = 0; + + /* + * Put the watchdog timer in Watchdog mode. + */ + XScuWdt_SetWdMode(InstancePtr); + + /* + * Indicate the instance is ready to use, successfully initialized. + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* Start the watchdog counter of the device. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note User needs to select the appropriate mode (watchdog/timer) +* before using this API. +* See XScuWdt_SetWdMode/XScuWdt_SetTimerMode macros in +* xscuwdt.h. +* +******************************************************************************/ +void XScuWdt_Start(XScuWdt *InstancePtr) +{ + u32 Register; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the contents of the Control register. + */ + Register = XScuWdt_ReadReg(InstancePtr->Config.BaseAddr, + XSCUWDT_CONTROL_OFFSET); + + /* + * Set the 'watchdog enable' bit in the register. + */ + Register |= XSCUWDT_CONTROL_WD_ENABLE_MASK; + + /* + * Update the Control register with the new value. + */ + XScuWdt_WriteReg(InstancePtr->Config.BaseAddr, + XSCUWDT_CONTROL_OFFSET, Register); + + /* + * Indicate that the device is started. + */ + InstancePtr->IsStarted = XIL_COMPONENT_IS_STARTED; +} + +/****************************************************************************/ +/** +* +* Stop the watchdog timer. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XScuWdt_Stop(XScuWdt *InstancePtr) +{ + u32 Register; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the contents of the Control register. + */ + Register = XScuWdt_ReadReg(InstancePtr->Config.BaseAddr, + XSCUWDT_CONTROL_OFFSET); + + /* + * Clear the 'watchdog enable' bit in the register. + */ + Register &= ~XSCUWDT_CONTROL_WD_ENABLE_MASK; + + /* + * Update the Control register with the new value. + */ + XScuWdt_WriteReg(InstancePtr->Config.BaseAddr, + XSCUWDT_CONTROL_OFFSET, Register); + + /* + * Indicate that the device is stopped. + */ + InstancePtr->IsStarted = 0; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt.h new file mode 100755 index 000000000..39ecd7d18 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt.h @@ -0,0 +1,384 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt.h +* +* The Xilinx SCU watchdog timer driver (XScuWdt) supports the Xilinx SCU private +* watchdog timer hardware. +* +* The XScuWdt driver supports the following features: +* - Watchdog mode +* - Timer mode +* - Auto reload (timer mode only) +* +* The watchdog counter register is a down counter and starts decrementing when +* the watchdog is started. +* In watchdog mode, when the counter reaches 0, the Reset flag is set in the +* Reset status register and the WDRESETREQ pin is asserted, causing a system +* reset. The Reset flag is not reset by normal processor reset and is cleared +* when written with a value of 1. This enables the user to differentiate a +* normal reset and a reset caused by watchdog time-out. The user needs to call +* XScuWdt_RestartWdt() periodically, to avoid the watchdog from being timed-out. +* +* The IsWdtExpired function can be used to check if the watchdog was the cause +* of the last reset. In this situation, call Initialize then call IsWdtExpired. +* If the result is true, watchdog timeout caused the last system reset. The +* application then needs to clear the Reset flag. +* +* In timer mode, when the counter reaches 0, the Event flag is set in the +* Interrupt status register and if interrupts are enabled, interrupt ID 30 is +* set as pending in the interrupt distributor. The IsTimerExpired function +* is used to check if the watchdog counter has decremented to 0 in timer mode. +* If auto-reload mode is enabled, the Counter register is automatically reloaded +* from the Load register. +* +* <b> Initialization and Configuration </b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate with the Watchdog Timer. +* +* XScuWdt_CfgInitialize() API is used to initialize the Watchdog Timer. The +* user needs to first call the XScuWdt_LookupConfig() API which returns +* the Configuration structure pointer which is passed as a parameter to +* the XScuWdt_CfgInitialize() API. +* +* <b>Interrupts</b> +* +* The SCU Watchdog Timer supports interrupts in Timer mode. +* +* This driver does not provide a Interrupt Service Routine (ISR) for the device. +* It is the responsibility of the application to provide one if needed. Refer to +* the interrupt example provided with this driver for details on using the +* Timer in interrupt mode. +* +* <b> Virtual Memory </b> +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* <b> Threads </b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* <b> Asserts </b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* <b> Building the driver </b> +* +* The XScuWdt driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* +* <br><br> +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a sdm 01/15/10 First release +* 1.02a sg 07/17/12 Included xil_assert.h for CR 667947. This is an issue +* when the xstatus.h in the common driver overwrites +* the xstatus.h of the standalone BSP during the +* libgen. +* </pre> +* +******************************************************************************/ +#ifndef XSCUWDT_H /* prevent circular inclusions */ +#define XSCUWDT_H /* by using protection macros */ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xscuwdt_hw.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddr; /**< Base address of the device */ +} XScuWdt_Config; + +/** + * The XScuWdt driver instance data. The user is required to allocate a + * variable of this type for every watchdog/timer device in the system. + * A pointer to a variable of this type is then passed to the driver API + * functions. + */ +typedef struct { + XScuWdt_Config Config;/**< Hardware Configuration */ + u32 IsReady; /**< Device is initialized and ready */ + u32 IsStarted; /**< Device watchdog timer is running */ +} XScuWdt; + +/***************** Macros (Inline Functions) Definitions *********************/ +/****************************************************************************/ +/** +* +* This function is used to check if the watchdog has timed-out and the last +* reset was caused by the watchdog reset. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return +* - TRUE if the watchdog has expired. +* - FALSE if the watchdog has not expired. +* +* @note C-style signature: +* int XScuWdt_IsWdtExpired(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_IsWdtExpired(InstancePtr) \ + ((XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_RST_STS_OFFSET) & \ + XSCUWDT_RST_STS_RESET_FLAG_MASK) == XSCUWDT_RST_STS_RESET_FLAG_MASK) + +/****************************************************************************/ +/** +* +* This function is used to check if the watchdog counter has reached 0 in timer +* mode. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return +* - TRUE if the watchdog has expired. +* - FALSE if the watchdog has not expired. +* +* @note C-style signature: +* int XScuWdt_IsTimerExpired(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_IsTimerExpired(InstancePtr) \ + ((XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_ISR_OFFSET) & \ + XSCUWDT_ISR_EVENT_FLAG_MASK) == XSCUWDT_ISR_EVENT_FLAG_MASK) + +/****************************************************************************/ +/** +* +* Re-start the watchdog timer. This macro will read the watchdog load register +* and write the same value to load register to update the counter register. +* An application needs to call this function periodically to keep the watchdog +* from asserting the WDRESETREQ reset request output pin. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_RestartWdt(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_RestartWdt(InstancePtr) \ + XScuWdt_LoadWdt(InstancePtr, \ + (XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_LOAD_OFFSET))) + +/****************************************************************************/ +/** +* +* Write to the watchdog timer load register. This will also update the +* watchdog counter register with the new value. This macro can be used to +* change the time-out value. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* @param Value is the value to be written to the Watchdog Load register. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_LoadWdt(XScuWdt *InstancePtr, u32 Value) +* +******************************************************************************/ +#define XScuWdt_LoadWdt(InstancePtr, Value) \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_LOAD_OFFSET, Value) + +/****************************************************************************/ +/** +* +* Put the watchdog timer in Watchdog mode by setting the WD mode bit of the +* Watchdog control register. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_SetWdMode(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_SetWdMode(InstancePtr) \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_CONTROL_OFFSET, \ + (XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_CONTROL_OFFSET) | \ + XSCUWDT_CONTROL_WD_MODE_MASK)) + +/****************************************************************************/ +/** +* +* Put the watchdog timer in Timer mode by writing 0x12345678 and 0x87654321 +* successively to the Watchdog Disable Register. +* The software must write 0x12345678 and 0x87654321 successively to the +* Watchdog Disable Register so that the watchdog mode bit in the Watchdog +* Control Register is set to zero. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_SetTimerMode(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_SetTimerMode(InstancePtr) \ +{ \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_DISABLE_OFFSET, \ + XSCUWDT_DISABLE_VALUE1); \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_DISABLE_OFFSET, \ + XSCUWDT_DISABLE_VALUE2); \ +} + +/****************************************************************************/ +/** +* +* Get the contents of the watchdog control register. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return Contents of the watchdog control register. +* +* @note C-style signature: + u32 XScuWdt_GetControlReg(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_GetControlReg(InstancePtr) \ + XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_CONTROL_OFFSET) + +/****************************************************************************/ +/** +* +* Write to the watchdog control register. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* @param ControlReg is the value to be written to the watchdog control +* register. +* +* @return None. +* +* @note C-style signature: + void XScuWdt_SetControlReg(XScuWdt *InstancePtr, u32 ControlReg) +* +******************************************************************************/ +#define XScuWdt_SetControlReg(InstancePtr, ControlReg) \ + XScuWdt_WriteReg((InstancePtr)->Config.BaseAddr, \ + XSCUWDT_CONTROL_OFFSET, ControlReg) + +/****************************************************************************/ +/** +* +* Enable auto-reload mode. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_EnableAutoReload(XScuWdt *InstancePtr) +* +******************************************************************************/ +#define XScuWdt_EnableAutoReload(InstancePtr) \ + XScuWdt_SetControlReg((InstancePtr), \ + (XScuWdt_GetControlReg(InstancePtr) | \ + XSCUWDT_CONTROL_AUTO_RELOAD_MASK)) + +/************************** Function Prototypes ******************************/ + +/* + * Lookup configuration in xscuwdt_sinit.c. + */ +XScuWdt_Config *XScuWdt_LookupConfig(u16 DeviceId); + +/* + * Selftest function in xscuwdt_selftest.c + */ +int XScuWdt_SelfTest(XScuWdt *InstancePtr); + +/* + * Interface functions in xscuwdt.c + */ +int XScuWdt_CfgInitialize(XScuWdt *InstancePtr, + XScuWdt_Config *ConfigPtr, u32 EffectiveAddress); + +void XScuWdt_Start(XScuWdt *InstancePtr); + +void XScuWdt_Stop(XScuWdt *InstancePtr); + +/* + * Self-test function in xwdttb_selftest.c. + */ +int XScuWdt_SelfTest(XScuWdt *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_g.c new file mode 100644 index 000000000..ed1ead33b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_g.c @@ -0,0 +1,30 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xscuwdt.h" + +/* +* The configuration table for devices +*/ + +XScuWdt_Config XScuWdt_ConfigTable[] = +{ + { + XPAR_PS7_SCUWDT_0_DEVICE_ID, + XPAR_PS7_SCUWDT_0_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_hw.h new file mode 100755 index 000000000..9bf23046d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_hw.h @@ -0,0 +1,187 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt_hw.h +* +* This file contains the hardware interface to the Xilinx SCU private Watch Dog +* Timer (XSCUWDT). +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a sdm 01/15/10 First release +* 1.01a bss 02/27/12 Updated the register offsets to start at 0x0 instead +* of 0x20 as the base address obtained from the tools +* starts at 0x20. +* 1.02a sg 07/17/12 Included xil_assert.h for CR 667947. This is an issue +* when the xstatus.h in the common driver overwrites +* the xstatus.h of the standalone BSP during the +* libgen. +* </pre> +* +******************************************************************************/ +#ifndef XSCUWDT_HW_H /* prevent circular inclusions */ +#define XSCUWDT_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_io.h" +#include "xil_assert.h" +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * Offsets of registers from the start of the device. The WDT registers start at + * an offset 0x20 + * @{ + */ + +#define XSCUWDT_LOAD_OFFSET 0x00 /**< Watchdog Load Register */ +#define XSCUWDT_COUNTER_OFFSET 0x04 /**< Watchdog Counter Register */ +#define XSCUWDT_CONTROL_OFFSET 0x08 /**< Watchdog Control Register */ +#define XSCUWDT_ISR_OFFSET 0x0C /**< Watchdog Interrupt Status Register */ +#define XSCUWDT_RST_STS_OFFSET 0x10 /**< Watchdog Reset Status Register */ +#define XSCUWDT_DISABLE_OFFSET 0x14 /**< Watchdog Disable Register */ +/* @} */ + +/** @name Watchdog Control register + * This register bits control the prescaler, WD/Timer mode, Intr enable, + * auto-reload, watchdog enable. + * @{ + */ + +#define XSCUWDT_CONTROL_PRESCALER_MASK 0x0000FF00 /**< Prescaler */ +#define XSCUWDT_CONTROL_PRESCALER_SHIFT 8 +#define XSCUWDT_CONTROL_WD_MODE_MASK 0x00000008 /**< Watchdog/Timer mode */ +#define XSCUWDT_CONTROL_IT_ENABLE_MASK 0x00000004 /**< Intr enable (in + timer mode) */ +#define XSCUWDT_CONTROL_AUTO_RELOAD_MASK 0x00000002 /**< Auto-reload (in + timer mode) */ +#define XSCUWDT_CONTROL_WD_ENABLE_MASK 0x00000001 /**< Watchdog enable */ +/* @} */ + +/** @name Interrupt Status register + * This register indicates the Counter register has reached zero in Counter + * mode. + * @{ + */ + +#define XSCUWDT_ISR_EVENT_FLAG_MASK 0x00000001 /**< Event flag */ +/*@}*/ + +/** @name Reset Status register + * This register indicates the Counter register has reached zero in Watchdog + * mode and a reset request is sent. + * @{ + */ + +#define XSCUWDT_RST_STS_RESET_FLAG_MASK 0x00000001 /**< Time out occured */ +/*@}*/ + +/** @name Disable register + * This register is used to switch from watchdog mode to timer mode. + * The software must write 0x12345678 and 0x87654321 successively to the + * Watchdog Disable Register so that the watchdog mode bit in the Watchdog + * Control Register is set to zero. + * @{ + */ +#define XSCUWDT_DISABLE_VALUE1 0x12345678 /**< Watchdog mode disable + value 1 */ +#define XSCUWDT_DISABLE_VALUE2 0x87654321 /**< Watchdog mode disable + value 2 */ +/*@}*/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* Read the given register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be read +* +* @return The 32-bit value of the register +* +* @note C-style signature: +* u32 XScuWdt_ReadReg(u32 BaseAddr, u32 RegOffset) +* +*****************************************************************************/ +#define XScuWdt_ReadReg(BaseAddr, RegOffset) \ + Xil_In32((BaseAddr) + (RegOffset)) + +/****************************************************************************/ +/** +* +* Write the given register. +* +* @param BaseAddr is the base address of the device +* @param RegOffset is the register offset to be written +* @param Data is the 32-bit value to write to the register +* +* @return None. +* +* @note C-style signature: +* void XScuWdt_WriteReg(u32 BaseAddr, u32 RegOffset, u32 Data) +* +*****************************************************************************/ +#define XScuWdt_WriteReg(BaseAddr, RegOffset, Data) \ + Xil_Out32((BaseAddr) + (RegOffset), (Data)) + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_selftest.c new file mode 100755 index 000000000..8afd5a975 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_selftest.c @@ -0,0 +1,132 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xscuwdt_selftest.c +* +* Contains diagnostic self-test functions for the XScuWdt driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a sdm 01/15/10 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscuwdt.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + +/****************************************************************************/ +/** +* +* Run a self-test on the WDT. This test stops the watchdog, writes a value to +* the watchdog load register, starts the watchdog and verifies that the value +* read from the counter register is less that the value written to the load +* register. It then restores the control register and the watchdog load +* register. +* +* @param InstancePtr is a pointer to the XScuWdt instance. +* +* @return +* - XST_SUCCESS if self-test was successful. +* - XST_FAILURE if the WDT is not decrementing. +* +* @note None. +* +******************************************************************************/ +int XScuWdt_SelfTest(XScuWdt *InstancePtr) +{ + u32 Register; + u32 CtrlOrig; + u32 LoadOrig; + + /* + * Assert to ensure the inputs are valid and the instance has been + * initialized. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Stop the watchdog timer. + */ + CtrlOrig = XScuWdt_GetControlReg(InstancePtr); + XScuWdt_SetControlReg(InstancePtr, + CtrlOrig & ~XSCUWDT_CONTROL_WD_ENABLE_MASK); + + LoadOrig = XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, + XSCUWDT_LOAD_OFFSET); + XScuWdt_LoadWdt(InstancePtr, 0xFFFFFFFF); + + /* + * Start the watchdog timer and check if the watchdog counter is + * decrementing. + */ + XScuWdt_SetControlReg(InstancePtr, + CtrlOrig | XSCUWDT_CONTROL_WD_ENABLE_MASK); + + Register = XScuWdt_ReadReg((InstancePtr)->Config.BaseAddr, + XSCUWDT_COUNTER_OFFSET); + + XScuWdt_LoadWdt(InstancePtr, LoadOrig); + XScuWdt_SetControlReg(InstancePtr, CtrlOrig); + + if (Register == 0xFFFFFFFF) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_sinit.c new file mode 100755 index 000000000..c286994cd --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/scuwdt_v1_02_a/src/xscuwdt_sinit.c @@ -0,0 +1,99 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xscuwdt_sinit.c +* +* This file contains method for static initialization (compile-time) of the +* driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- --- -------- --------------------------------------------- +* 1.00a sdm 01/15/10 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xscuwdt.h" +#include "xparameters.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* Lookup the device configuration based on the unique device ID. The table +* contains the configuration info for each device in the system. +* +* @param DeviceId is the unique device ID of the device being looked up. +* +* @return A pointer to the configuration table entry corresponding to the +* given device ID, or NULL if no match is found. +* +* @note None. +* +******************************************************************************/ +XScuWdt_Config *XScuWdt_LookupConfig(u16 DeviceId) +{ + extern XScuWdt_Config XScuWdt_ConfigTable[]; + XScuWdt_Config *CfgPtr = NULL; + int Index; + + for (Index = 0; Index < XPAR_XSCUWDT_NUM_INSTANCES; Index++) { + if (XScuWdt_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XScuWdt_ConfigTable[Index]; + break; + } + } + + return (CfgPtr); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/Makefile new file mode 100755 index 000000000..f7bba6f6b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/Makefile @@ -0,0 +1,72 @@ +###################################################################### +# Copyright (c) 2011-13 Xilinx, Inc. All rights reserved. +# +# Xilinx, Inc. +# XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +# COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +# ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +# STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +# IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +# FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +# XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +# THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +# ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +# FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE. +###################################################################### + +include config.make + +AS=arm-xilinx-eabi-as +CC=arm-xilinx-eabi-gcc +AR=arm-xilinx-eabi-ar +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +LIB=libxil.a + +CC_FLAGS = $(subst -pg, -DPROFILING, $(COMPILER_FLAGS)) +ECC_FLAGS = $(subst -pg, -DPROFILING, $(EXTRA_COMPILER_FLAGS)) + +ifeq ($(COMPILER) , arm-eabi-gcc) + ECC_FLAGS = += -nostartfiles +endif + +#The following flags are required for PEEP. We can remove them later +ECC_FLAGS += -march=armv7-a \ + -mfloat-abi=soft \ + -mfpu=neon + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +INCLUDEFILES=*.h + +libs: $(LIBS) + +standalone_libs: $(LIBSOURCES) + echo "Compiling standalone" + $(CC) $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) $^ + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS} + +profile_libs: + $(MAKE) -C profile COMPILER_FLAGS="$(COMPILER_FLAGS)" EXTRA_COMPILER_FLAGS="$(EXTRA_COMPILER_FLAGS)" COMPILER="$(CC)" ARCHIVER="$(ARCHIVER)" AS="$(AS)" libs + +.PHONY: include +include: standalone_includes profile_includes + +standalone_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +profile_includes: + $(MAKE) -C profile COMPILER_FLAGS="$(COMPILER_FLAGS)" EXTRA_COMPILER_FLAGS="$(EXTRA_COMPILER_FLAGS)" COMPILER="$(CC)" ARCHIVER="$(ARCHIVER)" AS="$(AS)" include + +clean: + rm -rf ${OUTS} + $(MAKE) -C profile COMPILER_FLAGS="$(COMPILER_FLAGS)" EXTRA_COMPILER_FLAGS="$(EXTRA_COMPILER_FLAGS)" COMPILER="$(CC)" ARCHIVER="$(ARCHIVER)" AS="$(AS)" clean + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_exit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_exit.c new file mode 100755 index 000000000..20df10bc3 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_exit.c @@ -0,0 +1,50 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <unistd.h> + +/* _exit - Simple implementation. Does not return. +*/ +void _exit (int status) +{ + (void)status; + while (1); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_exit.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_exit.o new file mode 100644 index 0000000000000000000000000000000000000000..b5e8db248929cdd3747b4bd1f5a4c3aef2796a1f GIT binary patch literal 2332 zcma)7OK%%h6ux)Hj@>vhd9<RXfLs)4km9*938XEL;wEWT`Vb@_!2%6;#uH~Gdu--W zIR%7Z!3qgjAjAS8A+ckD5DWeSTO{^u*s!a_u2REy?%eB)!vc<c{GHc5uX%mAee){k zoEhS5nH_12t(TOiysluGEwVZG;PCLTuc2GYR^opGc?Ew$85qmYAb?Mmkj&!Mhv2cS z@;wEWPXTtR97ZX#N|o=)SS|mipz;$zseE5S<<}e@BjD9P044q{Df6mHDr9}Ycp1pJ z)29Dd!Snpd`eMzlpRLdH1wJ>0s3lgby#x~~Yq5%C4!=BO*DuwcubrQv(3hvbx-!F9 zxy*9w^+jtMNgoC4X(8ogh9vE0u*Fnk{C<6wVWZR^n2W(M6>o;UFdB*0y0am!?{2$W zyJCCmhUi9_ka1tYDLk;_K=ee{_sQHGsZ-5BdZEBcXN>~JzvB^M<oB{pAd-WGF*g{6 zspC^`SrjH|$Jx&>Ygvt9JKVC+Ws=G?OUBVzl!V<V=rsI&8MEFX>NdtEx>%w&@MTYA zzKm0GEA->RW_#y#x3$r1T@dePvLo&ucmsDY@p`V848<_naQ#7?1|xaVU8UKQ*cT`o zbtJL}?wvKa)pDhPnI-#(oUEs&zyP`{YC$#i@6M9&Zjc@fgMy!;)g0GuztPxis0HdG z<3uDBM`qVHH!n4ocL!PQ2k}8;bI=K{1d+erxEZEF<C)dgnzQ<BbM4~OI$ztth9zAg z#+M+LH=1oWHC<^}`3Y;GbdsOq58J2t8U6@=+<F4{18y#M2;$6ozdkdobeI&WJIYB8 z`l<AolcaHu`$obZQ|5GJDw*RY33KA0=X3%u>$+jIH-JmY((~frPSGo48Fhn+1Gwb^ za{&37;}81%0PAqtJGUH}rg7+H>ExNcSoQ<c?Ek>Ch@r;-kDnrXhZLV0BcFqv;%pVg z*aeLS$VYS@jED9=<5m%4&OlW8z9B)A@vT5VVT`~nB>xdO52oITsoo1<a|R;&9sC*z znvCx@bR(1NDJTsRG#TG3(2I5dMv*z#s4l%mO<f7uoPo%$LivRRO~&^&^kTje6zZGu zk=^9$L#8vdAEF0P=1dakBodD_nz%YHOba$cChj8`;2IkHWhmwoKsJga`Vwqp(uas^ zkf4eBBl-edoMQ%x*$dv=<2h(9q!`oZP`(>$N42PC{?^W&E3{k~7Xb7@qPmoyY8LaY zV0outGgR!|*a(aE61#U;^w|?$%3th+bbDgf$!z2|TgkK9<EO~zG|Ukl&t|ildbiMg zInf4>$Y#fNdNUo7&1Th($U>bg&^+d=vLxA3C)dbN&$oqkC<A>i>G}}T4hhc?Vtn-# z2c9DxOJCN0x@RcvIgKxByrFSN<69cv(b&}(Y0Nafr}1M#)cZu^XWFj%#UJg4{6A<s KNr)j%YyBUZZ593i literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_open.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_open.c new file mode 100755 index 000000000..95ad8c503 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_open.c @@ -0,0 +1,62 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <errno.h> + +#ifdef __cplusplus +extern "C" { + int _open(const char *buf, int flags, int mode); +} +#endif + +/* + * _open -- open a file descriptor. We don't have a filesystem, so + * we return an error. + */ +int _open(const char *buf, int flags, int mode) +{ + (void)buf; + (void)flags; + (void)mode; + errno = EIO; + return (-1); +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_open.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_open.o new file mode 100644 index 0000000000000000000000000000000000000000..3152fb0c3f2a77d350500698bcf7afc757bde023 GIT binary patch literal 2848 zcma)8O=uid9Di?SHoN)S=A*^dR$V346v<4ssfn#$Nt0SaKWtM)J;*w<JJ~F3X5-9k zX-cKVg5pI~5b>ft^d=q@JP3O5CfI}EN%SC8u__4SMG%d@-^_cvvsKW4^4{<N{r>NB z_TrJ_k4h<pCMhOGR}$h<F0teeBrqv<h%r%^pZf8yt*xJP(^syG=}X@W@$L1(rB81B z1Ro>uvn2gxfbMLf5Mrl7!^$;+SeUZ!PiRb8*iA5U{TS6W^2}jc`68i^jBOV3PbSLT zm#J->o>qRIk}RwMEbAirT!^kueurMp%Dn)R9#?(^A@8+UVcY~;LMzzl<SbnmDDLZs z9=QGjI!1{B`3-twr~CmREi1__N9Eq)_@G(bT^yBTa-<I)6Jl`i;XxCDreZM>Ya6u7 z<0$ZMLFlvPBSU8K(BK1u_Y5tMGkCu5&BH?ywtNoLre%5DKtilQ>X?fCFTWtgs4T;A zz!upg4-T<TkcDQ5=M&`A!E+iN%7c^Q6oF<-{3cJm)3Jg{9ZqK*PXCL;O4ebe<FE%A z)Dh?;)jL4Nhl%}d_VSP7u)xv7Zt}!Qr?n9~Pc@p2;G9!FV9z<rXO2{s&NxSwjyd(9 z?YQB(1Eb@i*)~|usaLC1Pn}DmrhM0HIEb`o=+ODU*`pCuo9&wKM4OQimDYwI*j3aZ z{4fk!_F8)UbIB~sS-F4Buux{R71T>f$J5&mqDDRNYo#8cy5@#ry;bwYYSXPp;^@gI zN{gkWAd!UjgeBhHv^_RmmD6lh-KNv7x?${`XjH@2;=;<~mGazF`F`iQwp(+~Z+flD zYUDL5UbNwCM01sDD~$bf?!n45*C-0BP87RA&BaiD<?KwQT&}nd)M-haK&6sQJzWbC ztsz0FryMoeq~g@fu&8m~k2g1bA&xFC9x6?qX|=<uA8wWwu>^<xpt@E%-iZCu{^|0J zJ$>KQ%)xzXF&235TyB?;6JT?5QwySRAiq$M{l=KJUG9*#m^<Yzd8@qLxJ&YEZ-JyR zE)<7`#dgS=c(@K13zv;oaE9z?b3JxFU>v5nrn%5>+E|uY*flqHh3!R=u&J#1Ub|jt z1gkBW65jQ^&_Ams>_FDh4c(yb_r&5*`q~@A3A@@_U-z*<_QJ{u+l}L};kD!5nAOl- z$HM)8x&yAfDR>kT;`^GtSiJWnzNY;Nmv)5#ydq%nWF+zQqs%9a`Ajs@@f12eZKQkA z=>K1S$$QTLMa=h$7Jxe6H27?NBdG5NbgVCjrt6yruVcW9Ll9mkqe$CMLe@M@*C1S0 zJ_K!hCc{(z818q8j3Vv#G~{f3zoWhp=vW{1y1otYItHw0A>T)26lq%%ayDOKu)7~% zJNYhvXAIYeG>HY@qmw`;%l48&?YD%2%Ft=jey>7-6f85LHvAkd0CnoC8J^~=@S7x~ z2x3B4&}Zi{g5pP@<GK*($8$1@rq2pkaSev|$tcp}64MVwYWNJnB`A5fbv`1;%;viR z#cgRw((8N~)j#x>_;o95H#@UWwPw!<9M9^RYj?G@KTm3x%;ck)mAMjKGH=Re3hsQD zOff9@#&NzWbvepr#*)hTRgoc6Y{Oqld=thnza1HSl1+b7CR{O5Q%}8q_~Fa_+k?&H z`(ohR&Uy@#$^9fUA8{8E8^=8$-butA;n|{nR^dYmmlPgT$e(NU<2@rjtFW#xP}o-Z zqQcjR81D^*ZxOM~?<xF%h<qO_`BNo-uH-L>i2qvYlX;@!+ED+lLY_ZkIDK2G{~N#q BOicg) literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_sbrk.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_sbrk.c new file mode 100755 index 000000000..b26195e50 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_sbrk.c @@ -0,0 +1,71 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <sys/types.h> + +extern int _heap_start; +extern int _heap_end; + +#ifdef __cplusplus +extern "C" { + caddr_t _sbrk ( int incr ); +} +#endif + +caddr_t _sbrk ( int incr ) +{ + static unsigned char *heap = NULL; + unsigned char *prev_heap; + + if (heap == NULL) { + heap = (unsigned char *)&_heap_start; + } + prev_heap = heap; + + heap += incr; + +/* if ((unsigned)heap > (unsigned)_heap_end){ + return (caddr_t) -1; + }*/ + + return (caddr_t) prev_heap; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_sbrk.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/_sbrk.o new file mode 100644 index 0000000000000000000000000000000000000000..2a6a40ac6d6a38acbe4e44379596f767bda9fdd7 GIT binary patch literal 2860 zcma)8OKclO7@pZ($8Pgznl^pVQd~$yswTTONl05BZJL%6^+8EMf&+5a>#bwq*k*TK zHB}3UN^pP!LP$MSf*z1SLLA@#5?3U|0f`Ho0I8+w0dYbVCl2NN#xwQ?F8uQD_rK?# ze;(`CPMm&9N+}FUF)n(N5YriD$xJI47o%cCh`hKh@<(rrVc;;Z@ZKFEmTt?!4TN63 zDa0FhY;oh(o_pRc7=)!_9oYw~WWHIY5Mn~3CHwZlX35-kXe=u;LdnX$56N~iwMHT= zC;J&~xy)S!*>4F>W;Z>Z>~BiS?gKb~kbm_G-WlgAd70w``{c(E<cy2}B#v%f5%MQs zmI^sDM*!u1#Y@i8lChOykcxv;$R*@u?1rx?O)v)e<z~5WXiL96v}<Uy9FfC)NIoX| z`=5jgv(Rh~^=%XO(Bb~a`WLn!`zE-M>2u|gfsX#+frTwhadhLgV*?VlY^EDwA#HBD zCvHR;J@LrE;{&LMl*c2*IRa~S#9evrLokYV<E<A(YkF%z#h1$d0pIfPp+QVf?GQ9k zdd*hiy-=&y8W+9dv^(o9ES)GFU-C{IKjl>$ZO@NZJs7<*9@hn1_NqZZ_2fkrH5vNl znukbtiVof1zddS=px&;8Uc43yQHsma%WlBhlC@SCyDOL+D5GX!&&X{*KWjOt6H!su zyA_2ON-Lq?675D@t2V+)K3MT1QExV?`L2q)%d0m7zwWgIKT5nawIFKF&n-SzD$Y(8 z4|=b({fc*Kt=ue~kIVH^Ic|Bac(xQYqa?iOA1W0%%Qy<WIPn`5AKAmwg{e}pSn@rn zMZ5yf_2a4e^r~VBs?ZWrL`kQ>|5mA{64x$;?12dUN+l|#otZ{W@Z{O&^YeMtV?8=e zDj}J4FT~0D`NR3~rDi({!e}i&->ihk!bY%?KV3`0{3C_plv|jYoI12$=bLlUcb|(W z<QSJ=c5+ViZOqQ)<OXZR*(yinc6*21DeseetOq6c<2{fR*5#prL1FeM)Sct+#%rsI zUlwkhL>*i)Tol$_v^WuN#ZP?Umg88sR93=ryIQI>&NpFFyk9P3v5kb)Ogs9K->8P` zVzEU-<Bj2j8#Gr}L-fX-TRh|XNfOn{?PPt-`N&@lS@-{?2jIwUiZiQ-cPI~|AxAU2 zfE$bw=-^c6fjIgqo_@GE1aCLyQ#TTD8Bdzjk$~a=9{Q*K%vkg{JnJzr)Gy=tos1@9 zD?m=yH-`FdLdW`eotyfOf;TZ>#R7!4$!IdRvycr>(~l7LY9E5Jy_Djq{|kmZ8BNCT zMab#;oPL2%Q>Q-aO?@r!CI+k+#qGg6+>o)=p-AW3ihS%R=L@!*?=pDCus@_9kgsTx zKqkxQEse&H35w7eGJfwufi+{9ii+^_i~uyLKT7d5FT*cSMiWFuH}Fo+V|S`A!?4kh z^V*EZ>=m%$br?P;qsfd*?0hylhRX;(2jy0X><#lVFUL&h`yPrJ=nR>BMmCt%JL1oK zMo+Z6v+ro_btBO3teY#lmA-3O-L`Z>$UC*nx}~bV=U}UyotD*Kgs#F?o$HDiKiz58 z!=2J2TMVl4*`E&eILfx_oHi*L{~A(ci%sGoE%Oc;LB;!1c9qS1CdY7Do}N29|MWA9 z1u<3;{BXF_#i^;zr*Yl4M&~$yONxD%;2#X&0W2!}Hv#1RW#P<Iwon%L3vpB<`)FZf z+^=yj5r3G*wVivI{*P*WLgOioiyC>3>9?%0s<ELl*7&BzcQjrjV*KkGKhgRxh**ZN fwEPVbll)H0zi3qR!}76*%=4*6?rRIm9a{be5YSbD literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/abort.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/abort.c new file mode 100755 index 000000000..e8f17bb5d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/abort.c @@ -0,0 +1,51 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <stdlib.h> +#include <unistd.h> + +/* + * abort -- go out via exit... + */ +void abort(void) +{ + _exit(1); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/abort.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/abort.o new file mode 100644 index 0000000000000000000000000000000000000000..9e3879e397b2d1d5360a68c74f66f71dfd7ffc4b GIT binary patch literal 2716 zcmcgu+iM(E7(ZubZ_Q<!qz$&V)m2iOBALlHwXyY<OJiGXOKB`9BJ0fTbThD-jWe?) zsTHA$#UfHc@U@`D7atV*2l(Wxe}OOhB#I!2FN*Q^J9|!cwjlcC*UtHUxAUFv`_5(a z_R9Geq?E#t6w{(F2{Bz%mf~>*(_&Igh|0puk5b(I;jiuOpT30NQnrFT0F=LAh?GKz z5sg-%Tm@^%()S7~uM(`{p9;#~0_;LDiZfwV)OuE>e3G_8@f!u@5^_S6Ba~$25}+V| zr*Kv!YZj89LRX|jrX(-Px)5b~1%f>;W#udw<Tx%5SN9Ct)dSUWIU&bNh%+UIho6HA zj+(7t4M#pdVpmTMKRtY8gsuyvPnJgH9<1^HO^Gmdu%+8KrLcxRS{lMq`3cV;50rBb zK8gw$E%BBhGDYxMqelmoOrF*rnW88iWBuYFNBKu}RA9?kI6moiHZu3+s2#<dZvD73 z@19#-X`EhlS5Cj^w&JeqCF?GXu8+@g!1``02&kUfRI_G6&yQTpbmr)=^Z!AQC=S}) zW+?ve1>JNj6~gm7N#+D>Mw&HIg|o);yKw{&ygGzMHQKY%wF>A_yA!u+YT()G#%a`w z!)A@bnTuCy%QaQBP#y!;{=@-wu;wMA5pG7gU`pq<JAv1ByMdQv?u95wI?IcfUux9n zXX;P6Z*;w;dwt9AG_Iz8yWyuB?nXM_2vASB>78uMa!=AEaMR3-n;zB<8`tI<^?Ji| zq3)%}oYOT-sSRYLD^f|A4k^^mYFczX%(gZ{A<ir>pQ=r-cDhLrCR?@TPBUBz<6y0J zKFY${vDx~ZGyCMs+{vT5F^dkm?eTaBIR&;jKeH%GL*>Pa++|G^_R2~5kiAdtmk-NF ztj8q}>^2D3;YM|2RP2Rph_<C_<sIuoY?_m9t!JJO%#t3i87>Li4%(6lr|D&$aQrkC z4wcQ&@3tCIe6<6U;yvF_!fQst4&)uZ#EV<uz+7B{(0F4x;RK!a^$>k^7B63Lyevy1 zzncxtxte(EXxx9NN8!qwi8n<N-_86*HrJbP<*uHK8oz+R*MN@&=hKh!VJ+K0(t;ZM z1AR$P;G_S)`7s|e2ds*BpNuABn}wXu?>>aDp<{l0qD_7a;LRMc;x~M_tvh6F7ojmc zjV%Z@GMbF-HOPji>DE8^y#iZ4zYMSM7<9~!dXwJ<_<X$2A)Lr54BOW80E*s4JhLCe z(3p5Pz;h1!L;4Oc&TbO~GFg7NG#bC3u`&29+9Bh22O5}|rlLbw$Tb4cg#IkY(|jI& z(_}O;Khj-%`M!LR>&qBy^kZG)_{>=WD>4|qBBRNyOH_}l)^A{P4a&WcO*|sk%*VR} z1<$x46VJ#7^ZJ7Lb=&BP_D=OZtv#>;?S+9_``t4BJgI%MMY%74vsEYhD*J(Gw&2e9 z$rhvPF0<Yq^*PG6>WDTenSb^4$riiuuSa|nCQ#pG-`tyRUhyeUOf`GIdip0vWqS}C z$G62oDU4wuMeZe$v55PL*tA0$A0y%%@VwB@^F=(N@mY<hHD1=pJ4V0PHMTUy8oL_b o)OeGKb>Gu?n~3xBv6k-<5l`ihf!(A3Q5*sy&y+PP#6GS68;sXe-~a#s literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/asm_vectors.S b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/asm_vectors.S new file mode 100755 index 000000000..94b8ab0c0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/asm_vectors.S @@ -0,0 +1,205 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file asm_vectors.s +* +* This file contains the initial vector table for the Cortex A9 processor +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------- -------- --------------------------------------------------- +* 1.00a ecm/sdm 10/20/09 Initial version +* 3.05a sdm 02/02/12 Save lr when profiling is enabled +* 3.10a srt 04/18/13 Implemented ARM Erratas. Please refer to file +* 'xil_errata.h' for errata description +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ +#include "xil_errata.h" + +#define __ARM_NEON__ 1 + +.org 0 +.text + +.globl _boot +.globl _vector_table + +.globl FIQInterrupt +.globl IRQInterrupt +.globl SWInterrupt +.globl DataAbortInterrupt +.globl PrefetchAbortInterrupt + +.globl IRQHandler +.globl prof_pc + +.section .vectors +_vector_table: + B _boot + B Undefined + B SVCHandler + B PrefetchAbortHandler + B DataAbortHandler + NOP /* Placeholder for address exception vector*/ + B IRQHandler + B FIQHandler + + +IRQHandler: /* IRQ vector handler */ + + stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code*/ +#ifdef __ARM_NEON__ + vpush {d0-d7} + vpush {d16-d31} + vmrs r1, FPSCR + push {r1} + vmrs r1, FPEXC + push {r1} +#endif + +#ifdef PROFILING + ldr r2, =prof_pc + subs r3, lr, #0 + str r3, [r2] +#endif + + bl IRQInterrupt /* IRQ vector */ + +#ifdef __ARM_NEON__ + pop {r1} + vmsr FPEXC, r1 + pop {r1} + vmsr FPSCR, r1 + vpop {d16-d31} + vpop {d0-d7} +#endif + ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */ + + + subs pc, lr, #4 /* adjust return */ + + +FIQHandler: /* FIQ vector handler */ + stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code */ +#ifdef __ARM_NEON__ + vpush {d0-d7} + vpush {d16-d31} + vmrs r1, FPSCR + push {r1} + vmrs r1, FPEXC + push {r1} +#endif + +FIQLoop: + bl FIQInterrupt /* FIQ vector */ + +#ifdef __ARM_NEON__ + pop {r1} + vmsr FPEXC, r1 + pop {r1} + vmsr FPSCR, r1 + vpop {d16-d31} + vpop {d0-d7} +#endif + ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */ + subs pc, lr, #4 /* adjust return */ + + +Undefined: /* Undefined handler */ + stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code */ + + ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */ + + b _prestart + + movs pc, lr + + +SVCHandler: /* SWI handler */ + stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code */ + + tst r0, #0x20 /* check the T bit */ + ldrneh r0, [lr,#-2] /* Thumb mode */ + bicne r0, r0, #0xff00 /* Thumb mode */ + ldreq r0, [lr,#-4] /* ARM mode */ + biceq r0, r0, #0xff000000 /* ARM mode */ + + bl SWInterrupt /* SWInterrupt: call C function here */ + + ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */ + + subs pc, lr, #4 /* adjust return */ + + +DataAbortHandler: /* Data Abort handler */ +#ifdef CONFIG_ARM_ERRATA_775420 + dsb +#endif + stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code */ + + bl DataAbortInterrupt /*DataAbortInterrupt :call C function here */ + + ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */ + + subs pc, lr, #4 /* adjust return */ + +PrefetchAbortHandler: /* Prefetch Abort handler */ +#ifdef CONFIG_ARM_ERRATA_775420 + dsb +#endif + stmdb sp!,{r0-r3,r12,lr} /* state save from compiled code */ + + bl PrefetchAbortInterrupt /* PrefetchAbortInterrupt: call C function here */ + + ldmia sp!,{r0-r3,r12,lr} /* state restore from compiled code */ + + subs pc, lr, #4 /* adjust return */ + + +.end diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/asm_vectors.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/asm_vectors.o new file mode 100644 index 0000000000000000000000000000000000000000..2752bfbf4fe94d86fb623e89e3c31a4b6c07eb59 GIT binary patch literal 2268 zcmb_dO>Epm6n<WN(@i%d-j?4qMMg?R4y?Vqp$e6dU{xptH6=|*5kl11UT?dSvtDd( zXbYl9+z=8RIB-Eihyw=>6*mr*a_E6WBo0MA^->B_=%1DY5)wb*d$woSy8@L1Pa41P z``*lZ<MGV+{If@oNRmXtB$}fEBbt@tNdEEI%~6Ra>93ug8wZGP%%L4bGtj7~U1xm? zcxt))vsx_Q){5)5)#+dEC~Em9b^5p1qt8u6{q#q5dK;YmwL4nz&s%Eo;;pIWi`z=? z<PZPHc+SQ1ne1J-#`!c-uYXM^OFI*rdlh;(zoTr*JQq>(#oqZ}x!>Kix`u_YT+42e zbU$Ezp<Ji2-Mi`qX*{=Eo{-K#%+V}ArQav-AuKMhCz?c7xNdH^PUHunz6ueR&+${f zOp=k<d?ohsxL%DxrCLjrTFQ-DrBX>WfO#}9ST2WJA0b(sk(B;d`~%u>WyA9w%QL!; z6-35T%L)9$^_7>*>O#5tgz-k#Y8dCv+P>KgZO^pBj?oDhOveu*_l$MOtQcO)4g<#s zBdgu8JiqOl8}nwhYFY+ldhXboR$tX>dTm}mSR?6OsYL2nN!laHg?)tsg}r%x<C(!k zna0Kw?VBE+U5_lA^e_q%e_9~SBO<+FMHcCH7?K{io}R8N>GhQ*-HM{1Wp^Vt4K`f6 zd&=}$Z8zzh@K(F&BTpQ&Y&&o_vQaCr+NY4<zuP`^<y9X`ha_iaFkXC-N78=D(IWb{ zevhJG0qt)6Drr8r*f?KyEtOP%41PSt>>5b^G(65MaUX76?+_YlcHm;GVB$PyVd6cO zAPCH{;~?*dPMO#uaJKFjD8hBP?k+S@_ch>bzVARjh9*qJUV)I!_Z5<9&^RCKB3}zw zi~%GEC*xiQsfpNI-~w~#4EkvdQscR@y@{5syM=%Xjq6UJiMl0V@y!6~6XbiJL29BF zdxZM7g_E%fk#p`r<9v*{W;WjkShOq9go%8D|C5)8-jMTUD>KhlV6KdeP~!P~)=#eB zPe61b!yf|P&Tt+0`wV{y`1K5b0r>3<??V6?Z@mJ~>zddAF_)>B>WP!%oivc-%t%&c zoXWL9I9}IRhqyw#Uxe|xZwLa<{JjzW;RyeHgnt9BrJ9P>yEGEt8sRi+(OSFVHgQii zX!XS5=W)S$Za~X{+jJx6blt`!EW~GU{|yO87LSV<;8EZ2&}@TD+xH_%e>)~_QqLuX z7u%5=1l>+Viz^wj`tl&qFEEgXCNhwbLR9Vqe$(tYWOf1<KZqbo-*G=S^n<|ru}PkU zpSdsj_A@w;U$TzN^IO*OQ@zUm0iqsz464HCa2WVr&0*8=PRQZV@i$?e&vZYIpwRyY D&ckC} literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/boot.S b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/boot.S new file mode 100755 index 000000000..e07b42193 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/boot.S @@ -0,0 +1,448 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file boot.S +* +* This file contains the initial startup code for the Cortex A9 processor +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------- -------- --------------------------------------------------- +* 1.00a ecm/sdm 10/20/09 Initial version +* 3.06a sgd 05/15/12 Updated L2CC Auxiliary and Tag RAM Latency control +* register settings. +* 3.06a asa 06/17/12 Modified the TTBR settings and L2 Cache auxiliary +* register settings. +* 3.07a asa 07/16/12 Modified the L2 Cache controller settings to improve +* performance. Changed the property of the ".boot" +* section. +* 3.07a sgd 08/21/12 Modified the L2 Cache controller and cp15 Aux Control +* Register settings +* 3.09a sgd 02/06/13 Updated SLCR l2c Ram Control register to a +* value of 0x00020202. Fix for CR 697094 (SI#687034). +* 3.10a srt 04/18/13 Implemented ARM Erratas. Please refer to file +* 'xil_errata.h' for errata description +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#include "xparameters.h" +#include "xil_errata.h" + +.globl MMUTable +.global _prestart +.global _boot +.global __stack +.global __irq_stack +.global __supervisor_stack +.global __abort_stack +.global __fiq_stack +.global __undef_stack +.global _vector_table + +.set PSS_L2CC_BASE_ADDR, 0xF8F02000 +.set PSS_SLCR_BASE_ADDR, 0xF8000000 + +.set RESERVED, 0x0fffff00 +.set TblBase , MMUTable +.set LRemap, 0xFE00000F /* set the base address of the peripheral block as not shared */ +.set L2CCWay, (PSS_L2CC_BASE_ADDR + 0x077C) /*(PSS_L2CC_BASE_ADDR + PSS_L2CC_CACHE_INVLD_WAY_OFFSET)*/ +.set L2CCSync, (PSS_L2CC_BASE_ADDR + 0x0730) /*(PSS_L2CC_BASE_ADDR + PSS_L2CC_CACHE_SYNC_OFFSET)*/ +.set L2CCCrtl, (PSS_L2CC_BASE_ADDR + 0x0100) /*(PSS_L2CC_BASE_ADDR + PSS_L2CC_CNTRL_OFFSET)*/ +.set L2CCAuxCrtl, (PSS_L2CC_BASE_ADDR + 0x0104) /*(PSS_L2CC_BASE_ADDR + XPSS_L2CC_AUX_CNTRL_OFFSET)*/ +.set L2CCTAGLatReg, (PSS_L2CC_BASE_ADDR + 0x0108) /*(PSS_L2CC_BASE_ADDR + XPSS_L2CC_TAG_RAM_CNTRL_OFFSET)*/ +.set L2CCDataLatReg, (PSS_L2CC_BASE_ADDR + 0x010C) /*(PSS_L2CC_BASE_ADDR + XPSS_L2CC_DATA_RAM_CNTRL_OFFSET)*/ +.set L2CCIntClear, (PSS_L2CC_BASE_ADDR + 0x0220) /*(PSS_L2CC_BASE_ADDR + XPSS_L2CC_IAR_OFFSET)*/ +.set L2CCIntRaw, (PSS_L2CC_BASE_ADDR + 0x021C) /*(PSS_L2CC_BASE_ADDR + XPSS_L2CC_ISR_OFFSET)*/ + +.set SLCRlockReg, (PSS_SLCR_BASE_ADDR + 0x04) /*(PSS_SLCR_BASE_ADDR + XPSS_SLCR_LOCK_OFFSET)*/ +.set SLCRUnlockReg, (PSS_SLCR_BASE_ADDR + 0x08) /*(PSS_SLCR_BASE_ADDR + XPSS_SLCR_UNLOCK_OFFSET)*/ +.set SLCRL2cRamReg, (PSS_SLCR_BASE_ADDR + 0xA1C) /*(PSS_SLCR_BASE_ADDR + XPSS_SLCR_L2C_RAM_OFFSET)*/ + +/* workaround for simulation not working when L1 D and I caches,MMU and L2 cache enabled - DT568997 */ +.if SIM_MODE == 1 +.set CRValMmuCac, 0b00000000000000 /* Disable IDC, and MMU */ +.else +.set CRValMmuCac, 0b01000000000101 /* Enable IDC, and MMU */ +.endif + +.set CRValHiVectorAddr, 0b10000000000000 /* Set the Vector address to high, 0xFFFF0000 */ + +.set L2CCAuxControl, 0x72360000 /* Enable all prefetching, Cache replacement policy, Parity enable, + Event monitor bus enable and Way Size (64 KB) */ +.set L2CCControl, 0x01 /* Enable L2CC */ +.set L2CCTAGLatency, 0x0111 /* latency for TAG RAM */ +.set L2CCDataLatency, 0x0121 /* latency for DATA RAM */ + +.set SLCRlockKey, 0x767B /* SLCR lock key */ +.set SLCRUnlockKey, 0xDF0D /* SLCR unlock key */ +.set SLCRL2cRamConfig, 0x00020202 /* SLCR L2C ram configuration */ + +/* Stack Pointer locations for boot code */ +.set Undef_stack, __undef_stack +.set FIQ_stack, __fiq_stack +.set Abort_stack, __abort_stack +.set SPV_stack, __supervisor_stack +.set IRQ_stack, __irq_stack +.set SYS_stack, __stack + +.set vector_base, _vector_table + +.set FPEXC_EN, 0x40000000 /* FPU enable bit, (1 << 30) */ + +.section .boot,"ax" + + +/* this initializes the various processor modes */ + +_prestart: +_boot: + +#if XPAR_CPU_ID==0 +/* only allow cpu0 through */ + mrc p15,0,r1,c0,c0,5 + and r1, r1, #0xf + cmp r1, #0 + beq OKToRun +EndlessLoop0: + wfe + b EndlessLoop0 + +#elif XPAR_CPU_ID==1 +/* only allow cpu1 through */ + mrc p15,0,r1,c0,c0,5 + and r1, r1, #0xf + cmp r1, #1 + beq OKToRun +EndlessLoop1: + wfe + b EndlessLoop1 +#endif + +OKToRun: + mrc p15, 0, r0, c0, c0, 0 /* Get the revision */ + and r5, r0, #0x00f00000 + and r6, r0, #0x0000000f + orr r6, r6, r5, lsr #20-4 + +#ifdef CONFIG_ARM_ERRATA_742230 + cmp r6, #0x22 /* only present up to r2p2 */ + mrcle p15, 0, r10, c15, c0, 1 /* read diagnostic register */ + orrle r10, r10, #1 << 4 /* set bit #4 */ + mcrle p15, 0, r10, c15, c0, 1 /* write diagnostic register */ +#endif + +#ifdef CONFIG_ARM_ERRATA_743622 + teq r5, #0x00200000 /* only present in r2p* */ + mrceq p15, 0, r10, c15, c0, 1 /* read diagnostic register */ + orreq r10, r10, #1 << 6 /* set bit #6 */ + mcreq p15, 0, r10, c15, c0, 1 /* write diagnostic register */ +#endif + + /* set VBAR to the _vector_table address in linker script */ + ldr r0, =vector_base + mcr p15, 0, r0, c12, c0, 0 + + /*set scu enable bit in scu*/ + ldr r7, =0xf8f00000 + ldr r0, [r7] + orr r0, r0, #0x1 + str r0, [r7] + + /*invalidate scu*/ + ldr r7, =0xf8f0000c + ldr r6, =0xffff + str r6, [r7] + + /* Write to ACTLR */ + mrc p15, 0, r0, c1, c0, 1 /* Read ACTLR*/ + orr r0, r0, #(0x01 << 6) /* set SMP bit */ + orr r0, r0, #(0x01 ) /* */ + mcr p15, 0, r0, c1, c0, 1 /* Write ACTLR*/ + +/* Invalidate caches and TLBs */ + mov r0,#0 /* r0 = 0 */ + mcr p15, 0, r0, c8, c7, 0 /* invalidate TLBs */ + mcr p15, 0, r0, c7, c5, 0 /* invalidate icache */ + mcr p15, 0, r0, c7, c5, 6 /* Invalidate branch predictor array */ + bl invalidate_dcache /* invalidate dcache */ + +/* Invalidate L2c Cache */ +/* For AMP, assume running on CPU1. Don't initialize L2 Cache (up to Linux) */ +#if USE_AMP!=1 + ldr r0,=L2CCCrtl /* Load L2CC base address base + control register */ + mov r1, #0 /* force the disable bit */ + str r1, [r0] /* disable the L2 Caches */ + + ldr r0,=L2CCAuxCrtl /* Load L2CC base address base + Aux control register */ + ldr r1,[r0] /* read the register */ + ldr r2,=L2CCAuxControl /* set the default bits */ + orr r1,r1,r2 + str r1, [r0] /* store the Aux Control Register */ + + ldr r0,=L2CCTAGLatReg /* Load L2CC base address base + TAG Latency address */ + ldr r1,=L2CCTAGLatency /* set the latencies for the TAG*/ + str r1, [r0] /* store the TAG Latency register Register */ + + ldr r0,=L2CCDataLatReg /* Load L2CC base address base + Data Latency address */ + ldr r1,=L2CCDataLatency /* set the latencies for the Data*/ + str r1, [r0] /* store the Data Latency register Register */ + + ldr r0,=L2CCWay /* Load L2CC base address base + way register*/ + ldr r2, =0xFFFF + str r2, [r0] /* force invalidate */ + + ldr r0,=L2CCSync /* need to poll 0x730, PSS_L2CC_CACHE_SYNC_OFFSET */ + /* Load L2CC base address base + sync register*/ + /* poll for completion */ +Sync: ldr r1, [r0] + cmp r1, #0 + bne Sync + + ldr r0,=L2CCIntRaw /* clear pending interrupts */ + ldr r1,[r0] + ldr r0,=L2CCIntClear + str r1,[r0] +#endif + + /* Disable MMU, if enabled */ + mrc p15, 0, r0, c1, c0, 0 /* read CP15 register 1 */ + bic r0, r0, #0x1 /* clear bit 0 */ + mcr p15, 0, r0, c1, c0, 0 /* write value back */ + +#ifdef SHAREABLE_DDR + /* Mark the entire DDR memory as shareable */ + ldr r3, =0x3ff /* 1024 entries to cover 1G DDR */ + ldr r0, =TblBase /* MMU Table address in memory */ + ldr r2, =0x15de6 /* S=b1 TEX=b101 AP=b11, Domain=b1111, C=b0, B=b1 */ +shareable_loop: + str r2, [r0] /* write the entry to MMU table */ + add r0, r0, #0x4 /* next entry in the table */ + add r2, r2, #0x100000 /* next section */ + subs r3, r3, #1 + bge shareable_loop /* loop till 1G is covered */ +#endif + + /* In case of AMP, map virtual address 0x20000000 to 0x00000000 and mark it as non-cacheable */ +#if USE_AMP==1 + ldr r3, =0x1ff /* 512 entries to cover 512MB DDR */ + ldr r0, =TblBase /* MMU Table address in memory */ + add r0, r0, #0x800 /* Address of entry in MMU table, for 0x20000000 */ + ldr r2, =0x0c02 /* S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b0 */ +mmu_loop: + str r2, [r0] /* write the entry to MMU table */ + add r0, r0, #0x4 /* next entry in the table */ + add r2, r2, #0x100000 /* next section */ + subs r3, r3, #1 + bge mmu_loop /* loop till 512MB is covered */ +#endif + + mrs r0, cpsr /* get the current PSR */ + mvn r1, #0x1f /* set up the irq stack pointer */ + and r2, r1, r0 + orr r2, r2, #0x12 /* IRQ mode */ + msr cpsr, r2 + ldr r13,=IRQ_stack /* IRQ stack pointer */ + + mrs r0, cpsr /* get the current PSR */ + mvn r1, #0x1f /* set up the supervisor stack pointer */ + and r2, r1, r0 + orr r2, r2, #0x13 /* supervisor mode */ + msr cpsr, r2 + ldr r13,=SPV_stack /* Supervisor stack pointer */ + + mrs r0, cpsr /* get the current PSR */ + mvn r1, #0x1f /* set up the Abort stack pointer */ + and r2, r1, r0 + orr r2, r2, #0x17 /* Abort mode */ + msr cpsr, r2 + ldr r13,=Abort_stack /* Abort stack pointer */ + + mrs r0, cpsr /* get the current PSR */ + mvn r1, #0x1f /* set up the FIQ stack pointer */ + and r2, r1, r0 + orr r2, r2, #0x11 /* FIQ mode */ + msr cpsr, r2 + ldr r13,=FIQ_stack /* FIQ stack pointer */ + + mrs r0, cpsr /* get the current PSR */ + mvn r1, #0x1f /* set up the Undefine stack pointer */ + and r2, r1, r0 + orr r2, r2, #0x1b /* Undefine mode */ + msr cpsr, r2 + ldr r13,=Undef_stack /* Undefine stack pointer */ + + mrs r0, cpsr /* get the current PSR */ + mvn r1, #0x1f /* set up the system stack pointer */ + and r2, r1, r0 + orr r2, r2, #0x1F /* SYS mode */ + msr cpsr, r2 + ldr r13,=SYS_stack /* SYS stack pointer */ + + /* enable MMU and cache */ + + ldr r0,=TblBase /* Load MMU translation table base */ + orr r0, r0, #0x5B /* Outer-cacheable, WB */ + mcr 15, 0, r0, c2, c0, 0 /* TTB0 */ + + + mvn r0,#0 /* Load MMU domains -- all ones=manager */ + mcr p15,0,r0,c3,c0,0 + + /* Enable mmu, icahce and dcache */ + ldr r0,=CRValMmuCac + + mcr p15,0,r0,c1,c0,0 /* Enable cache and MMU */ + dsb /* dsb allow the MMU to start up */ + + isb /* isb flush prefetch buffer */ + +/* For AMP, assume running on CPU1. Don't initialize L2 Cache (up to Linux) */ +#if USE_AMP!=1 + ldr r0,=SLCRUnlockReg /* Load SLCR base address base + unlock register */ + ldr r1,=SLCRUnlockKey /* set unlock key */ + str r1, [r0] /* Unlock SLCR */ + + ldr r0,=SLCRL2cRamReg /* Load SLCR base address base + l2c Ram Control register */ + ldr r1,=SLCRL2cRamConfig /* set the configuration value */ + str r1, [r0] /* store the L2c Ram Control Register */ + + ldr r0,=SLCRlockReg /* Load SLCR base address base + lock register */ + ldr r1,=SLCRlockKey /* set lock key */ + str r1, [r0] /* lock SLCR */ + + ldr r0,=L2CCCrtl /* Load L2CC base address base + control register */ + ldr r1,[r0] /* read the register */ + mov r2, #L2CCControl /* set the enable bit */ + orr r1,r1,r2 + str r1, [r0] /* enable the L2 Caches */ +#endif + + mov r0, r0 + mrc p15, 0, r1, c1, c0, 2 /* read cp access control register (CACR) into r1 */ + orr r1, r1, #(0xf << 20) /* enable full access for p10 & p11 */ + mcr p15, 0, r1, c1, c0, 2 /* write back into CACR */ + + /* enable vfp */ + fmrx r1, FPEXC /* read the exception register */ + orr r1,r1, #FPEXC_EN /* set VFP enable bit, leave the others in orig state */ + fmxr FPEXC, r1 /* write back the exception register */ + + mrc p15,0,r0,c1,c0,0 /* flow prediction enable */ + orr r0, r0, #(0x01 << 11) /* #0x8000 */ + mcr p15,0,r0,c1,c0,0 + + mrc p15,0,r0,c1,c0,1 /* read Auxiliary Control Register */ + orr r0, r0, #(0x1 << 2) /* enable Dside prefetch */ + orr r0, r0, #(0x1 << 1) /* enable L2 Prefetch hint */ + mcr p15,0,r0,c1,c0,1 /* write Auxiliary Control Register */ + + b _start /* jump to C startup code */ + and r0, r0, r0 /* no op */ + +.Ldone: b .Ldone /* Paranoia: we should never get here */ + + +/* + ************************************************************************* + * + * invalidate_dcache - invalidate the entire d-cache by set/way + * + * Note: for Cortex-A9, there is no cp instruction for invalidating + * the whole D-cache. Need to invalidate each line. + * + ************************************************************************* + */ +invalidate_dcache: + mrc p15, 1, r0, c0, c0, 1 /* read CLIDR */ + ands r3, r0, #0x7000000 + mov r3, r3, lsr #23 /* cache level value (naturally aligned) */ + beq finished + mov r10, #0 /* start with level 0 */ +loop1: + add r2, r10, r10, lsr #1 /* work out 3xcachelevel */ + mov r1, r0, lsr r2 /* bottom 3 bits are the Cache type for this level */ + and r1, r1, #7 /* get those 3 bits alone */ + cmp r1, #2 + blt skip /* no cache or only instruction cache at this level */ + mcr p15, 2, r10, c0, c0, 0 /* write the Cache Size selection register */ + isb /* isb to sync the change to the CacheSizeID reg */ + mrc p15, 1, r1, c0, c0, 0 /* reads current Cache Size ID register */ + and r2, r1, #7 /* extract the line length field */ + add r2, r2, #4 /* add 4 for the line length offset (log2 16 bytes) */ + ldr r4, =0x3ff + ands r4, r4, r1, lsr #3 /* r4 is the max number on the way size (right aligned) */ + clz r5, r4 /* r5 is the bit position of the way size increment */ + ldr r7, =0x7fff + ands r7, r7, r1, lsr #13 /* r7 is the max number of the index size (right aligned) */ +loop2: + mov r9, r4 /* r9 working copy of the max way size (right aligned) */ +loop3: + orr r11, r10, r9, lsl r5 /* factor in the way number and cache number into r11 */ + orr r11, r11, r7, lsl r2 /* factor in the index number */ + mcr p15, 0, r11, c7, c6, 2 /* invalidate by set/way */ + subs r9, r9, #1 /* decrement the way number */ + bge loop3 + subs r7, r7, #1 /* decrement the index */ + bge loop2 +skip: + add r10, r10, #2 /* increment the cache number */ + cmp r3, r10 + bgt loop1 + +finished: + mov r10, #0 /* swith back to cache level 0 */ + mcr p15, 2, r10, c0, c0, 0 /* select current cache level in cssr */ + dsb + isb + + bx lr + +.end + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/boot.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/boot.o new file mode 100644 index 0000000000000000000000000000000000000000..8a905de0dfaab0b399c4738dd956a5faac76175d GIT binary patch literal 3824 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 ZWd1%7Kkl4C@wl@mS<mnJj{VrK{yzY94U+%> literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/bspconfig.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/bspconfig.h new file mode 100644 index 000000000..a7fdebbc6 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/bspconfig.h @@ -0,0 +1,15 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Configurations for Standalone BSP +* +*******************************************************************/ + +#define MICROBLAZE_PVR_NONE diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/changelog.txt b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/changelog.txt new file mode 100755 index 000000000..eb111f868 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/changelog.txt @@ -0,0 +1,147 @@ +/***************************************************************************** + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- --------------------------------------------------- + * 3.02a sdm 05/30/11 Added Xuint64 typedef and XUINT64_MSW/XUINT64_LSW macros + * 3.02a sdm 06/27/11 Added INST_SYNC and DATA_SYNC macros for all the CPUs + * 3.02a sdm 07/07/11 Updated ppc440 boot.S to set guarded bit for all but + * cacheable regions + * Update ppc440/xil_cache.c to use CACHEABLE_REGION_MASK + * generated by the cpu driver, for enabling caches + * 3.02a sdm 07/08/11 Updated microblaze cache flush APIs based on write-back/ + * write-thru caches + * 3.03a sdm 08/20/11 Updated the tag/data RAM latency values for L2CC + * Updated the MMU table to mark OCM in high address space + * as inner cacheable and reserved space as Invalid + * 3.03a sdm 08/20/11 Changes to support FreeRTOS + * Updated the MMU table to mark upper half of the DDR as + * non-cacheable + * Setup supervisor and abort mode stacks + * Do not initialize/enable L2CC in case of AMP + * Initialize UART1 for 9600bps in case of AMP + * 3.03a sdm 08/27/11 Setup abort and supervisor mode stacks and don't init SMC + * in case of AMP + * 3.03a sdm 09/14/11 Added code for performance monitor and L2CC event + * counters + * 3.03a sdm 11/08/11 Updated microblaze xil_cache.h file to include + * xparameters.h file for CR630532 - Xil_DCacheFlush()/ + * Xil_DCacheFlushRange() functions in standalone BSP v3_02a + * for MicroBlaze will invalidate data in the cache instead + * of flushing it for writeback caches + * 3.04a sdm 11/21/11 Updated to initialize stdio device for 115200bps, for PS7 + * 3.04a sdm 01/02/12 Updated to clear cp15 regs with unknown reset values + * Remove redundant dsb/dmb instructions in cache maintenance + * APIs + * Remove redundant dsb in mcr instruction + * 3.04a sdm 01/13/12 Updated MMU table to mark DDR memory as Shareable + * 3.05a sdm 02/02/12 Removed some of the defines as they are being generated through + * driver tcl in xparameters.h. Update the gcc/translationtable.s + * for the QSPI complete address range - DT644567 + * Removed profile directory for armcc compiler and changed + * profiling setting to false in standalone_v2_1_0.tcl file + * Deleting boot.S file after preprocessing for armcc compiler + * 3.05a asa 03/11/12 Updated the function Xil_EnableMMU in file xil_mmu.c to + * invalidate the caches before enabling back the MMU and + * D cache. + * 3.05a asa 04/15/12 Updated the function Xil_SetTlbAttributes in file + * xil_mmu.c. Now we invalidate UTLB, Branch predictor + * array, flush the D-cache before changing the attributes + * in translation table. The user need not call Xil_DisableMMU + * before calling Xil_SetTlbAttributes. + * 3.06a asa/ 06/17/12 Removed the UART initialization for Zynq. For PEEP, the UART + * sgd initialization is present. Changes for this were done in + * uart.c and xil-crt0.s. + * Made changes in xil_io.c to use volatile pointers. + * Made changes in xil_mmu.c to correct the function + * Xil_SetTlbAttributes. + * Changes are made xil-crt0.s to initialize the static + * C++ constructors. + * Changes are made in boot.s, to fix the TTBR settings, + * correct the L2 Cache Auxiliary register settings, L2 cache + * latency settings. + * 3.07a asa/ 07/16/12 Made changes in cortexa9/xtime_l.c, xtime_l.h, sleep.c + * sgd usleep.c to use global timer intstead of CP15. + * Made changes in cortexa9/gcc/translation_table.s to map + * the peripheral devices as shareable device memory. + * Made changes in cortexa9/gcc/xil-crt0.s to initialize + * the global timer. + * Made changes in cortexa9/armcc/boot.S to initialize + * the global timer. + * Made changes in cortexa9/armcc/translation_table.s to + * map the peripheral devices as shareable device memory. + * Made changes in cortexa9/gcc/boot.S to optimize the + * L2 cache settings. Changes the section properties for + * ".mmu_tbl" and ".boot" sections in cortexa9/gcc/boot.S + * and cortexa9/gcc/translation_table.S. + * Made changes in cortexa9/xil_cache.c to change the + * cache invalidation order. + * 3.07a asa 08/17/12 Made changes across files for Cortexa9 to remove + * compilation/linking issues for C++ compiler. + * Made changes in mb_interface.h to remove compilation/ + * linking issues for C++ compiler. + * Added macros for swapb and swaph microblaze instructions + * mb_interface.h + * Remove barrier usage (SYNCHRONIZE_IO) from xil_io.c + * for CortexA9. + * 3.07a asa 08/30/12 Updated for CR 675636 to provide the L2 Base Address + * 3.07a asa 08/31/12 Added xil_printf.h include + * 3.07a sgd 09/18/12 Corrected the L2 cache enable settings + * Corrected L2 cache sequence disable sequence + * 3.07a sgd 10/19/12 SMC NOR and SRAM initialization with compiler option + * 3.09a asa 01/25/13 Updated to push and pop neon registers into stack for + * irq/fiq handling. + * Relocated COUNTS_PER_SECOND from sleep.c to xtime_l.h. This + * fixes the CR #692094. + * 3.09a sgd 02/14/13 Fix for CRs 697094 (SI#687034) and 675552. + * 3.10a srt 04/18/13 Implemented ARM Erratas. + * Cortex A9 Errata - 742230, 743622, 775420, 794073 + * L2Cache PL310 Errata - 588369, 727915, 759370 + * Please refer to file 'xil_errata.h' for errata + * description. + * 3.10a asa 05/04/13 Added support for L2 cache in MicroBlaze BSP. The older + * cache APIs were corresponding to only Layer 1 cache + * memories. New APIs were now added and the existing cache + * related APIs were changed to provide a uniform interface + * to flush/invalidate/enable/disable the complete cache + * system which includes both L1 and L2 caches. The changes + * for these were done in: + * src/microblaze/xil_cache.c and src/microblaze/xil_cache.h + * files. + * Four new files were added for supporting L2 cache. They are: + * microblaze_flush_cache_ext.S-> Flushes L2 cache + * microblaze_flush_cache_ext_range.S -> Flushes a range of + * memory in L2 cache. + * microblaze_invalidate_cache_ext.S-> Invalidates L2 cache + * microblaze_invalidate_cache_ext_range -> Invalidates a + * range of memory in L2 cache. + * These changes are done to implement PR #697214. + * 3.10a asa 05/13/13 Modified cache disable APIs at src/cortexa9/xil_cache.c to + * fix the CR #706464. L2 cache disabling happens independent + * of L1 data cache disable operation. Changes are done in the + * same file in cache handling APIs to do a L2 cache sync + * (poll reg7_?cache_?sync). This fixes CR #700542. + * 3.10a asa 05/20/13 Added API/Macros for enabling and disabling nested + * interrupts for ARM. These are done to fix the CR#699680. + * 3.10a srt 05/20/13 Made changes in cache maintenance APIs to do a proper cach + * sync operation. This fixes the CR# 716781. + * 3.11a asa 09/07/13 Added support for iccarm toolchain. A new folder "iccarm" + * is added that contains iccarm (iar arm compiler) specific + * BSP initialization code. Changes are done in other source + * files with inline assembly code to add support for armcc. + * Modified BSP tcl to add support for iccarm. + * Updated armcc specific BSP files to have proper support + * for armcc toolchain. + * Modified asm_vectors.S (gcc) and asm_vectors.s (armcc) to + * fix issues related to NEON context saving. The assembly + * routines for IRQ and FIQ handling are modified. + * Deprecated the older BSP (3.10a). + * 3.11a asa 09/22/13 Fix for CR#732704. Cache APIs are modified to avoid + * various potential issues. Made changes in the function + * Xil_SetAttributes in file xil_mmu.c. + * 3.11a asa 09/23/13 Added files xil_misc_psreset_api.c and xil_misc_psreset_api.h + * in src\cortexa9 and src\microblaze folders. + * 3.11a asa 09/28/13 Modified the cache APIs (src\cortexa9) to fix handling of + * L2 cache sync operation and to fix issues around complete + * L2 cache flush/invalidation by ways. + ********************************************************************************/ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/close.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/close.c new file mode 100755 index 000000000..173b55dc2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/close.c @@ -0,0 +1,55 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +#ifdef __cplusplus +extern "C" { + int _close(int fd); +} +#endif + +/* + * close -- We don't need to do anything, but pretend we did. + */ + +int _close(int fd) +{ + (void)fd; + return (0); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/close.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/close.o new file mode 100644 index 0000000000000000000000000000000000000000..971b18c995a157ed8ba53db7d18313c975d96954 GIT binary patch literal 1992 zcma)7-EQ1e5T0W@ZJOOI`K2wTk%NK~1hIF!E$I&`-LBfuDn+4Csa#pdUZ+{fSqIx& zH3-B7x7;FbkjM*E;<As?H>eO#Q1z0FFrW8K;^l^pboQISGiT;_&g@Tjw(csWNJ!Bd zok*;;OUuON64q#eW|=$ud+Esk>k)HSsdv;njOD%yrGjYEpryd6w)(1KuzsXcws(4L z5(_!bM1N4Q_pJJ`F<-MA7aFr_PR*R+b3FBV-ELg3-KeeB@6AJfYwEY#bv4f^PLMqb z%e{GvU7Z!G)o#{o$-u$+v<-mDp*L##50ebN&y1--RL7}9fx0bP!ms+LF-?3|D3h0> zC`t3!i&$iuD5KbIwP-o)CAOesX!FZQZr8o+ZFp_+lQhzaKa6x%_z(I~mUcT2zX@6! z>#eK)cSGItzds1mU?&fgAk6pu{d^;c(yWM|>1#pLPx@h=MSfoBK~E>?AP%0kgH|ih zKC6i~yWQ*V+SlnYi{k9S?WVo>c07o7-K~BRyO)}+w%5F}-oEyc$)@9R@;cUGpVSKK z*jVq-sj1VQNp;4Wa~9O1I%}U(=hb^^$@)Om+2x2yk@Z8PK24B?$_w}MgS|qB<mE*+ z!d>CGf`YuBE;M;zo|BiwiPww6;gg_0*h$$`@;VH&_^C*ISye}!>A{nDY;V#Z#Ny3I zkr$<VdolNs*LnEB(?yZ>!(lPLXD8EpvE=<Wh_=Ru=l&`QeIX471-c8g%nN>_XG8QE zlof&vw8{(n|Ie?<KC*||GTygf42kU%md}Wi@r%<$j~VB9AvfuM<Rg2SrC)j72V+QV z&<PLID_+ZB42cc72w$35aE%W@Y?u|*{0=$48P*}c(W@L`QrW{Sxg6js7()_om*r}_ zKRF)aAl?)&srMQ4*n@inJ!SzqA=t2fHYk2CS=kaNV}su>y!e~#i%Idb_eEfY59pAW z@Q|DA=YlaL{qj4@)jD2O?gcYd>cG^MUO|X$j`tjlAvp_JP9mdsxnXBm$z!s-Z^XmB z<IHNjCZGE*>x3kp$bwb9L$8lS546WBhFr}AvOQMo_zl4>w=#-qAHOz{ImrsyV=oZ< z@#Rm*=IMm_gnCDW8$BVL{wq(P7@4!FaqKbbEv{Y$`--NO9+~kznhO@Ehx4o&mH(2! sMI)aF@^xG^xD4cUSB?FW(SK@i3&@9J-r!FSHDLe81{Z*w?l~j>3(WGbNB{r; literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/config.make b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/config.make new file mode 100644 index 000000000..618f1f343 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/config.make @@ -0,0 +1,3 @@ +LIBSOURCES = *.c *.s *.S +PROFILE_ARCH_OBJS = profile_mcount_arm.o +LIBS = standalone_libs diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/cpu_init.S b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/cpu_init.S new file mode 100755 index 000000000..a4b1a6564 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/cpu_init.S @@ -0,0 +1,88 @@ +/****************************************************************************** +* +* (c) Copyright 2009-2010 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file cpu_init.s +* +* This file contains CPU specific initialization. Invoked from main CRT +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------- -------- --------------------------------------------------- +* 1.00a ecm/sdm 10/20/09 Initial version +* 3.04a sdm 01/02/12 Updated to clear cp15 regs with unknown reset values +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + + .text + .global __cpu_init + .align 2 +__cpu_init: + +/* Clear cp15 regs with unknown reset values */ + mov r0, #0x0 + mcr p15, 0, r0, c5, c0, 0 /* DFSR */ + mcr p15, 0, r0, c5, c0, 1 /* IFSR */ + mcr p15, 0, r0, c6, c0, 0 /* DFAR */ + mcr p15, 0, r0, c6, c0, 2 /* IFAR */ + mcr p15, 0, r0, c9, c13, 2 /* PMXEVCNTR */ + mcr p15, 0, r0, c13, c0, 2 /* TPIDRURW */ + mcr p15, 0, r0, c13, c0, 3 /* TPIDRURO */ + mcr p15, 5, r0, c15, c5, 2 /* Write Lockdown TLB VA */ + +/* Reset and start Cycle Counter */ + mov r2, #0x80000000 /* clear overflow */ + mcr p15, 0, r2, c9, c12, 3 + mov r2, #0xd /* D, C, E */ + mcr p15, 0, r2, c9, c12, 0 + mov r2, #0x80000000 /* enable cycle counter */ + mcr p15, 0, r2, c9, c12, 1 + + bx lr + +.end diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/cpu_init.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/cpu_init.o new file mode 100644 index 0000000000000000000000000000000000000000..7e89e1db21176313ec1cd1d6be85de5f161e0bc2 GIT binary patch literal 1420 zcmb7EO>fgc5Z$$tGzm?U6vU+!N~9usXze5g1*9GlA&P`rRQ2OlWUUjo7#SznPDN1> zJ#yi|fqRbJ_zOt<5QK8iAK(CQoZZAhNQjZf^JZrE&FqftcaL^=IOj|WXX|X{F}AM7 zne^S*tg|9p1R9P?#q_uaEfq84edx1d4z@7vLywDJ##(hax-@g+LS;Bwg(ZI*_SP@+ zN4o+F;RxGh{3c+!x!Go!{6ag+b6Q?s<U0sztV&P*bE&}4AoT?0tkWM@uJ1<1AtI1; z+@SuAaZ^e?wlz(|z7JS2IYDZAsup4i7Sro>gl7&qB8bdAw-fXpwhxZ1dULaW-+VO? zUGvR_-Lp<Z+q3MjZ}!8c)#(M1^IANxYNqGfVbC$dNcdgh^?b)V-?Hj;OPC0=$4`$d z?ZZmLXlxnx8jN4@GAm`ue3|RnmF(^8^)#9xS%u0*W1k+aDFQIUi<gnGVWVJTpDTn` zB4%_&B$#1`Av4+sdxnUjz_kaF13z#)qwCm%Gs|;*C+WNXX%AcDoUrY{IZtLqApA2B z{D-VyE!}iR?xFXlB{7+l#8p^Yr%OMQRv9&|I|yW<|5~>(S<_ehiH~Y1QG6`~6sFuK z=o11`RBju7P6c6)FevJy0HvAHImq9Ksy%@0JM<#~DJr)MKgo9jk_uwPw*XaqC%|eC zAnU`qK|qSi`S2B{)O$D;0#c|qk{8fq-AmLhAx3rcP*t}KtnL_)eFooK0#Z~hvXl38 zlDGoFSHLCcH7M~BKh;d~wNQ5%F(rym`G2$e+zE*<S(*GlSIo2OxLN9l{#X;C6VF7S zyBXr6$<9QNZz$=f;#sLkiTYa;Y^}>IOZ`!hG@u$%^bKejF4fmC5V{wN(>$knIS=xG E1GSQnQUCw| literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/errno.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/errno.c new file mode 100755 index 000000000..78a61a345 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/errno.c @@ -0,0 +1,59 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +/* The errno variable is stored in the reentrancy structure. This + function returns its address for use by the macro errno defined in + errno.h. */ + +#include <errno.h> +#include <reent.h> + +#ifdef __cplusplus +extern "C" { + int * __errno (); +} +#endif + +int * +__errno () +{ + return &_REENT->_errno; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/errno.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/errno.o new file mode 100644 index 0000000000000000000000000000000000000000..2fbbd1b6a982b878f8001114a8382c33e74525b7 GIT binary patch literal 6920 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 LOB#npx6J<s15gl* literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fcntl.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fcntl.c new file mode 100755 index 000000000..be641813a --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fcntl.c @@ -0,0 +1,54 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <stdio.h> + +/* + * fcntl -- Manipulate a file descriptor. + * We don't have a filesystem, so we do nothing. + */ +int fcntl (int fd, int cmd, long arg) +{ + (void)fd; + (void)cmd; + (void)arg; + return 0; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fcntl.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fcntl.o new file mode 100644 index 0000000000000000000000000000000000000000..435e339bdb4a3aef64e31deec9ba2c855cde91d6 GIT binary patch literal 2348 zcma)8&2QXP5T9pzKa$-n%}3RimS}^58bo97l0w=NC~1IF)S?nvB)+uRUT0%z;|;dA zYFZEnBo2r>2axDLfW(mlXRaJLaN&ZuaYIN5i9`6!+c#M+7Z~aJH@}&A^X848-|j~* zUVlj`MIwq;Xv~P}j`oz!YgnNLnuYe@*TqBcmv5n2+U}?&p!xxiSR06{1}&%3fNH7o zZyKs^GgzfRHB^2A*iI=<a<Zx=5J2TJgH!rmLxt->mQ`k|`Ub#Jr}0!R^)i5k7qdPj zRodyoEY@<kCse&w_R}7G?;=udW6Y|@8uK-~ak??9=G3t=5-d}#_8d&8$f(HcxaxA< zZd|H8Q#)I~HqXJ&Pk(-;PE;z9U1j^Vc?;9a1v<?|LAZH}ZZdF*4*j8Seg#F#89Yt< zjAh(4HgL-=TI8qtyD>v}P5fps6zzmb-giS#NJ(e0Tk3@6AgVt|dQJV{t`3td?j=#T z$wW`1tFPW}ZZ*%l>+TxqxQUqY^a*pg>!;&nntA;}==Z&0=%=}NBM#HS*5>xDPJ4Z| zeZhNw=y$z)2f?7TlLh@wknMZ>*?K1&q<M7Lzu0Mc{W!?d(93c^>H1hT>fBlDwA&ru zgLzcgQO($Dwu`CFiJHvLbTK10PsrkXQGT!=5nbKdy3|~GeK1VJC_QLy4Z6{lC<%9) z*W)~DKG|xoxvi&G*DgM8nz8Akn||a6F{x#4?E2~^m8UD4RW)VJIScBzI$@twr_{r0 z(Rx(j4A3D&k@Z2NK10k!_;r(;9qi?P0L;@7?uv#c<m7h!+$T54GIG<X?{=eL*z3f} z&Hyg0`$3RKcZ8we#XvvxlU_72w;v~wL}Mv(!@=HOgr>Ng+c#W4&(k;<=96=FQhyK4 z`v0OoK7`}YYvF^c_iOm*${^Br0&KRiZx|Hd)68-fgXjNOTnjNW2P$#C?^rP+zH{JH zVg%ko@^6517+jltjyzxHK&8Jh0#=NO?-g*-+4UC4l8Ipu-<t)U?f2nmvSLKyZi5%= zb3l&4#`SR@q`p3MnFE!+0J*@55%KMU7xOKEa30RbH<9GK3!Ue1A6b3`nUW;ntn&ES zpv3)*`=t$=h{Syc1K!!b*k?dIAwWs}prEsR1944OjBtG{Ut$#Zai-9hhv1Wa@GlTj z9LYN%UmvmYy1f4Af*m=}RnTV`=RvvOoR5*$Eauxl^NzzNBKr_7ShPFz`=Qtw?W5g~ ztoB4D?6)WOI<8vcr7ObaYZH#m6vUqR0y)3@21$Hf-%q^Xk#I-HV$;9*%-9Ldrp8gk z=xky4@+-9L({k7RxFD7*wNM`4hgOaBKL$qbDdQ<dyqHG}E-|9q731eK#Bom>eAeI# y2J!Q){rtUg+<OLl1`~rrgZB-7!iaT0HOS}9!e(^6cyMpn|AfH>MzrCi;r{?Z`1L9P literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fstat.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fstat.c new file mode 100755 index 000000000..2f647c70a --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fstat.c @@ -0,0 +1,58 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <sys/stat.h> + +#ifdef __cplusplus +extern "C" { + int _fstat(int fd, struct stat *buf); +} +#endif +/* + * fstat -- Since we have no file system, we just return an error. + */ +int _fstat(int fd, struct stat *buf) +{ + (void)fd; + buf->st_mode = S_IFCHR; /* Always pretend to be a tty */ + + return (0); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fstat.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/fstat.o new file mode 100644 index 0000000000000000000000000000000000000000..3f3f447ec24e993ebfaa39bf2847f5cddf2644e9 GIT binary patch literal 3456 zcmb7GTWlQF89rxbJl=SnjT1YmLoQt>28_Tn-q^$;gp1>(#M~4TP~ibav%6z^mG$m2 zGfU$Xgb)HD!~+6}3WS8Y6$uGMOCONhii;3Dv>?$3o~WvdA}XHR^3Y1Xq~CYuob?zU z5WjZL_utQd{&VKc-hceYA4w^NAt@%rx+FxWUs?KQ6ikQ_u~k@y*FG0w?Q>`9fiL!+ z_y2s%5&}PvBVR$Vd=$eGr4V9Bqb1$HKyAswXV6$y-<y=I{v80@>1(u7VLAPCR2KT4 zP|$xfz`2C{&@zLZzE7$7iu~v_M(0wpdk&LbrC*sW@;pGn>HiNUS@;v9A`JEl^El6A zupd%UTgbj}C$&vFyx1oDDYY-1BfE+0%MX$L8y((0LG}V_-)Dxt?HG<YJO2fv`&$go zt`DHG_6zqFptJi8C0TBXwmn}e$#GTnd;g)Nf*aHJ!%vhn;J#0(tlG4H(4C?*mgOwD zPs7LA_iN=j<nE(1^|F#i+}9~pRHycjx)6kOAhYdu-=Z{~*~;!A=A6lF<L-O3U7pz{ z+~3i5Fq1BGS)ntVNmK6cDIMZct^G5ipXvg3zVJ90DK^P9SmcbHgGl1uTlWb$2cLn( zI!wk=tacYE!XR%EgU)~HF1N}HOT$IGw5zmLZj(b;f;BFR#jBx0yER)t2|I*cI$XT6 zxG;<j7?yUaSfnT+x|@5pLjyweOSv#iePK*24EsePHhJ=z!7TjZ!G&SYbnU>;jt<gk zpikI^EU|^zi#ZXw2DhLXPN@iWV9h59T&E+xmM5Q677V-bU~M2rjU4D@=p!(e_!UR_ z@6u+0R}ih^n<xEtC-rY{G#jn6er3j+^%qVb500Joj~~0iUut#zFkbOt^s9J04{X(6 zs@15TJgcH6qp;fW5$R3Sq4)cyN2671cI%O!tR_M%CTW;@HP#oTtDPwEmRU`XRSrst zo~yOlGjgPIX~nWoev$?&X=5c4OO1MviuU3nMuvzMian!*AXFYf&{aMNQ8wW>+qJOi zcWYss`ZqOdaeIF5)U82fcCvEFzq=dO{d23;cCeUKn?W_{_?=`nsI}uXIvZXQOtAw= zT=Owms~$Gntthx>I;d2F(1#i|1WDsuBpR)DRs<NO?1XVt>2U{o+;oqd5m}+#R?=8% zMfGxRIgCXR)T4W{R8<syCJ~r(soZnoO~!7t>yb#7QRYTdU|JKz$V1PX>dJ<AmGRqY z>4=$o^P@bJlXaYn<ZktLay<ttLie~C*WG+udA_X9hAvK*t7}0nmQ-z?QB6}h=%H4g z?*f;HQp9!h^M}h5r`z4Q7R9UOd8m&@t=e+=#zq>I4@_02y{XG5r?0p~Pdew}goQkz zLXLy&o1L5!?m+)sL2k0PIU{nr{DD0xcghRoUTdEegYY>IlES*TG`LyGP$^O`l$Wfo zq+wNfNg8LkY&aZ{RCx6;4TV=t65+*B)2m0-?o!ZbEw*7&d|0i<*a<CROY@Fl9JZFC z4Y4@Sk@3b<!mG7cRw6XXn>%%r7p7_4sCLthF^h4CcjJ4|F8K0BP}ew+-{1TNVy=}j z?Pmi?$1>=R%t5*s53j24@|%K>i2<wfoycx7iapz9;Q47Z^cHT`H3V*hg0=DCd`Ix) z^F4-KuR>?Y*sh1d@U$I7p<~7=XS*ZE)BI!jmC0x_Ic|fTukZHFS^roc>oWB<!J8Pc z;wQ+*@30|bTZST^ZyEWRhxzbn=;b>Lo-ynr=>#VFr%3{tET0E88oz6>(G}<n8NbJ% zKuH~=@4(MD0??#h%kea?!LLk46W2?67EgX1om^k|U&!=jD|pP?qj!++wVt#-FXzu4 z5AisfF$5*Ql0$fykH|Um`POh=c0gyyti#9#^Lj`8{k+i=?cVA$t-YZV+U*T%U9Z~s zo30oci_DQNvOm8@Wvd-G67zHC*U851#QTct&4?XcCtG||M)PxIi&D>nIks_q=EFQ5 zigDcb*)^Ws3l_@bd=`4i{UY+;C~+qd8?#5_7!l=8Xgkjk{SIopO5+V0Pif@)M!&l> zp3&IR_*0D!YkX4UGa8@Q_;ZcF(D)mTA8P!A#y@KOtH!T2{!iloTEcopHD07~M&nV9 zCpF%sk$>(PcTVFY8lTemlEz<Zd`IKQ8b8zcmBs<|mie|5@$A&-6LB%{B=IjK_mTE@ MHI5Lm?W0=$KU|2%$p8QV literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/getpid.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/getpid.c new file mode 100755 index 000000000..6f5fb55de --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/getpid.c @@ -0,0 +1,59 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +/* + * getpid -- only one process, so just return 1. + */ +#ifdef __cplusplus +extern "C" { + int _getpid(); +} +#endif + +int getpid() +{ + return 1; +} + +int _getpid() +{ + return 1; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/getpid.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/getpid.o new file mode 100644 index 0000000000000000000000000000000000000000..fa7c9962c5b10aa7cd2b33ce7c0c62e5ed0f4c31 GIT binary patch literal 1968 zcma)7OK%%h6h3#x=_5`|9<JI_C~jrcAd#6Ew{jo6T=yZWrb4AGSfJ4zdy-i4BaFvY zf<UM{masr<f#1N7VF^M=EMZrvi|~Epdzy*5C`UST&Uaq-+<T9&zqx(?jxk1*jI7Ba z68YQ9J#&|Hu_mjs1piNeo<9ixQ27~rv#?U0YW83_mnR6qXXKeG6w`dq;S-SF*JAwA zTz`~_XBOzbN;h3hqg%|fd9$)w_ABQq%Vxza9fLiP4;K8&_41AKN2@e`IRE2Kr2BO# zm)|e@%zusfV3AV(<wskg-U55_2EXQ6Wl?Yj>>X@mJIQwYy`T#Wn#;@hO;g>hdL;zj zeeh|mQ@b3rf~G{XSeGK<VBEEXaN4zL7H;;t>A2H=_$X?$)*DyDFQ&E^ez_lyqpe9i zh~mj^xI1Y@-Eo>Fd-hti5f1wCB<+Ti%#M0?Fdik*<7U)oL^g!E(AM2f=X!1Jlkqg| zCh2~yGwvlflTml4cE6t`wRbie&0yoodh^;_uFH0Seb~gteKB=zskPpgWAn$`C(KE2 zrBpSi%xV9OIcr`u=e>*hO&oxXcwbc(7KJyX#IsdQoh-p*f0)@AGD~N2M>T9Mlb~la zD?vP&NRTFjpqIqc?WjN68pD<AHjdNeanWm2JK9c;Bn<kaL=#Y7g6?=YOfWn_`{8C_ zvn=h$)9h%@R%(X{d;FiovE?9O%yQz~7w1N&=>qJG^YbW?TTZH=k8}ylGkRIv24XY^ zYF_ViDvs3mHt<O`LM|N_*@0XJvo|u=dl#%ZP~~SZXI@Et4`5K8zTdz#Dvs2554gDQ z9@gc#a9ya+*R{|!2dX>;-=N}1ecW5I-nS^izFCiU-Nz6*b9g?aCcu-Knt$md^U0yq zxL*Mpz)BkT1P0v2uG;^CBUAv%IMNSb)rqTk1++FX`y+i1F7D$y?4t%7_fY}sK8SS& zpvo=O`-O@lU5he*aGd@3Ih-?$E5NUSS#Jr<HH-EB!NBr0Q_^~hRTk|f`S(EWl>U(& z6Bj!n_GP}9@It(v$}Gr#{wq?<NjW6{$jPyOSr*~u{$|7zJS0Cq(IVEDXlC<~t+||~ z74&x+lDgu<SF~=W-qVL$-|@U-4{frtht2ZdC{H<gmJ-MEx|0_uaT%AKzv1jxoV?@g gA3OZWNxm;0KJ1tE_`9a$pQMMy&p2Fnc+KJe0I=D%qyPW_ literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/inbyte.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/inbyte.c new file mode 100644 index 000000000..0036459e4 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/inbyte.c @@ -0,0 +1,14 @@ +#include "xparameters.h" +#include "xuartps_hw.h" + +#ifdef __cplusplus +extern "C" { +#endif +char inbyte(void); +#ifdef __cplusplus +} +#endif + +char inbyte(void) { + return XUartPs_RecvByte(STDIN_BASEADDRESS); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/inbyte.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/inbyte.o new file mode 100644 index 0000000000000000000000000000000000000000..636dea3c727e0ff74dcc9ade8788b5fa0ce1f1b3 GIT binary patch literal 2456 zcma)7&2Jk;6o0d8$8PMHI!S3uTQF5Bf*|WSDN0kI<U>%ZwgCl#3aVIk*PD2Svvzma zAt^;55TbDEr9u@4IF$>Bo>2b;4u~s%KySVE!Uc)&d*d1J8V>NZGr#veZ$9_aS1-LL zgdk0VrYV((uH>X8e_FycO;VM_=noHw)*k$|zyI(T=nZMhi9dj11Kl;LASx>~dS}RZ zuMWu+MUTNK{0=aB^K)ceeVsMA!t)Hp!Z`*}e4oL{8z{!i<$sg5JbKFI@<EuuW#l0% zbA?JD%J9sKL+C|Wyu+R#uE6+&#LvJH79>XnaSXh9SBO)rE53{#SQV!#6D6~9tWp)@ z;@}8kA4f@NOD~o#Ou&DNN~LqKqX@+oF{UM6DVr5`dZv6~f+Lqkzg;N{M2vj>xuB}J zy;5#KDhxdH?D-PvDdveY({VJlj9iH%E?3hQ7=zy6Ui?`ZBWxM(5>M8$>isVWy>_qZ z69u8Wm-rShH0=g$JK5{{vDISl-JTOA-Pmq@)R$4d9M&v}iHlXkK;m{M+^Wfrm$?_l z!B*%uYb;#ZK=hljz3zKED;R>L+mK5dJ)|C#<h7hAO)8~&yW=_Sde1}h`sKijI;+d; zZ`+N9nZ}v=wVu<gU*B^(_Gaw1Z8z@LyYYhUb)v-Ibr$W}dOL9A$g9VR6E+<T@7p`` zcB5fCb*TFla_w;oA+@2R)XZcN=hrrBtF_bCf;F#PWl(V4=hah7N_2j8^=xhWtxhlU z{AjPX+G+YLe(1Gomx9Ev&CNFEt=Si5<`<t;sg^D5f#W-FKw=7Peqm;rMn((EMRC9w z&rRaI9yX7Nqv8qiq;V1(#GAek5@g({l*a~F2<kp>#e3U{<B}C8Q6F2Hi~P2QRY}Nd zI*CJ;8^>g^vgy0MEjtJ|J1|M!aoxz@$y%Mr3Ag;AfOZi2Isjvk<#o2VeXOOmynfko zk|YY;UNRiB89CcHg8!SIf+wG3+%-x3&SVdM|M?-}`+A`7BKv!|dH84?jpNymWqF^0 zCK}U{?9+~YnVv&q|NrvidUOm}neSI-6lvQm<ZONSk^DY%Twfkd*S7>-$ABe%wLWG> zk+!Wv);ycOf>2{dk+!Wt&W_uKa1c5km*=O)<vr0cVChE)A2Opz+Z@Q*e4jz!Je+S7 zP3Pk$o@034OyhV)j_V|lndNpvq4u+|;0@?BX}>R_fT^qXHU$1*Xws?gK%sfI-GX0@ z8AV(l(`~fuJZ@&z<uTawJgVT4VnFvG+#N{iSUjeDDV1%vfOUqFA8(zH*PX}A=DUf- zn^rLl+1fMeA$^V>?PqP~kd^aiM_@T8_a==Q9>tU=FtwV5;xlB*9ZnVIKeCy)kz+9P z{QAT*PRW!jkd@gxC6g+HSialin9t$V+_w$>5K|6KHT8r0uRji-#S<um-wOlN;Cu!S zChsHTA%#a7v0*0^KFx^DnN#*fg%=g_edG9d6@H*l{&=AemCWav{k~B6jlx?BzhlI> c-z)q{A-@G2C+kMXYsr3B6;3i@GDnpBH#y1}P5=M^ literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/isatty.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/isatty.c new file mode 100755 index 000000000..a42edfa3b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/isatty.c @@ -0,0 +1,64 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +#include <unistd.h> + +#ifdef __cplusplus +extern "C" { + int _isatty(int fd); +} +#endif + +/* + * isatty -- returns 1 if connected to a terminal device, + * returns 0 if not. Since we're hooked up to a + * serial port, we'll say yes _AND return a 1. + */ +int isatty(int fd) +{ + (void)fd; + return (1); +} + +int _isatty(int fd) +{ + (void)fd; + return (1); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/isatty.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/isatty.o new file mode 100644 index 0000000000000000000000000000000000000000..ac3d3f15726f07bc42cd2589b23e701cf321b042 GIT binary patch literal 2652 zcma)8O>Epm6rQoY*)*Fh`BhsAVS^SmNW{*PkkAr-Ha}FM4XTn>f|Iem&aS169c*uv zEg*!DI3PH4L253D6PF$k2X6F$kU-qIfO6%6KwOXr-y6^DdRrlQ+VS`P=gpfLd*9u< z_A=+3DdKFN^(DssFodPBEMT5ZvkBObPi9Z8Ule`^n<nfA{~5?<@K_WI#>ORTe5i=T z8XqQwrWJk_Q2ZF68-*ZDnPwD^NjY5jUO@2+0;BM^fa1LjW(oN4PXL3LNoeyrfQWKy z?=b!uu(01?d_`H<5dRZOz9xLhj|wAS;kQP9a~N=$;7^pNN_zQ1d4f;!@gcZXS*i2_ zR47%l$Y7ZK#ZkR{x%6D=;^_7iIlnaW$@(at!sG>}50hnkN<)I7e{mHPA`?x^t`ksY z2K${~zawozGnzRNP}zeHk3b{a4=y9sb&|fq(AY6O`CsKRhVAAMFt`;Rrq*jgI|z@g z+OoN7ZSQT_n|s#Q=2fd1b}T18uwb-Y4ATVbT20R*^}>;eTJRk=un=i3kwfoyzef;y z?M}nDl5WCSkT_}DH9Zu;I$@Bc4YQRUx`J4TzQSjAW;6qpcETiRhJK^swVYT6_T$@8 z*sSzi=m=Tu$aC6O$8+M;+6lZk+Nkf|uxqOewP&q2J5Iy8-E|{-KXKc(n;cq)$*S!| zaq1sAm+VDaU=n*)k~(3-L3ZE1wPe?7wqrrfk`_D%=Np(@l=EOsNpRawyN5pO+o@Es zqARc7tZY<7|73bH*;$9O08-?ez^-g;T&~RTMV;95<8EamYWVAZ=(Q@>g4C}(y;xf^ z7oS;Jy7Z*XTQ|{Xhc=4wD%is6LY)nb6zjwMj5cXZ^BI0tKgZAWhxx4bIF1D!vr`af z+S}#PF(E@Gh|VY3iHN7c%%ppeIxaAcGi)giolTk9a8ievZjvxF_S<H|cRNix2=^nH z1n;<R?B7xnHZkw$#7@}s2V!w3edUd*nCV3a2R=Gw)^~SI9IrTVJLzD|e(W6hRPO(! z3vi^Hf(tB&-hugxMfa6x4ukx35<r_7^qyoRx`;vj`Y*pl_^24LBHs_hNK&?^AfHi6 z;0*{r0w*!3HX1bF8itAi%O)X2#7I)MS0F2%Oz%Nhmp%l__Ii#d{WmaFh>@iHZbHu2 zR~^avNA*!%s=hXO6$6%?K=_&%Ny^rOoX@w6e3Xasf$ilx0#7m2N1{7;t4ygRkcp-7 zzC`7B7aLQ9PLcBa2nv`EmHq^Rr39c#eVpUTJdFja+$7U_i9W^1uVW3xSD>SHJcOb8 zG65b_^=K0Y`Xnk+^ActsfXp(Drc|KBcSwFNGNd{4`Ie!0EDI4&l`p4yKyR?$PV;uX zxB5)04^%?)>0)pCF@v+{y{@Qub=#C&?1zHW#g6w?_h;Afb{d0uyyrq4?UOD#oR`VF zPdY32VzaZw*;$y0S91RYRCQRjp*~CMtu5Xc8p@{kq*h}1$CM%cEh70mAvWw$iF1TF z1M|{OXN&w+Bt9?ks>EH1bPvhz4T(*Op~Q~Fw<LZ*h<QJhcua^zeNKoxccuPIiQh^) c?Fjvgp`KE__*({?CK>HJC-qe+i*>;M50f-FHvj+t literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/kill.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/kill.c new file mode 100755 index 000000000..6b7df0c89 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/kill.c @@ -0,0 +1,67 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +#include <signal.h> +#include <unistd.h> + +#ifdef __cplusplus +extern "C" { + int _kill(int pid, int sig); +} +#endif + +/* + * kill -- go out via exit... + */ + +int kill(int pid, int sig) +{ + if(pid == 1) + _exit(sig); + return 0; +} + +int _kill(int pid, int sig) +{ + if(pid == 1) + _exit(sig); + return 0; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/kill.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/kill.o new file mode 100644 index 0000000000000000000000000000000000000000..a82fef5f2f02965643c383a16e82188992da572a GIT binary patch literal 3136 zcma)8OKclO7@k=_(<G*8TAETG2BkEJdN*!L(-sPG(^8^7NLnftB;>B`t+T?h!+KpM zZ4sy-5IrE^!U2g!s5eerxWR!7LR>f$2?;K!7Z6faREYyfgzuZ3vDX}cU!M8?*Zlv? zKacgRM~*)&r4)vwm=HZlh_h*BN$pWEA-0H3u+QJj&J=!u-v%MpZf0Nm{AVfFe)?;D z{nvl9J%j<4ij$Pvf$|2rrcwy8PopK%x4>F5dyZhG{!ozl0gy<h{AMVuWF|*tHiaIL z*-uEOzEO}#GEFkGlakEN1CsI#dbwAY0Hk{(5b`T9sb#+gBW-z#ZNIL?7a*qTy9FUL zaz1fKE->0KM0rp}qm@&?geK`0MLSr6{2^KtO^M$@Ow+e7T2?ZPH6rBz#~{jx+>sj{ zOysubM&u^B5gTBQi^0Jsp+X5Xo5ehA`P5J%cVO`G!JR{Mqja80e{g6>jv{SJB(k*3 zjamqhe*20<+#)QQt5>A3HoSKTTbGSTcw$J1fs~kok0NBiZoMLiTqSt2UD^l^yG_`P zmK1m7{55i8k%7Q*kpWDX)ZU8)f^k^5W~|hVqcJs+1&gPqeHR*16DHB34CHu9VIXi^ ze`=1LRt^gU<Ita4pHJ8$qL-mBz*yoV_VUl%u)w{+h9jYnPHQ=I&iW0%x#AS}*wfD3 z=_BRCr=25*k2&>b$8m!t2S%rYX4_yZPQ6;Cy0D@~6+E}%I~ZwC(V_eMr-$FHHaa!W zX|J}0c*$=x>?)_%Y5MK3W-oFw*nPE%#9ldCaEi}7t9mPm`8Hb3dR}$BN1Y~)def`r zDI7g{CO?~36A;Ry&)OT<r>-u#ftrOVdn<k{qB1y*R@H4dovIsz&I!L7v}Q}Eo+}rp z3&nlT%N@7oTwJZR%IDjaM!C{nc9z@I<!UPky%l$Vd6GqH2UVvXy3Lx433%lTQ{`f@ z>^e|KbL7Nz5!#CwneUsOUY(jtWTt=HzvzXl%bqB6q!34EXAk5jPPaNi)eBbhv#pwU z$ZJ*?^T++r%kQ2nPT7->6{hw-qKi|qQDK+cB_t1MYPwJo=?$4uRt{L3lAG}gY)y>G zZSo#@zr`m{;9`k&5boXO+|aPPE>J1rp*)<+zHYrEyL#&4dSSO$mqND!41)+44HtL~ z8wCr6U2{WM*p+r$*i_cMN~d1-o9A0FDc-GA0`G#6us3l>H*lMEuWu~Qt7p8CPT1Af z(vpV?+NDz`Y&Q%8ztRc&$D9w`B`;dp|LY%s8*3DOW}+J$zjH|)hL6R7<_Wj)eDUew zYsK;O<MXsb%LyO}8{9|gen9gm8vXyvFM3gWAsFvr69l|r`TE4?Ck7E8M$V6)DKozr z@Ma8H@jiq%$Y?UQlaLKh)7`kzziS_YvAr1MsUO0E@?<m_zvm&x=a<EyH1(t2%x@XI z8N(2}5bsMenv9Kgh{qd4Jl2!z#nQX+E`#S7)`xTp@kUJ$$Yj~x(rEl7idKZqknwvL z3WVS^743$fV+5cHeLcq0T!Y^X8BJU-X$>vDjy%?phmPymh-T_C0v>t0bRF?N?Ml78 z%&%TwZCgX|NhtYYH1UYc8ISiZ&NJ_VA+ru68;t9d;<t69Cnmb9kF<%t474ZJ9`(k= zqtT8<#V8>%F^TrRKLC*9m7|?I-=l;WRvNB1q8>*%p(>(HO6K3X9wo$G!f5y&@}DR7 z#So)yLo@Fs?dEeZ?uzkR{L`dg`!V`sGkLFxe0MA?6WcB<OrQHq+@g{3Eo|t08XqKL zuO_seXOI4SH6GM>OyenyynpmNr?IZFsj;K+lEycQ$a_`eJ4BTKV~sp}lt0t<uZf6% wL(AW5{E-O1+ZuUbD62ooh`$vj<2Y3ZbgU`!exi}*)*6of)KR}n%ahvvH=VX?6aWAK literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/lseek.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/lseek.c new file mode 100755 index 000000000..45e7ec3f9 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/lseek.c @@ -0,0 +1,69 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <sys/types.h> +#include <errno.h> + +#ifdef __cplusplus +extern "C" { + off_t _lseek(int fd, off_t offset, int whence); +} +#endif +/* + * lseek -- Since a serial port is non-seekable, we return an error. + */ +off_t lseek(int fd, off_t offset, int whence) +{ + (void)fd; + (void)offset; + (void)whence; + errno = ESPIPE; + return ((off_t)-1); +} + +off_t _lseek(int fd, off_t offset, int whence) +{ + (void)fd; + (void)offset; + (void)whence; + errno = ESPIPE; + return ((off_t)-1); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/lseek.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/lseek.o new file mode 100644 index 0000000000000000000000000000000000000000..338957d258bbbb8e15e4b0b84a3936708319767a GIT binary patch literal 3316 zcma)8OKclO7@k?LW9Q{2X$yT)w@O6{WH)XaLJNeXX=tlH)FvRo0aj~!6I*rcu)A)X zsz60Ss22n$I3Q6$xx)c*DHntg5=a~<7fwi3B@h=7Js=?n-#0sJud5>XlbP>-&p-d{ z&iduK<4;N{MNCqRh_)oeS6#}I-lt$hY!pKxJ3adI-)n2XY#+ONQ;c1@CB%<6vzI>m z>EHB6kkC-^rknuET~NHO6he$?G-TI0`pN7SXbdC$mx4?VkTTQNdMFGtvy;kf8Z#jC zEWkWRexSnHOy5?Jd4QSB%nT)&eF<PLU`oCJ9OksVj9E^|R{^9=5eRt`OxI!=Hb&+# zGAo$m1U;$BY?Tzr7BR9}Op{O{r-fNgshrHmZK-8wRyn5_^#MkdbBZ~?pr~>xD>^B% zc}yy2x6B~c+$84!vd3h+kb`n}Zhdbmw>38?hvWc`#~2p9y;D$OgPKKM<~<^nJJ9=R z@6q)r&yr8{MdJN^N7plQy6f$OeG;~=v`A$mM+4b15Oo~I?3Guf7?cG#c3UEu<gq>> zde&iSE}+Q7Y={>Hkv#y<2DK;yPKr|mnoaS$JoR473MO(mopd;T7l-+z!+gtuIk#c3 z1R{?hSpw}lFi--4=FSq@4yTh2?GoA!^GSzx3DNRMta?CfKj7rQ#W2JtoaLXnet|a+ zXUi8(+KrXaex_Qh*3a98eb%IXbYadpv|!I2I%Y4`o3`sO+c4Ti49fyrw3kXHsz=YO zs8P=?R&7LD<8)~K-|11Umuk(jX9uf+5VgSb&R8YXAe?Y@#S5$ot4Xk)@7EiV7SEA- zjZ+hHZ{@_^ieX{{wMKm@uO_~tL8ak``DQ(+F4etqo~jPPQ45O0C!fyG=2fji#dbI~ z78ji`(%;n>c%g72r&7iBqfNBeQ98TUD7iJeS#tf*K2a_CjoF#`r<}s%XyFn2g{E7! zFRT_D&SFrkImKYbUI`|h5^DF(yZfCnwm0xgb`ZMtvWp@-=j^ysC^)VSbyQk=yW|{4 zHA?7>s~XN#yn4xN^*E?r@Yq-(4$saW$d4>EntsXiSM#%tvUd=!mHhE)=;im06~?Wx ziP7=>dvuFtc)7SdUm=IVrYA>dL|0E{CM&y*A#;P=DDO>elAGlgd7rUM;>8qeASsNC zxxRj}0dh=ygb(JjmyI`MOHW-=FRWm7IdqG_(2uYZbG}!z(4<gUWjAz%RSW`QQCaqi z%_XN=Uu?jnc(+*ey|b}|^GG_nzFS}NI%4s3d$Bi`6IQ9QyzHU3*3A3~%MC-nT5N`$ zF^j&tjE4SyiY@@$dOC#PHQod<@$MpR#pqUCG?jaW7y!$=j;}2Jc)9J?atcT)N6?z- zOL`E4{{Q92dg2(cD&O&hB4$~0vc3@Y@jJ`<(im}l)8OM6u;L>K?~u_H+fG7`d76&k zP47x5VwNA!n5W-KY$#7gQ*7g>Ia%LzJd|<&sE_Mg0UyUOMIHIRBcmy{)gUMHeS>`L zC-;l3xAI*C&lvWHG=qi4<0O#Da=flF_6yOp0(3FOes4m7l31pq58-FW0x(W}Ey2@# z1AfzFG;zPAs~E|B+`vBa&~YCF7;#?)!N<=ESg`>Q?8js@#p@E)rL6S>J=i;xeCOkQ zM6Q|4H;twZ>li|uFQHOwQg4di){^$r9Z{){6}X<+vDZ6SNvS8boiU|;03_v(pAX2F z>>Ts+<lB@I{Q~V&`;N5Sd7DxR3$-bMpG*l#iFNpki1*<T_O~%%XSVGa@qI~q>vkV@ z#c)}FisFxf{@U?Ox8Xqf>ww6+$G~qG)@oo2JZmD?B5o$)P`MUyClTj5qV0VC==ZS3 z$2A_)IIofKApM@#ct)eIaaH3bjjw5ZOXIsltbbMGH6o7WQ;pY&$p595zt-~iTK<8E z_*+{4tCnwT{DX*my=WtGfQWosw7f&hd$ep3k#E1&t3G1lxlsSPMn3ySzy1vh{X<$F H)AoM=f-!_m literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/open.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/open.c new file mode 100755 index 000000000..0a5b553a6 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/open.c @@ -0,0 +1,61 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <errno.h> + +#ifdef __cplusplus +extern "C" { + int open(const char *buf, int flags, int mode); +} +#endif +/* + * open -- open a file descriptor. We don't have a filesystem, so + * we return an error. + */ +int open(const char *buf, int flags, int mode) +{ + (void)buf; + (void)flags; + (void)mode; + errno = EIO; + return (-1); +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/open.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/open.o new file mode 100644 index 0000000000000000000000000000000000000000..e328f0ac5ac328599af644a792436b1b44997025 GIT binary patch literal 2844 zcma)8O>7%Q6rR~#$4>0HP11_~0S2Ws2xT{J8bZro)3j7k)6%9O!2y|Fd*fJg?66)} zO;yy2N+2!>kPza4=%FVh4j>L3;J^)u9(qMwKouf@goNN$iST{1Gxi3M;3+fT`=2*& zX2-d5V(}>{r7$GLgy>5`T+Jv;=8%F3u~UqS+|kLO{@mRBB{OyXwwSv5gAm`{&RzXt z<7fC-%FmGx0p<6YI!YnLE{&FxX|!Tt%Yi%4*fJLqtV|ZG+E#Xhl9L@H<kZ@BE_+5P zGq)1k2tA$bEG3y+065MS%$W$&fGlE`GjczGWY(46K*$E&Wf<4NmN0U3k~5s=D3*F+ z0B$gciBV!m1zWr1j}WBesN8Zy?k|qz?c(0zh#ZyM2eA2Zk<UMow-IP-7S%Z0pk2U@ zG7kvCfGeLY*u^9HNAm{?3u6pEI`HnXf`l!b!M15x7_*QN9Y`D#aq#t5q!^K9I1afY zo#e3s>jXI%mUvkqw+^1$=usA&6lV!EJK}eF_Jf`kOyY1Z?Qrg29G21!OFf5u$e^!4 zFR3{JDn3>A_c_Zu#bJS~htuSZlU{o*_MU4r8?B38`H(y7Eu245Iey+dar~55Z*@IC zTJ>P`0u0v$8+i3<mFmfhDrz$HgNBDlcbX2pzrTAlTGeK^7J8laju7p&u;o@!f(WCi z)pl2s+n-UJuxI4K70W@D&33C^QWGyPgG9I0Y1CU`twhagyB3P&reE)flV_eS&6iXe zLPczGtgiS`qW-6?=ct^#X1nS)y>8WyV()aL8nx%=mY%7UXD7>#crSJRns;eEXjhgy zL9-Hc*1WaOY^B<c;_#w>xH855bfT))iTzg1$68_K!gQrvuJ|6*Nd+vtQc?Rhedw$p zL#bB?J@hVBO^G?tUJB#&wNQwY^Ycea6X)CAs2WD=rFnGXSlFtrlolItSUNaWo_42Z zCZ`WSsCzQ!qS-#rO2~1rnc2xXF));!%gI4&)Y&0-%De1ca<|+g@3HRZ?cm+s1W93C zE*6Hx4#<XhxsDZc*Q__->2}svV?O}KQGzRmi^8Uh*2KcC`LQqDpwkg9m9;SF)+>$H zavLVa`#}(e7mS2cNIUwG->QdOVsR-$<BjEnTWzndhUlC-w{+U|<2Y&r-FR!va^$a~ zcmJR6g)4i3M?n$a<MfBc@1C?5V^DF)<P6~z0gER?#nX>6pD^aLF-VIE^k&*fe8=hk zUw*8|#DG=#ekG&H*rp(->notX4d_^32E){M6ugN6D~>>Tn~Wx7I|JG9G~I-7P5Tgx z?S&Li{nPlsOJp<|zvm&R>-z)sZHJEaQE%#718-u$iZ=3nMn;pdH6f?-Ir;v1fbHeG z44yIU59t6JzQ-hiOqSy{jmB>d1(l&QWc=QQ0x4Lgq6mJT5r8K3jTBGw4fsuv(F9S^ zb<F8~6j1zj=-3w`{diACFw9*6D{jK@F&Rx}U1IV>kr=*0a0yC&+a@28Yo_yUK*2k1 z$mBD!!L;5Hzik>l(eCX&(b`*9pxse>>BpqA(axLNCtLk!re$`bPxhA1F`g&iCtD0F z4fmT+pQCK6j%bsT@n1!XY_Uxk4c~-O?2qSSNM+MMbmP7luO&ZV=IK{ww+{!$x5dKm zI^SChCGsqZJ2mbm;?VBacpnkp2k#aA9@hA{#^V}KX<X9CZ;bvgYOHH)Y3yozRpVPk wtox3}_lRimM;bpNBH!m){!+_dYxx!t@!x8_+9xLVh58RQ^6pu~$-7GZUqT>B>Hq)$ literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/outbyte.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/outbyte.c new file mode 100644 index 000000000..8b56036b7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/outbyte.c @@ -0,0 +1,15 @@ +#include "xparameters.h" +#include "xuartps_hw.h" + +#ifdef __cplusplus +extern "C" { +#endif +void outbyte(char c); + +#ifdef __cplusplus +} +#endif + +void outbyte(char c) { + XUartPs_SendByte(STDOUT_BASEADDRESS, c); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/outbyte.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/outbyte.o new file mode 100644 index 0000000000000000000000000000000000000000..14cb871f0470c4ac1c54ef2271fdbe1e12d486da GIT binary patch literal 2596 zcma)8&u<$=6n?X7$4=syCQYC}XmL@h7Esr5Q<Sz8XcC~Hwo%kl1PEl-_9nLE*kN~F znyLs1BoLf>K|LTu4*dh*z!`ey1QI7MRXHHU0mKau;rnK1?6o++Q+B@hz4zwLo3}gT zyz}gZ=af=nMafYaFp=$y_GC|JI4UzTC9-S#t{U6EC$e(y@132WzlG1y{*3Z~>Q@X` zwE?jPo!&`tUM+*UD&HhHxgx;n%^w%%wdZNc<W3XvxeEl9uM?c?AKI7wPW!SLC6mdv zIx#{<e$>9)p#)}7dRF}aq9*h%xVrPUsIPz{by#15Ldnsi&5~Cc#Jac9hS4Ws9X-qd zQIqO$ard}e++UnjQ)<@;GTo2jPLDq^{=#ldn3eJIr{G69M$Kb&Pd#05iwrta;JmYA zx0VVD@gv#(WCyu&AHJ((QhmHssKA-;Ps<)DoGGA)tZ)%6NQ-x}N?_F)`CYAkrac%Q z#ABLoP5qwJ(9-@@j_S|igkYEK3?Aiq<>ar`skeKLK&0D?Yg=*PvGH=P)vm@{n?d9? z8Gfzjhw)}qZN8Oo>{YMp7L+QVpL86gZg)HDB|Y%<M9pp(mwKJ3wcZIDC7OoFxs@xW z<<bdn!J8L7X~;XsHDs<g{cw;*vvRvz_uJ)O9R-#zw(4PbdGXSV)yl%L%E|JZJ-<=D zzE$g1*P>dxT8lQzo6$nGj?#i_{;BF*x!tNoVZ9v1ey8DM)u4KHzFMhN{W8o+VJzMB zM$B&X%7cC-du80qS5U@kRJ|N@8cS#<CR`8LN0D>O%co06FL!%kJqWi-%iTt>6m;s% z(uGzWl#b6;=DoSckIkQY#584*r^yfeT1(U{)a=5sMHv~(E#}pzGnJWEGwK0%kJ_vD zse{hL3ZISaK$JK)iiHUwx55ucyl879_G`d6Ot5LSFlc*dNGx8%kA3lKQ6wIXjiA<B zueLgCUAVOF*J@#K)iU%x9q5OCXFV92+irCN8;#|}t9Lgx0(8n-ymZm?<2Y>9dhzg_ zwb0){!~VZKgiwChI9XbFU+Fy?o?K%h`@u(zjc@{l2a9Ko^BG6ZJAmB9LwP2F{zxC? zF+7a_uQ=9Y=Rno@zNccu`sTpX^_>Cv8aCFK#bfI`3*F9vD*Hg*r((qVR=}-J*EYx@ z6GO1R*Hb#}ci<>dF=FFh0Z-TW7YO^z`e?WHZ9=zmpvqm44Jt;guMM8gR~Q?-k8${H zz8lavhy9_f;O;qSlYmp@^MOGd*T##fz-Gn9-Gl)ymZ{}a5dJt>v8ivvV0HSwL0pN7 z5!Of9#*^O1H1@FzHui;R_b~|_Df;pY$QOM!Sc_{W*LvdoDTj4ooCdY|h+H$BFAu|` z$rL@NYfqVn_LPy|cG5m~$jkic705HfcQcUTRb2h04!o|Q_>{Q%#0(7XQ0JI`IJ+wo z!haRG-$Vu)xtsDNoY4bu<vwBGDV#Zl{q5B(8FaS6RX*#>Y@>hO|LZyzeXkxsLf$nF zw#IwbLCIW$IAf4&;Ac?|7(7J8cX8bKPZ>OK@RC8EG3I&0;JU$%L7oNr-!u4;!J7te k5wY$k20tg_lKRr{J4DRa^<&`v8P7X_$ZyP<5ZPn+KS=o}{Qv*} literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/print.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/print.c new file mode 100755 index 000000000..be29280ca --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/print.c @@ -0,0 +1,31 @@ +/* print.c -- print a string on the output device. + * + * Copyright (c) 1995 Cygnus Support + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + * + */ + +/* + * print -- do a raw print of a string + */ +#include "xil_printf.h" + +void print(const char *ptr) +{ +#ifdef STDOUT_BASEADDRESS + while (*ptr) { + outbyte (*ptr++); + } +#else +(void)ptr; +#endif +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/print.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/print.o new file mode 100644 index 0000000000000000000000000000000000000000..89b47e88fa3e843102a5a8f191d9b72417b06ccb GIT binary patch literal 2592 zcma)8OK4nG82-<_Gnt#$G>@kCrH+!?h~!SjRAXDMd8j4yK}jnjDC3=(n`B@z6Ytz9 zO{r8w6c>svirXyQ=t2+#anW4`m+oAOh!D|@;zB4ie&4z0WbWuf|8URuzt8`l|K2mX z`TY48lu}|z$&_>@k?oAOWKU?Ak_j1;k@@LgWPbZck?(#Mx%AV>o437tySu+C`BTex zcXtm%w{r(Ej*iQyBS3W<%S&1z*d`%I_5A_PQQk7a$==hD`vKr)vh`*xP9~S9(#v86 z<faLk?3WsH9_oe5H<Xn393Ydqi8UKx=~KtCssp+wyQlgJy4+?Q!LS9kfX6$Cg?i~% z-(z*Alp0_LM31Ut`SC$Fe<VMu#?(k3tdlZ0cm^sIX;=^Y?t^xD99uskgg#$AJLKk1 z4W1r6KE%-ZzK<7&6fC){xE}S(;||h!@4cmDRFz=qPscnxBr=fIxpXBQh9hqXk<Ea| zwq1fdrgw?3U$a-N?I;*C3#-~20TpMp-RG+A=7$CE1dj}llFbNH@T(BzTD?)$;;O$+ z8LjH9?g8b`tW7%}0voO7T0t)yUZ>fvuQkJ3fx_8~FBX;xC;T~oHpwbo=N`xEdJuI( zwNz}hszIaJsRmJ8yil)3t)+#PE9KJMbm^($>z$xhyuMXwl~>!9M!C}7EN-^v%GFjB zhu4CW<(XomUTH_wVml6+wE(+@<*T#hQmGsip-#$Rg|=5+S5HZ;PF&fFLus!gX`#nt zI@Dz*W~OS_uZQv0W{AUGS~^vjy4>nS)iByBEVXLkV%V&%7tYt?u<-ayY1W^4VtV%E zqvmK9IENq%Ds@qlJmb0P1?d~eEqJQm8O!Wf6Y4(qpgN=us|TEi700~`QsUgm4-M<l zL#2st$ztAn+xY;a^xIn-aZmxqQG)B1i^7JFql(3^1#uvLrQH^v%34_Itd;A{)fP;e z4=R-?ylN#(CG8kQL31taiEY%Iq4mag;#XT68zBzJUs$=|2XP$LE1kGEW;F^naB%;h z9)v4jSbR*Hcwe!1OZ;L;yodTVmn>5d_zB_5)A979e9Xu$kn~Cddn@-MJ%)$=|K-Pe zYz$bP?^`m4tZfEzy1p3*^kaQlJhr}h@HPglOhR~vj3H~g2-)&9eFou-@gZ2-t0|uP z9T*B^3|YUIA*bv63&IF=tdDwI-zIn)16Dj-6X(bnvbF}~bUtsOJC8xwY`z=d8N>4- zT}Hl9n*=ghKJOZ|el-lH1f3=8_aPK8u}n?3AQY_tw5dNy@igCo-xL``tdF#fC*8*g z`WS(Z=R&l7jDkmsJ^Bs87kg57U+$mW*NJf_CsKft*SgI|<euq#9u)T{A$qlaq*VXX zXXN+YwB6n7KGC{8J8-{DPp{potv}z?F1do@Q{?I|rmJxOk<ArOzDuqQ3-37gn^2dd z?4~S<jGyHcxv~#`32}B~=x-ur*V*jFKN-km&HOmoD<8f*_oEmd?-vK{upS3xa-Kxy zBOW4RaGU}0AtK%d?n^u0G2)X3pD}pO;EF+hXY_l`;F`gv!Hz+G^YnY4i2Xh?c#G(X ed}{D>qyL%+f87Tb_RhG|2HB@GEW-bWsQ()+!5*6c literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/Makefile new file mode 100755 index 000000000..9a33fda02 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/Makefile @@ -0,0 +1,65 @@ +####################################################################### +# +# Copyright (c) 2002 Xilinx, Inc. All rights reserved. +# Xilinx, Inc. +# +# XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +# COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +# ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +# STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +# IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +# FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +# XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +# THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +# ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +# FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE. +# +# $Id: Makefile,v 1.1.2.1 2011/05/17 04:37:55 sadanan Exp $ +# +# Makefile for profiler +# +####################################################################### + +# PROFILE_ARCH_OBJS - Processor Architecture Dependent files defined here +include ../config.make + +AS=mb-as +COMPILER = mb-gcc +ARCHIVER = mb-ar +CP = cp +COMPILER_FLAGS=-O2 +EXTRA_COMPILER_FLAGS= +LIB = libxil.a +DUMMYLIB = libxilprofile.a + +CC_FLAGS = $(subst -pg, , $(COMPILER_FLAGS)) +ECC_FLAGS = $(subst -pg, , $(EXTRA_COMPILER_FLAGS)) + +RELEASEDIR = ../../../../lib +INCLUDEDIR = ../../../../include +INCLUDES = -I./. -I${INCLUDEDIR} + +OBJS = _profile_init.o _profile_clean.o _profile_timer_hw.o profile_hist.o profile_cg.o +DUMMYOBJ = dummy.o +INCLUDEFILES = profile.h mblaze_nt_types.h _profile_timer_hw.h + +libs : reallibs dummylibs + +reallibs : $(OBJS) $(PROFILE_ARCH_OBJS) + $(ARCHIVER) -r $(RELEASEDIR)/$(LIB) $(OBJS) $(PROFILE_ARCH_OBJS) + +dummylibs : $(DUMMYOBJ) + $(ARCHIVER) -r $(RELEASEDIR)/$(DUMMYLIB) $(DUMMYOBJ) + +%.o:%.c + $(COMPILER) $(CC_FLAGS) $(ECC_FLAGS) -c $< -o $@ $(INCLUDES) + +%.o:%.S + $(COMPILER) $(CC_FLAGS) $(ECC_FLAGS) -c $< -o $@ $(INCLUDES) + +include: + $(CP) -rf $(INCLUDEFILES) $(INCLUDEDIR) + +clean: + rm -f $(OBJS) $(PROFILE_ARCH_OBJS) $(LIB) diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_clean.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_clean.c new file mode 100755 index 000000000..b4e3e3347 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_clean.c @@ -0,0 +1,33 @@ +// +// Copyright (c) 2002 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: _profile_clean.c,v 1.1.2.1 2011/05/17 04:37:55 sadanan Exp $ +// + +#include "profile.h" +#include "_profile_timer_hw.h" +#include "xil_exception.h" + +/* + * This function is the exit routine and is called by the crtinit, when the + * program terminates. The name needs to be changed later.. + */ +void _profile_clean( void ) +{ + Xil_ExceptionDisable(); + disable_timer(); +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_init.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_init.c new file mode 100755 index 000000000..e3a8a0143 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_init.c @@ -0,0 +1,80 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-2011 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: _profile_init.c,v 1.1.2.1 2011/05/17 04:37:56 sadanan Exp $ +// +// _program_init.c: +// Initialize the Profiling Structures. +// +////////////////////////////////////////////////////////////////////// + +#include "profile.h" + +// XMD Initializes the following Global Variables Value during Program +// Download with appropriate values. + +#ifdef PROC_MICROBLAZE + +extern int microblaze_init(void); + +#elif defined PROC_PPC + +extern int powerpc405_init(void); + +#else + +extern int cortexa9_init(void); + +#endif + + + +int profile_version = 1; // Version of S/W Intrusive Profiling library + +int binsize = BINSIZE; // Histogram Bin Size +unsigned int cpu_clk_freq = CPU_FREQ_HZ ; // CPU Clock Frequency +unsigned int sample_freq_hz = SAMPLE_FREQ_HZ ; // Histogram Sampling Frequency +unsigned int timer_clk_ticks = TIMER_CLK_TICKS ;// Timer Clock Ticks for the Timer + +// Structure for Storing the Profiling Data +struct gmonparam *_gmonparam = (struct gmonparam *)0xffffffff; +int n_gmon_sections = 1; + +// This is the initialization code, which is called from the crtinit. +// +void _profile_init( void ) +{ +/* print("Gmon Init called....\r\n") ; */ +/* putnum(n_gmon_sections) ; print("\r\n") ; */ +/* if( _gmonparam == 0xffffffff ) */ +/* printf("Gmonparam is NULL !!\r\n"); */ +/* for( i = 0; i < n_gmon_sections; i++ ){ */ +/* putnum(_gmonparam[i].lowpc) ; print("\t") ; */ +/* putnum(_gmonparam[i].highpc) ; print("\r\n") ; */ +/* putnum( _gmonparam[i].textsize ); print("\r\n") ; */ +/* putnum( _gmonparam[i].kcountsize * sizeof(unsigned short));print("\r\n"); */ +/* } */ + +#ifdef PROC_MICROBLAZE + microblaze_init(); +#elif defined PROC_PPC + powerpc405_init(); +#else + cortexa9_init (); +#endif +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_timer_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_timer_hw.c new file mode 100755 index 000000000..7f9548336 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_timer_hw.c @@ -0,0 +1,346 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-2010 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: _profile_timer_hw.c,v 1.1.2.1 2011/05/17 04:37:56 sadanan Exp $ +// +// _program_timer_hw.c: +// Timer related functions +// +////////////////////////////////////////////////////////////////////// + +#include "profile.h" +#include "_profile_timer_hw.h" + +#include "xil_exception.h" + +#ifdef PROC_PPC +#include "xtime_l.h" +#include "xpseudo_asm.h" +#endif + +#ifdef TIMER_CONNECT_INTC +#include "xintc_l.h" +#include "xintc.h" +#endif // TIMER_CONNECT_INTC + +//#ifndef PPC_PIT_INTERRUPT +#if (!defined PPC_PIT_INTERRUPT && !defined PROC_CORTEXA9) +#include "xtmrctr_l.h" +#endif + +extern unsigned int timer_clk_ticks ; + +//-------------------------------------------------------------------- +// PowerPC Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_PPC405 + + +//-------------------------------------------------------------------- +// PowerPC PIT Timer Init. +// Defined only if PIT Timer is used for Profiling +// +//-------------------------------------------------------------------- +#ifdef PPC_PIT_INTERRUPT +int ppc_pit_init( void ) +{ + // 1. Register Profile_intr_handler as Interrupt handler + // 2. Set PIT Timer Interrupt and Enable it. + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_PIT_INT, + (Xil_ExceptionHandler)profile_intr_handler,(void *)0); + XTime_PITSetInterval( timer_clk_ticks ) ; + XTime_PITEnableAutoReload() ; + return 0; +} +#endif + + +//-------------------------------------------------------------------- +// PowerPC Timer Initialization functions. +// For PowerPC, PIT and opb_timer can be used for Profiling. This +// is selected by the user in standalone BSP +// +//-------------------------------------------------------------------- +int powerpc405_init() +{ + Xil_ExceptionInit() ; + Xil_ExceptionDisableMask( XIL_EXCEPTION_NON_CRITICAL ) ; + + // Initialize the Timer. + // 1. If PowerPC PIT Timer has to be used, initialize PIT timer. + // 2. Else use opb_timer. It can be directly connected or thru intc to PowerPC +#ifdef PPC_PIT_INTERRUPT + ppc_pit_init(); +#else +#ifdef TIMER_CONNECT_INTC + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT, + (Xil_ExceptionHandler)XIntc_DeviceInterruptHandler,(void *)0); + XIntc_RegisterHandler( INTC_BASEADDR, PROFILE_TIMER_INTR_ID, + (XInterruptHandler)profile_intr_handler,(void*)0); +#else + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT, + (Xil_ExceptionHandler)profile_intr_handler,(void *)0); +#endif + // Initialize the timer with Timer Ticks + opb_timer_init() ; +#endif + + // Enable Interrupts in the System, if Profile Timer is the only Interrupt + // in the System. +#ifdef ENABLE_SYS_INTR +#ifdef PPC_PIT_INTERRUPT + XTime_PITEnableInterrupt() ; +#elif TIMER_CONNECT_INTC + XIntc_MasterEnable( INTC_BASEADDR ); + XIntc_SetIntrSvcOption( INTC_BASEADDR, XIN_SVC_ALL_ISRS_OPTION); + XIntc_EnableIntr( INTC_BASEADDR, PROFILE_TIMER_INTR_MASK ); +#endif + Xil_ExceptionEnableMask( XIL_EXCEPTION_NON_CRITICAL ) ; +#endif + return 0; +} + +#endif // PROC_PPC + + + +//-------------------------------------------------------------------- +// PowerPC440 Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_PPC440 + + +//-------------------------------------------------------------------- +// PowerPC DEC Timer Init. +// Defined only if DEC Timer is used for Profiling +// +//-------------------------------------------------------------------- +#ifdef PPC_PIT_INTERRUPT +int ppc_dec_init( void ) +{ + // 1. Register Profile_intr_handler as Interrupt handler + // 2. Set DEC Timer Interrupt and Enable it. + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_DEC_INT, + (Xil_ExceptionHandler)profile_intr_handler,(void *)0); + XTime_DECSetInterval( timer_clk_ticks ) ; + XTime_DECEnableAutoReload() ; + return 0; +} +#endif + + +//-------------------------------------------------------------------- +// PowerPC Timer Initialization functions. +// For PowerPC, DEC and opb_timer can be used for Profiling. This +// is selected by the user in standalone BSP +// +//-------------------------------------------------------------------- +int powerpc405_init(void) +{ + Xil_ExceptionInit(); + Xil_ExceptionDisableMask( XIL_EXCEPTION_NON_CRITICAL ) ; + + // Initialize the Timer. + // 1. If PowerPC DEC Timer has to be used, initialize DEC timer. + // 2. Else use opb_timer. It can be directly connected or thru intc to PowerPC +#ifdef PPC_PIT_INTERRUPT + ppc_dec_init(); +#else +#ifdef TIMER_CONNECT_INTC + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_NON_CRITICAL_INT, + (Xil_ExceptionHandler)XIntc_DeviceInterruptHandler,(void *)0); + + XIntc_RegisterHandler( INTC_BASEADDR, PROFILE_TIMER_INTR_ID, + (XInterruptHandler)profile_intr_handler,(void*)0); +#else + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT, + (Xil_ExceptionHandler)profile_intr_handler,(void *)0); + Xil_ExceptionRegisterHandler( XIL_EXCEPTION_ID_NON_CRITICAL_INT, + (Xil_ExceptionHandler)profile_intr_handler,(void *)0); +#endif + // Initialize the timer with Timer Ticks + opb_timer_init() ; +#endif + + // Enable Interrupts in the System, if Profile Timer is the only Interrupt + // in the System. +#ifdef ENABLE_SYS_INTR +#ifdef PPC_PIT_INTERRUPT + XTime_DECEnableInterrupt() ; +#elif TIMER_CONNECT_INTC + XIntc_MasterEnable( INTC_BASEADDR ); + XIntc_SetIntrSvcOption( INTC_BASEADDR, XIN_SVC_ALL_ISRS_OPTION); + XIntc_EnableIntr( INTC_BASEADDR, PROFILE_TIMER_INTR_MASK ); +#endif + Xil_ExceptionEnableMask( XEXC_NON_CRITICAL ) ; +#endif + return 0; +} + +#endif // PROC_PPC440 + +//-------------------------------------------------------------------- +// opb_timer Initialization for PowerPC and MicroBlaze. This function +// is not needed if DEC timer is used in PowerPC +// +//-------------------------------------------------------------------- +//#ifndef PPC_PIT_INTERRUPT +#if (!defined PPC_PIT_INTERRUPT && !defined PROC_CORTEXA9) +int opb_timer_init( void ) +{ + // set the number of cycles the timer counts before interrupting + XTmrCtr_SetLoadReg(PROFILE_TIMER_BASEADDR, 0, timer_clk_ticks); + + // reset the timers, and clear interrupts + XTmrCtr_SetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, + XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK ); + + // start the timers + XTmrCtr_SetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, XTC_CSR_ENABLE_TMR_MASK + | XTC_CSR_ENABLE_INT_MASK | XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK); + return 0; +} +#endif + + +//-------------------------------------------------------------------- +// MicroBlaze Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_MICROBLAZE + +//-------------------------------------------------------------------- +// Initialize the Profile Timer for MicroBlaze Target. +// For MicroBlaze, opb_timer is used. The opb_timer can be directly +// connected to MicroBlaze or connected through Interrupt Controller. +// +//-------------------------------------------------------------------- +int microblaze_init(void) +{ + // Register profile_intr_handler + // 1. If timer is connected to Interrupt Controller, register the handler + // to Interrupt Controllers vector table. + // 2. If timer is directly connected to MicroBlaze, register the handler + // as Interrupt handler + Xil_ExceptionInit(); + +#ifdef TIMER_CONNECT_INTC + XIntc_RegisterHandler( INTC_BASEADDR, PROFILE_TIMER_INTR_ID, + (XInterruptHandler)profile_intr_handler,(void*)0); +#else + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, + (Xil_ExceptionHandler)profile_intr_handler, + (void *)0) ; +#endif + + // Initialize the timer with Timer Ticks + opb_timer_init() ; + + // Enable Interrupts in the System, if Profile Timer is the only Interrupt + // in the System. +#ifdef ENABLE_SYS_INTR +#ifdef TIMER_CONNECT_INTC + XIntc_MasterEnable( INTC_BASEADDR ); + XIntc_SetIntrSvcOption( INTC_BASEADDR, XIN_SVC_ALL_ISRS_OPTION); + XIntc_EnableIntr( INTC_BASEADDR, PROFILE_TIMER_INTR_MASK ); + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, + (Xil_ExceptionHandler)XIntc_DeviceInterruptHandler,(void *)0); +#endif + +#endif + + Xil_ExceptionEnable(); + + return 0; + +} + +#endif // PROC_MICROBLAZE + + + +//-------------------------------------------------------------------- +// Cortex A9 Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_CORTEXA9 + +//-------------------------------------------------------------------- +// Initialize the Profile Timer for Cortex A9 Target. +// The scu private timer is connected to the Scu GIC controller. +// +//-------------------------------------------------------------------- +int scu_timer_init( void ) +{ + // set the number of cycles the timer counts before interrupting + // scu timer runs at half the cpu clock + XScuTimer_SetLoadReg(PROFILE_TIMER_BASEADDR, timer_clk_ticks/2); + + // clear any pending interrupts + XScuTimer_SetIntrReg(PROFILE_TIMER_BASEADDR, 1); + + // enable interrupts, auto-reload mode and start the timer + XScuTimer_SetControlReg(PROFILE_TIMER_BASEADDR, XSCUTIMER_CONTROL_IRQ_ENABLE_MASK | + XSCUTIMER_CONTROL_AUTO_RELOAD_MASK | XSCUTIMER_CONTROL_ENABLE_MASK); + + return 0; +} + +int cortexa9_init(void) +{ + + Xil_ExceptionInit(); + + XScuGic_DeviceInitialize(0); + + /* + * Connect the interrupt controller interrupt handler to the hardware + * interrupt handling logic in the processor. + */ + Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT, + (Xil_ExceptionHandler)XScuGic_DeviceInterruptHandler, + (void *)0); + + /* + * Connect the device driver handler that will be called when an + * interrupt for the device occurs, the handler defined above performs + * the specific interrupt processing for the device. + */ + XScuGic_RegisterHandler(SCUGIC_CPU_BASEADDR, + PROFILE_TIMER_INTR_ID, + (Xil_ExceptionHandler)profile_intr_handler, + (void *)0); + + /* + * Enable the interrupt for scu timer. + */ + XScuGic_EnableIntr(SCUGIC_DIST_BASEADDR, PROFILE_TIMER_INTR_ID); + + /* + * Enable interrupts in the Processor. + */ + Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ); + + /* + * Initialize the timer with Timer Ticks + */ + scu_timer_init() ; + + Xil_ExceptionEnable(); + + return 0; +} + +#endif // PROC_CORTEXA9 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_timer_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_timer_hw.h new file mode 100755 index 000000000..19499f7c5 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/_profile_timer_hw.h @@ -0,0 +1,292 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2004-11 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: _profile_timer_hw.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $ +// +// _program_timer_hw.h: +// Timer related functions +// +////////////////////////////////////////////////////////////////////// + +#ifndef _PROFILE_TIMER_HW_H +#define _PROFILE_TIMER_HW_H + +#include "profile.h" + +#ifdef PROC_PPC +#if defined __GNUC__ +# define SYNCHRONIZE_IO __asm__ volatile ("eieio") +#elif defined __DCC__ +# define SYNCHRONIZE_IO __asm volatile(" eieio") +#else +# define SYNCHRONIZE_IO +#endif +#endif + +#ifdef PROC_PPC +#define ProfIo_In32(InputPtr) (*(volatile u32 *)(InputPtr)); SYNCHRONIZE_IO; +#define ProfIo_Out32(OutputPtr, Value) { (*(volatile u32 *)(OutputPtr) = Value); SYNCHRONIZE_IO; } +#else +#define ProfIo_In32(InputPtr) (*(volatile u32 *)(InputPtr)); +#define ProfIo_Out32(OutputPtr, Value) { (*(volatile u32 *)(OutputPtr) = Value); } +#endif + +#define ProfTmrCtr_mWriteReg(BaseAddress, TmrCtrNumber, RegOffset, ValueToWrite)\ + ProfIo_Out32(((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + \ + (RegOffset)), (ValueToWrite)) + +#define ProfTimerCtr_mReadReg(BaseAddress, TmrCtrNumber, RegOffset) \ + ProfIo_In32((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + (RegOffset)) + +#define ProfTmrCtr_mSetControlStatusReg(BaseAddress, TmrCtrNumber, RegisterValue)\ + ProfTmrCtr_mWriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (RegisterValue)) + +#define ProfTmrCtr_mGetControlStatusReg(BaseAddress, TmrCtrNumber) \ + ProfTimerCtr_mReadReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET) + + + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PROC_PPC +#include "xexception_l.h" +#include "xtime_l.h" +#include "xpseudo_asm.h" +#endif + +#ifdef TIMER_CONNECT_INTC +#include "xintc_l.h" +#include "xintc.h" +#endif // TIMER_CONNECT_INTC + +#if (!defined PPC_PIT_INTERRUPT && !defined PROC_CORTEXA9) +#include "xtmrctr_l.h" +#endif + +#ifdef PROC_CORTEXA9 +#include "xscutimer_hw.h" +#include "xscugic.h" +#endif + +extern unsigned int timer_clk_ticks ; + +//-------------------------------------------------------------------- +// PowerPC Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_PPC + +#ifdef PPC_PIT_INTERRUPT +unsigned long timer_lo_clk_ticks ; // Clk ticks when Timer is disabled in CG +#endif + +#ifdef PROC_PPC440 +#define XREG_TCR_PIT_INTERRUPT_ENABLE XREG_TCR_DEC_INTERRUPT_ENABLE +#define XREG_TSR_PIT_INTERRUPT_STATUS XREG_TSR_DEC_INTERRUPT_STATUS +#define XREG_SPR_PIT XREG_SPR_DEC +#define XEXC_ID_PIT_INT XEXC_ID_DEC_INT +#endif + +//-------------------------------------------------------------------- +// Disable the Timer - During Profiling +// +// For PIT Timer - +// 1. XTime_PITDisableInterrupt() ; +// 2. Store the remaining timer clk tick +// 3. Stop the PIT Timer +//-------------------------------------------------------------------- + +#ifdef PPC_PIT_INTERRUPT +#define disable_timer() \ + { \ + unsigned long val; \ + val=mfspr(XREG_SPR_TCR); \ + mtspr(XREG_SPR_TCR, val & ~XREG_TCR_PIT_INTERRUPT_ENABLE); \ + timer_lo_clk_ticks = mfspr(XREG_SPR_PIT); \ + mtspr(XREG_SPR_PIT, 0); \ + } +#else +#define disable_timer() \ + { \ + u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(addr); \ + tmp_v = tmp_v & ~XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \ + } +#endif + + + +//-------------------------------------------------------------------- +// Enable the Timer +// +// For PIT Timer - +// 1. Load the remaining timer clk ticks +// 2. XTime_PITEnableInterrupt() ; +//-------------------------------------------------------------------- +#ifdef PPC_PIT_INTERRUPT +#define enable_timer() \ + { \ + unsigned long val; \ + val=mfspr(XREG_SPR_TCR); \ + mtspr(XREG_SPR_PIT, timer_lo_clk_ticks); \ + mtspr(XREG_SPR_TCR, val | XREG_TCR_PIT_INTERRUPT_ENABLE); \ + } +#else +#define enable_timer() \ + { \ + u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(addr); \ + tmp_v = tmp_v | XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \ + } +#endif + + + +//-------------------------------------------------------------------- +// Send Ack to Timer Interrupt +// +// For PIT Timer - +// 1. Load the timer clk ticks +// 2. Enable AutoReload and Interrupt +// 3. Clear PIT Timer Status bits +//-------------------------------------------------------------------- +#ifdef PPC_PIT_INTERRUPT +#define timer_ack() \ + { \ + unsigned long val; \ + mtspr(XREG_SPR_PIT, timer_clk_ticks); \ + mtspr(XREG_SPR_TSR, XREG_TSR_PIT_INTERRUPT_STATUS); \ + val=mfspr(XREG_SPR_TCR); \ + mtspr(XREG_SPR_TCR, val| XREG_TCR_PIT_INTERRUPT_ENABLE| XREG_TCR_AUTORELOAD_ENABLE); \ + } +#else +#define timer_ack() \ + { \ + unsigned int csr; \ + csr = ProfTmrCtr_mGetControlStatusReg(PROFILE_TIMER_BASEADDR, 0); \ + ProfTmrCtr_mSetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, csr); \ + } +#endif + +//-------------------------------------------------------------------- +#endif // PROC_PPC +//-------------------------------------------------------------------- + + + + +//-------------------------------------------------------------------- +// MicroBlaze Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_MICROBLAZE + +//-------------------------------------------------------------------- +// Disable the Timer during Call-Graph Data collection +// +//-------------------------------------------------------------------- +#define disable_timer() \ + { \ + u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(addr); \ + tmp_v = tmp_v & ~XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \ + } + + +//-------------------------------------------------------------------- +// Enable the Timer after Call-Graph Data collection +// +//-------------------------------------------------------------------- +#define enable_timer() \ + { \ + u32 addr = (PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET; \ + u32 tmp_v = ProfIo_In32(addr); \ + tmp_v = tmp_v | XTC_CSR_ENABLE_TMR_MASK; \ + ProfIo_Out32((PROFILE_TIMER_BASEADDR) + XTmrCtr_Offsets[(0)] + XTC_TCSR_OFFSET, tmp_v); \ + } + + +//-------------------------------------------------------------------- +// Send Ack to Timer Interrupt +// +//-------------------------------------------------------------------- +#define timer_ack() \ + { \ + unsigned int csr; \ + csr = ProfTmrCtr_mGetControlStatusReg(PROFILE_TIMER_BASEADDR, 0); \ + ProfTmrCtr_mSetControlStatusReg(PROFILE_TIMER_BASEADDR, 0, csr); \ + } + +//-------------------------------------------------------------------- +#endif // PROC_MICROBLAZE +//-------------------------------------------------------------------- + +//-------------------------------------------------------------------- +// Cortex A9 Target - Timer related functions +//-------------------------------------------------------------------- +#ifdef PROC_CORTEXA9 + +//-------------------------------------------------------------------- +// Disable the Timer during Call-Graph Data collection +// +//-------------------------------------------------------------------- +#define disable_timer() \ +{ \ + u32 Reg; \ + Reg = Xil_In32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET); \ + Reg &= ~XSCUTIMER_CONTROL_ENABLE_MASK;\ + Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET, Reg);\ +} \ + + +//-------------------------------------------------------------------- +// Enable the Timer after Call-Graph Data collection +// +//-------------------------------------------------------------------- +#define enable_timer() \ +{ \ + u32 Reg; \ + Reg = Xil_In32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET); \ + Reg |= XSCUTIMER_CONTROL_ENABLE_MASK; \ + Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_CONTROL_OFFSET, Reg);\ +} \ + + +//-------------------------------------------------------------------- +// Send Ack to Timer Interrupt +// +//-------------------------------------------------------------------- +#define timer_ack() \ +{ \ + Xil_Out32(PROFILE_TIMER_BASEADDR + XSCUTIMER_ISR_OFFSET, \ + XSCUTIMER_ISR_EVENT_FLAG_MASK);\ +} + +//-------------------------------------------------------------------- +#endif // PROC_CORTEXA9 +//-------------------------------------------------------------------- + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/dummy.S b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/dummy.S new file mode 100755 index 000000000..98c5fa86e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/dummy.S @@ -0,0 +1,50 @@ +// +// Copyright (c) 2002 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: dummy.S,v 1.1.2.1 2011/05/17 04:37:56 sadanan Exp $ +// + .globl dummy_f + +#ifdef PROC_MICROBLAZE + .text + .align 2 + .ent dummy_f + +dummy_f: + nop + + .end dummy_f +#endif + +#ifdef PROC_PPC + .section .text + .align 2 + .type dummy_f@function + +dummy_f: + b dummy_f + +#endif + +#ifdef PROC_CORTEXA9 + .section .text + .align 2 + .type dummy_f, %function + +dummy_f: + b dummy_f + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/mblaze_nt_types.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/mblaze_nt_types.h new file mode 100755 index 000000000..2cf77fe83 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/mblaze_nt_types.h @@ -0,0 +1,51 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-11 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: mblaze_nt_types.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $ +// +////////////////////////////////////////////////////////////////////// + +#ifndef _MBLAZE_NT_TYPES_H +#define _MBLAZE_NT_TYPES_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef char byte; +typedef short half; +typedef int word; +typedef unsigned char ubyte; +typedef unsigned short uhalf; +typedef unsigned int uword; +typedef ubyte boolean; + +//typedef unsigned char u_char; +//typedef unsigned short u_short; +//typedef unsigned int u_int; +//typedef unsigned long u_long; + +typedef short int16_t; +typedef unsigned short uint16_t; +typedef int int32_t; +typedef unsigned int uint32_t; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile.h new file mode 100755 index 000000000..0657e6f99 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile.h @@ -0,0 +1,127 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-11 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: profile.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $ +// +////////////////////////////////////////////////////////////////////// + +#ifndef _PROFILE_H +#define _PROFILE_H 1 + +#include <stdio.h> +#include "mblaze_nt_types.h" +#include "profile_config.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void _system_init( void ) ; +void _system_clean( void ) ; +void mcount(unsigned long frompc, unsigned long selfpc); +void profile_intr_handler( void ) ; + + + +/**************************************************************************** + * Profiling on hardware - Hash table maintained on hardware and data sent + * to xmd for gmon.out generation. + ****************************************************************************/ +/* + * histogram counters are unsigned shorts (according to the kernel). + */ +#define HISTCOUNTER unsigned short + +struct tostruct { + unsigned long selfpc; + long count; + short link; + unsigned short pad; +}; + +struct fromstruct { + unsigned long frompc ; + short link ; + unsigned short pad ; +} ; + +/* + * general rounding functions. + */ +#define ROUNDDOWN(x,y) (((x)/(y))*(y)) +#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) + +/* + * The profiling data structures are housed in this structure. + */ +struct gmonparam { + long int state; + + // Histogram Information + unsigned short *kcount; /* No. of bins in histogram */ + unsigned long kcountsize; /* Histogram samples */ + + // Call-graph Information + struct fromstruct *froms; + unsigned long fromssize; + struct tostruct *tos; + unsigned long tossize; + + // Initialization I/Ps + unsigned long lowpc; + unsigned long highpc; + unsigned long textsize; + //unsigned long cg_froms; + //unsigned long cg_tos; +}; +extern struct gmonparam *_gmonparam; +extern int n_gmon_sections; + +/* + * Possible states of profiling. + */ +#define GMON_PROF_ON 0 +#define GMON_PROF_BUSY 1 +#define GMON_PROF_ERROR 2 +#define GMON_PROF_OFF 3 + +/* + * Sysctl definitions for extracting profiling information from the kernel. + */ +#define GPROF_STATE 0 /* int: profiling enabling variable */ +#define GPROF_COUNT 1 /* struct: profile tick count buffer */ +#define GPROF_FROMS 2 /* struct: from location hash bucket */ +#define GPROF_TOS 3 /* struct: destination/count structure */ +#define GPROF_GMONPARAM 4 /* struct: profiling parameters (see above) */ + +#ifdef __cplusplus +} +#endif + +#endif /* _PROFILE_H */ + + + + + + + + + + + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_cg.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_cg.c new file mode 100755 index 000000000..1c1e08fd6 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_cg.c @@ -0,0 +1,146 @@ +// +// Copyright (c) 2002-2010 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: profile_cg.c,v 1.1.2.1 2011/05/17 04:37:57 sadanan Exp $ +// + +#include "mblaze_nt_types.h" +#include "profile.h" +#include "_profile_timer_hw.h" + +/* + * The mcount fucntion is excluded from the library, if the user defines + * PROFILE_NO_GRAPH. + */ +#ifndef PROFILE_NO_GRAPH + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +extern struct gmonparam *_gmonparam; + +#ifdef PROFILE_NO_FUNCPTR +int searchpc( struct fromto_struct *cgtable, int cgtable_size, unsigned long frompc ) +{ + int index = 0 ; + + while( (index < cgtable_size) && (cgtable[index].frompc != frompc) ){ + index++ ; + } + if( index == cgtable_size ) + return -1 ; + else + return index ; +} +#else +int searchpc( struct fromstruct *froms, int fromssize, unsigned long frompc ) +{ + int index = 0 ; + + while( (index < fromssize) && (froms[index].frompc != frompc) ){ + index++ ; + } + if( index == fromssize ) + return -1 ; + else + return index ; +} +#endif /* PROFILE_NO_FUNCPTR */ + + +void mcount( unsigned long frompc, unsigned long selfpc ) +{ + register struct gmonparam *p = NULL; + register long toindex, fromindex; + int j; + + disable_timer(); + + //print("CG: "); putnum(frompc); print("->"); putnum(selfpc); print("\r\n"); + // check that frompcindex is a reasonable pc value. + // for example: signal catchers get called from the stack, + // not from text space. too bad. + // + for(j = 0; j < n_gmon_sections; j++ ){ + if((frompc >= _gmonparam[j].lowpc) && (frompc < _gmonparam[j].highpc)) { + p = &_gmonparam[j]; + break; + } + } + if( j == n_gmon_sections ) + goto done; + +#ifdef PROFILE_NO_FUNCPTR + fromindex = searchpc( p->cgtable, p->cgtable_size, frompc ) ; + if( fromindex == -1 ) { + fromindex = p->cgtable_size ; + p->cgtable_size++ ; + p->cgtable[fromindex].frompc = frompc ; + p->cgtable[fromindex].selfpc = selfpc ; + p->cgtable[fromindex].count = 1 ; + goto done ; + } + p->cgtable[fromindex].count++ ; +#else + fromindex = searchpc( p->froms, p->fromssize, frompc ) ; + if( fromindex == -1 ) { + fromindex = p->fromssize ; + p->fromssize++ ; + //if( fromindex >= N_FROMS ) { + //print("Error : From PC table overflow\r\n") ; + //goto overflow ; + //} + p->froms[fromindex].frompc = frompc ; + p->froms[fromindex].link = -1 ; + }else { + toindex = p->froms[fromindex].link ; + while(toindex != -1) { + toindex = (p->tossize - toindex)-1 ; + if( p->tos[toindex].selfpc == selfpc ) { + p->tos[toindex].count++ ; + goto done ; + } + toindex = p->tos[toindex].link ; + } + } + + //if( toindex == -1 ) { + p->tos-- ; + p->tossize++ ; + //if( toindex >= N_TOS ) { + //print("Error : To PC table overflow\r\n") ; + //goto overflow ; + //} + p->tos[0].selfpc = selfpc ; + p->tos[0].count = 1 ; + p->tos[0].link = p->froms[fromindex].link ; + p->froms[fromindex].link = p->tossize-1 ; +#endif + + done: + p->state = GMON_PROF_ON; + goto enable_timer ; + //overflow: + p->state = GMON_PROF_ERROR; + enable_timer: + enable_timer(); + return ; +} + + +#endif /* PROFILE_NO_GRAPH */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_config.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_config.h new file mode 100755 index 000000000..76ddbe80c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_config.h @@ -0,0 +1,36 @@ +////////////////////////////////////////////////////////////////////// +// +// Copyright (c) 2002-11 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: profile_config.h,v 1.1.2.2 2011/05/30 06:46:18 svemula Exp $ +// +////////////////////////////////////////////////////////////////////// + +#ifndef _PROFILE_CONFIG_H +#define _PROFILE_CONFIG_H + +#define BINSIZE 4 +#define SAMPLE_FREQ_HZ 100000 +#define TIMER_CLK_TICKS 1000 + +#define PROFILE_NO_FUNCPTR_FLAG 0 + +#define PROFILE_TIMER_BASEADDR 0x00608000 +#define PROFILE_TIMER_INTR_ID 0 + +#define TIMER_CONNECT_INTC + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_hist.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_hist.c new file mode 100755 index 000000000..a726670c0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_hist.c @@ -0,0 +1,53 @@ +// +// Copyright (c) 2002-2010 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: profile_hist.c,v 1.1.2.1 2011/05/17 04:37:57 sadanan Exp $ +// +#include "profile.h" +#include "mblaze_nt_types.h" +#include "_profile_timer_hw.h" + +#ifdef PROC_PPC +#include "xpseudo_asm.h" +#define SPR_SRR0 0x01A +#endif + +extern int binsize ; +uint32_t prof_pc ; + +void profile_intr_handler( void ) +{ + + int j; + +#ifdef PROC_MICROBLAZE + asm( "swi r14, r0, prof_pc" ) ; +#elif defined PROC_PPC + prof_pc = mfspr(SPR_SRR0); +#else + // for cortexa9, lr is saved in asm interrupt handler +#endif + //print("PC: "); putnum(prof_pc); print("\r\n"); + for(j = 0; j < n_gmon_sections; j++ ){ + if((prof_pc >= _gmonparam[j].lowpc) && (prof_pc < _gmonparam[j].highpc)) { + _gmonparam[j].kcount[(prof_pc-_gmonparam[j].lowpc)/(4 * binsize)]++; + break; + } + } + // Ack the Timer Interrupt + timer_ack(); +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_arm.S b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_arm.S new file mode 100755 index 000000000..fef9ad861 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_arm.S @@ -0,0 +1,33 @@ +// +// Copyright (c) 2012 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: profile_mcount_arm.S,v 1.1.2.1 2011/05/17 04:37:57 sadanan Exp $ +// + +// based on "ARM Profiling Implementation" from Sourcery G++ Lite for ARM EABI + +.globl __gnu_mcount_nc +.type __gnu_mcount_nc, %function + +__gnu_mcount_nc: + push {r0, r1, r2, r3, lr} + subs r1, lr, #0 /* callee - current lr */ + ldr r0, [sp, #20] /* caller - at the top of the stack */ + bl mcount /* when __gnu_mcount_nc is called */ + pop {r0, r1, r2, r3, ip, lr} + bx ip + + .end __gnu_mcount_nc diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_mb.S b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_mb.S new file mode 100755 index 000000000..de9373075 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_mb.S @@ -0,0 +1,55 @@ +// +// Copyright (c) 2002 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: profile_mcount_mb.S,v 1.1.2.1 2011/05/17 04:37:58 sadanan Exp $ +// + .globl _mcount + .text + .align 2 + .ent _mcount + + #ifndef PROFILE_NO_GRAPH + +_mcount: + addi r1, r1, -48 + swi r11, r1, 44 + swi r12, r1, 40 + swi r5, r1, 36 + swi r6, r1, 32 + swi r7, r1, 28 + swi r8, r1, 24 + swi r9, r1, 20 + swi r10, r1, 16 + swi r16, r1, 12 + add r5, r0, r15 + brlid r15, mcount + add r6, r0, r16 + + lwi r11, r1, 44 + lwi r12, r1, 40 + lwi r5, r1, 36 + lwi r6, r1, 32 + lwi r7, r1, 28 + lwi r8, r1, 24 + lwi r9, r1, 20 + lwi r10, r1, 16 + lwi r16, r1, 12 + rtbd r16, 4 + addi r1, r1, 48 + + #endif /* PROFILE_NO_GRAPH */ + + .end _mcount diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_ppc.S b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_ppc.S new file mode 100755 index 000000000..73e1dc698 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/profile/profile_mcount_ppc.S @@ -0,0 +1,58 @@ +// +// Copyright (c) 2002 Xilinx, Inc. All rights reserved. +// Xilinx, Inc. +// +// XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +// COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +// ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR +// STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION +// IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE +// FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +// XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +// THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO +// ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE +// FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE. +// +// $Id: profile_mcount_ppc.S,v 1.1.2.1 2011/05/17 04:37:58 sadanan Exp $ +// + .globl _mcount + + #define _MCOUNT_STACK_FRAME 48 + .section .text + .align 2 + .type _mcount@function + + +_mcount: + stwu 1, -_MCOUNT_STACK_FRAME(1) + stw 3, 8(1) + stw 4, 12(1) + stw 5, 16(1) + stw 6, 20(1) + stw 7, 24(1) + stw 8, 28(1) + stw 9, 32(1) + stw 10, 36(1) + stw 11, 40(1) + stw 12, 44(1) + mflr 4 + stw 4, (_MCOUNT_STACK_FRAME+4)(1) + lwz 3, (_MCOUNT_STACK_FRAME)(1) + lwz 3, 4(3) + bl mcount + lwz 4, (_MCOUNT_STACK_FRAME+4)(1) + mtlr 4 + lwz 12, 44(1) + lwz 11, 40(1) + lwz 10, 36(1) + lwz 9, 32(1) + lwz 8, 28(1) + lwz 7, 24(1) + lwz 6, 20(1) + lwz 5, 16(1) + lwz 4, 12(1) + lwz 3, 8(1) + addi 1,1, _MCOUNT_STACK_FRAME + blr + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/putnum.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/putnum.c new file mode 100755 index 000000000..f2af0ae27 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/putnum.c @@ -0,0 +1,41 @@ +/* putnum.c -- put a hex number on the output device. + * + * Copyright (c) 1995 Cygnus Support + * + * The authors hereby grant permission to use, copy, modify, distribute, + * and license this software and its documentation for any purpose, provided + * that existing copyright notices are retained in all copies and that this + * notice is included verbatim in any distributions. No written agreement, + * license, or royalty fee is required for any of the authorized uses. + * Modifications to this software may be copyrighted by their authors + * and need not follow the licensing terms described here, provided that + * the new terms are clearly indicated on the first page of each file where + * they apply. + */ + +/* + * putnum -- print a 32 bit number in hex + */ + +extern void print (char* ); + +void putnum(unsigned int num) +{ + char buf[9]; + int cnt; + char *ptr; + int digit; + + ptr = buf; + for (cnt = 7 ; cnt >= 0 ; cnt--) { + digit = (num >> (cnt * 4)) & 0xf; + + if (digit <= 9) + *ptr++ = (char) ('0' + digit); + else + *ptr++ = (char) ('a' - 10 + digit); + } + + *ptr = (char) 0; + print (buf); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/putnum.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/putnum.o new file mode 100644 index 0000000000000000000000000000000000000000..e59ef2f3086e885517b019fbfb5da8888d6ed684 GIT binary patch literal 2680 zcma)8O>7%Q6n?Y2PVCrme%q!=0T)s=sLih3l!lZFngnQ5C6x&v!~wZ$dy^PBw!2<O zB(!P?AVftGIaEj>)POjYBN7KBglHwi0RifPOAkoks1g$5fDk7n%=dP8?DYv=^yYhi z^XAQ)*>NsCG5@3xf+PtVqn1WA6mmVGqb`imF6t-k=kdFPw-@SK@74Og<n~VTf$d+k z<ZQhsq0}R^xRboOS${6ESr<2N{U{Q*zSgL^^H-xWOo-L!YMqj|?*7wg{5E(S^5rjo zy@T9}n_m;>f#OwH@rJZ7E8<0V?RJZkM)4kOYN@sg2aAWnTDG=CV(3GN%2qLyD>)?g zeg$m-9I7}riQ#V`n&6I$7{myBUjcWX#_%0DEYiwWo+zSqz5uoBa}1w?qdbJ!{1$|W z2)_@AX`uoZ>DD+ZF0Nq|gF^K1A`tt;f%rgFjgQ3pM8D|mKv}wYET+bfM<0nEjIr@# z$GbBzF@UXvNDZ@nZa_hxcC@8-q4<CbZwFL2i5J}Y=BB`6DWnNs*%YL7ZOvd(WR#-O zN3lM(A;jDOFB9EQa|1>crTfk>QFjmG=HQG6t2+@R>Ios*-3uxLDs<6BOk!DM<O6{` z1ZdJpNP^M~?AGW{k-iSWC7#p^R%o)#hV@9Lt^9QsPJsnIh0&#b7{|bZ78%&9k^RY~ zW&#fIFA^k=<W*tqG+3egcocufy9pPcuM=2MrRLxs={e}2kef!`Ez;_Ser&}^9!^3~ zBWH|p!%#HLG>YY%Su|=n({_x7Le4JFPA@)_NllKY9yZR`%)GI&o-JpVs@Y;DTdf$C z>SQKYwjJvwb1IWGiiK>|&KXt5EalB&xnyP5CNim1#x!82TB%xCE?M~mUo5XOI(7Eh z#BAcIKB-SozOY=74wPIiY*@~E#iEMM6LKr2jrPpW9#4!tU9Q<V%U(~+mh;w(Rm!a- z<_nIMIFd|F=*fr1C#D|sb585nw`rN#0*O&>!Q}Wfb#!%3hebr`*9OHdu}2*ed&RK0 zSGk}2#z)iu;jUeX$GT|{x+HG<Ok8_g%*2OCudc5;W)|q!9<E5qwu(A>;*g#<9h3BI zwMsf0^H#RDoGFx+%5b@|na$ePn$*z#V4!K6rDdyaZn03ZWHgo|Jy%{`wa_1ZdT~KF z9mg(YYfk%|CEHxJ<R1PH@@3*);Cpn5-^t*W;}3>u1RQZCZ`g*y-vEDDJfGuOKj7;s zkm)rKnj^<D9RhRwf5mY<at=f{-%l*~Bz;Nf!TN4Mxd9v3$3FqGzLSvU9EfB>`IZHr zr0*<rDYNSkKB$lU7zXL%=T*vV{~mD(7JQPv=b;DdOXF$lg^lZDyR5GQS<Zn-za!r~ z3qDC-5qdD+IpmY)frqh~?*e3=!~J2JLc_OR$s5?m{DzM*?hfKoUWhx&xObqz#bvtG zg~AP~06C87W3ZH2KY_S07JTCUGHru{`&bF|r58Sq<9+pk<z0bDc{upTOp;uS5iM)d zIZRH#$ltci$H;32^IeAFp60Cf+5_gcJ!$kuBj{7xyqrI{0_z%KdjXPFdnVPrsV%ok zoh=2D>UN@KQrkMmem?mYsnm@>Z{MDkcitk^?MP6^k8FTc>S;!#VeiNO_5}QHw&w57 zs7a%F`Ph38Ibt6N@5ABo`=Vew{N^eslh2cJmydfHad3PFjQbhUtb@LvA9uDN@$ncV z&i0It%Ra98_%b8%zwYZ-7%~3?-~O48U-<Zgk8Yh9cyAnk*hjuU3Yy9PA+Y^lMJFN+ literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/read.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/read.c new file mode 100755 index 000000000..609aa681b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/read.c @@ -0,0 +1,100 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +/* read.c -- read bytes from a input device. + */ + +#include "xparameters.h" +#include "xil_printf.h" + +#ifdef __cplusplus +extern "C" { + int _read (int fd, char* buf, int nbytes); +} +#endif + +/* + * read -- read bytes from the serial port. Ignore fd, since + * we only have stdin. + */ +int +read (int fd, char* buf, int nbytes) +{ +#ifdef STDIN_BASEADDRESS + int i = 0; + + (void)fd; + for (i = 0; i < nbytes; i++) { + *(buf + i) = inbyte(); + if ((*(buf + i) == '\n' || *(buf + i) == '\r')) + break; + } + + return (i + 1); +#else + (void)fd; + (void)buf; + (void)nbytes; + return 0; +#endif +} + +int +_read (int fd, char* buf, int nbytes) +{ +#ifdef STDIN_BASEADDRESS + int i = 0; + + (void)fd; + for (i = 0; i < nbytes; i++) { + *(buf + i) = inbyte(); + if ((*(buf + i) == '\n' || *(buf + i) == '\r')) + break; + } + + return (i + 1); +#else + (void)fd; + (void)buf; + (void)nbytes; + return 0; +#endif +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/read.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/read.o new file mode 100644 index 0000000000000000000000000000000000000000..bdc8fa5d61e0b607b8a5d325836d478f812847e3 GIT binary patch literal 3432 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 LPivX)DCNHadLfe2 literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sbrk.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sbrk.c new file mode 100755 index 000000000..a6fc4e349 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sbrk.c @@ -0,0 +1,76 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <errno.h> +#ifdef __cplusplus +extern "C" { + char *sbrk (int nbytes); +} +#endif + +extern char _heap_start[]; +extern char _heap_end[]; +extern char HeapBase[]; +extern char HeapLimit[]; + +static char *heap_ptr; + +char *sbrk (int nbytes) +{ + char *base; + + if (!heap_ptr) + /*heap_ptr = (char *)&_heap_start;*/ + heap_ptr = (char *)&HeapBase; + + base = heap_ptr; + heap_ptr += nbytes; + +/* if (heap_ptr <= ((char *)&_heap_end + 1))*/ + if (heap_ptr <= ((char *)&HeapLimit + 1)) + return base; + + else + { + errno = ENOMEM; + return ((char *)-1); + } +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sbrk.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sbrk.o new file mode 100644 index 0000000000000000000000000000000000000000..94c04729ccb91cde60dc2b9c0d1ec9370eece065 GIT binary patch literal 3160 zcma)8O>7%Q6n?X7$4>3I`DtlN3v5vesoLz?BsA#{G;aDAH7QY21V|vWwzr8@$4=Ml zDk(*j76~CCRG~^pNYEfSAS4c)Dnt?D07niS;Mx*JD&kNfxS$Hc_r^2!rd)XP?DziX z&70X-zjk!um=J<A3F@boMD%A=TB1V|`e`$D6IrxE*62!nbl_L&1fPC)l{!aPh-Owq zdKuwYZV_Ex-ELi9HE8O#N%a0dYiqwz`qoO)T1M=pRg;!)$1i<-hv!P-VaWUu(F<O@ z2;rPm5KSpGBGFPMAXBulyD8!Y7)&GD$C45Ii={{`#SoV@oAKBIsf_;6u-WVxiS2?E zi7c{C#GeC1MIWAGMEC$EJ*D^#LfaiY#K=xOEsWSSi~HF%ixD5e;~oaJZ^J|EWkVDT zCfdML+{Q>y@@Ie;{E43;d6!|RA#{jakc?i@j^acl!qbrG5<62p2{W}V)g`(`XB#~F zD3N$NVa8FlVzJc7Mrg--FrzIFCC$|S#DT=)$?+bJ8f|;;a8kh57Nv$|yvIPM*w8vL z{?=tdT_OX=_K;-*>K9_XhZ7`rpr&NYcqn-=Nz`FecuH1DVl?PgV&q1GN6{^ky{0J! zHb>|WF?C&=Eil6vf@ZX8I~a91w5qv5toTaWKj5dhm+C-+<!R=2I@N{1dA?LGRTiDh zkUi{-&m7GinQ@LDIqA$+>W=HrJ1{zV4BG~qcV-I(Ru3%7r~%K-mmEaegY3}!-S1JV z6w39Y=hT*JM76ws*5<=Wp6^$x_8e9NipoWpBVzOM%*T^woq<X0h7jdyW!91pKHc?7 ztu$NliWUoVp1Y7+2z;55q|Z8gD|DSY@76pj%(;y?RMNCcrBkjJ+_F<IxPIVFmI{7# zEIWNVml+<&j5z1&Zqd20l&|K_)bizAzP8{j)P{3~svmfZ?!H`_n^f})PAzaNMHdx# zx$}d$OeW_#P&bO?+E1YN!(2!%C%ZtE{8Hf6q<*3_Uka!;hon}sHV#s2mt`J5^{h2! z$<`~^hQ|djSX%Iij*pG)xB6$Qb-&>GOV(Jm=pFVdg*j`Y6nNGX>CB*=esW-N-!7FS zYhw>w-cORRdvtgpOKlrs*|=yox+9y!X0gTW6<fuF;$h=aA&>7GNRV+cmF%ERyoZYT z+#XBCuNd!OXYJb3eBkDRf#1M6&G}y0M&AOmi*DeOov+o%W@XXK*JpF3%9$!ml6UiY z-#f1*Y*E<J_1(%Wniq=2vGue!rX#yhouBv6LpwV?X}dw-m-2OPcqrzK@6Mxh|DPU# zE1zB58j|=MpzlUjM5LC8Z@zZLOGpr<!Qk$Y@$AQU0AFsLPhO9}H!#8^-xDZyW3YeN zPtV2vn&*0S4C^^xXGo!0t|eSw8uf7?*B8a$d_3PMhK>PC*C2e!j3RA21zGcKn#8Mp zTKO<&+e;yy^&i2{Vn&hndjayg`fzu4LdW&7Ue~t(UdMo?Z;|gCW)x{#8FDz^DDv_8 zI3F)v=er1=W4J#|m(cKGodhzoJl<5O{ca#Z20BgJ?<y2X!DULi13yO#K%M%N5YOgb zY(hUXinu<eWsLATPK5f>2^;(Iy1Fp*SpiF<$oB;^iuAmUXjzjEBKajK`Q7Hh`8Y4n z8P0bTU&AbPnsh!bYYgin^!u9DGn&oSH?-!u8Q30?YiY#@xmPVYg8yDb6HSGXa#KWn zuM&72LawG|HRVYU%dwUK&b)7Sb6w}z&L^iuCUwa9xnB)xaV(p%lgcDz{9g%?NgHX0 zlBa;(sQ9svowJ3{4$J({K$DzJeQNt~w@zeFjh%RAI!%4W`#zli`4q9D@eNYRcH@HM zp6vnRh|z8|n$N=?;1F>81C72LTN-zvfmX1ev9WRX7<q3Pw=&|8J*1G=Xkh8Q7PjwI z_>{sU3QsEJznARCcLL+f3TG8o6uzSHb%k#;V&1C?uQ8&?50(8>C4a8u8%n;(h`8^S k{zpbM;}<30Rrt3;w1^D658Qu_`%EGC%fO4sXOQ*(0<iOZ6#xJL literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.c new file mode 100755 index 000000000..64c9625e4 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.c @@ -0,0 +1,89 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/***************************************************************************** +* +* @file sleep.c +* +* This function provides a second delay using the Global Timer register in +* the ARM Cortex A9 MP core. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 11/11/09 First release +* 3.07a sgd 07/05/12 Updated sleep function to make use Global Timer +* </pre> +* +******************************************************************************/ +/***************************** Include Files *********************************/ + +#include "sleep.h" +#include "xtime_l.h" +#include "xparameters.h" + +/*****************************************************************************/ +/* +* +* This API is used to provide delays in seconds +* +* @param seconds requested +* +* @return 0 always +* +* @note None. +* +****************************************************************************/ +int sleep(unsigned int seconds) +{ + XTime tEnd, tCur; + + XTime_GetTime(&tCur); + tEnd = tCur + ((XTime) seconds) * COUNTS_PER_SECOND; + do + { + XTime_GetTime(&tCur); + } while (tCur < tEnd); + + return 0; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.h new file mode 100755 index 000000000..4d9dd5abd --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.h @@ -0,0 +1,58 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#ifndef SLEEP_H +#define SLEEP_H + +#ifdef __cplusplus +extern "C" { +#endif + +void nanosleep(unsigned int nanoseconds); +int usleep(unsigned int useconds); +int sleep(unsigned int seconds); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/sleep.o new file mode 100644 index 0000000000000000000000000000000000000000..a9da6a8eea8699ae58bf589ce8115a61e7fcf688 GIT binary patch literal 2612 zcmb7FOK%%h6h3!m>^SkGY0^SV3m8Zt2r`aIQQGp#gTB*HwJ8E5<c{r0V&vFnJT5J2 z1*#elh$2cCz%C1rU<C*vK!OEgg9JqtzkswXK&)6IB*OQN=h~BQ5XZXrJKs6yo_p@Y zcV5~%vrj1{T9gb+mx+9D1)kW>0ET6=3`k>Q<oCqYBiH2Q%4%9xR{vRB`{U}wmDQz3 zR<0MuCa+)K_rWh6d-lp|OpdQwa!mcTwzfxP<$B`k#cPe1zxnMa<TQf3mU<4TE(E0A z9SC*fBPhn9QS@e_=WT$c-axNr6g?Cj8W>_9!=h$BL4QA5{0q|A9aQHoTPH4C@vl1; z<I>5VO<;_97cHTV8s|iMIgqxHOP>|1)O<0mo@ZfAs#EBVXO#K@m|`bsi!+GYsCHxq zlV)aHW}_NV{c*(IBxYt$@}cCxL9Ad%lF3Km$0}^~SgP&0Cv|X;;S=$9rcw%Fu~=t} zffVtbUD_wo^V)fZiSmOCO}u_yiP3jy3XWdw5a|miN}$~6L=Ok~Q!!yR=?$ocN+3LF zL(T~i!>IQYxx3J}06NkSP03LL-AbO+uI*65Gu5Wf`Oxr0;J=T(`a6>r+&x}5G$qZd z>o)8XsGRmIOKzcRFOpzGf|TZuq7LN`i(#o{c88a-J4)rM^^#M~wMvfX=Z;iLUVVD< z*jyn$K9b*+d%oqAb1$AL)(i8^Vzp3gHgb*Tc%fAHeD}1oyD*xoR*FrplxzA<t?X3m zHMekTtdP$aoE*&3sx>PMHMgAQ1=v4(B0HVkX^-1u^3)tF-0%9tPU*oC1X&icLAP#r zFhrVesa`8L#ot>ii$C4+MD|Zl@5v4yueZFC>z&C?*URpdTPrPQXDYs%ePA>{W{*BN zGPe8PaPCPPd*ZlGu_9`S+cQ2gDe=CZ$%N`P2CPkLv%1;bqPD7A)NRI{Dus|W2rkOm zOe!rrBP~3>sZ9R`YuS9ocvDSfc+Ph7%#!aEfxg$qMXh;m)yB^GVwWA?5xdxIicMqL zEw&a4mD+qAu0VH+MbAB@84f8L=y*<T!Cg1DTB*4@8q<kgsxK|M*misJ*b&?DeXmk% z`Rm8bdk%L0f5`2K<%PrFDiFSF+ygDV{giEJy@A&5=0JGe`ETKP{V(C)p4>#EoNYs= zr;oxLpFsPsIM$=bKn?Q!OeGZU8wHQnR|feIHr5wI)Adb2*JGf{EXbEsLeaiiaIMo7 z$3N~+7(>uLK7d-M{V3wHR6^0dr@^E3rSLxK{i9vi*MP3aFhv9Tj#CLm`>Np4eA|(a z`^oht(R4oUKgV!?DBmI9w{11(>0^5}L>+el2a^vX+MSMj3luJv8OY}#IZc3!qr8u% zb@E>kr*o6DKFSJObR9#Hed&i!uVW*0r0B>dI6m#L?p&M`OY8`r>@1A@tm%A2&Kb=& z3d3EUQQdqIQ=mrIWXYdvQNOuv#mpa_f!tcR)*ELrgPYpTXi86)Kr@3A?wZUSvYElj zNBwExTgUabrK^#f5l@@rI~);HHsIHm1AqanZ*#;SWYZt1AxDPF?RWo%Z$U82b{ya^ z#uE9~7+4x>GjLgXwnXM8ZYAOnZw>JdBJRcAp?@sI-61|sL_BLG&Jc0#{0KAO$&mA5 kB!3~qWg_C=3-Pni{#A%Uo#?nu#_bA`cgaYL@Y6v1zxIJ6X8-^I literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.c new file mode 100755 index 000000000..c6490285e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.c @@ -0,0 +1,146 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file smc.c +* +* This file contains APIs for configuring the PL353 Static Memory Controller +* interfaces for NAND flash, SRAM and NOR flash. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 08/02/10 Initial version +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "smc.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/* + * Register values for using NOR interface of SMC Controller + */ +#define NOR_SET_CYCLES ((0x0 << 20) | /* set_t6 or we_time from sram_cycles */ \ + (0x1 << 17) | /* set_t5 or t_tr from sram_cycles */ \ + (0x2 << 14) | /* set_t4 or t_pc from sram_cycles */ \ + (0x5 << 11) | /* set_t3 or t_wp from sram_cycles */ \ + (0x2 << 8) | /* set_t2 t_ceoe from sram_cycles */ \ + (0x7 << 4) | /* set_t1 t_wc from sram_cycles */ \ + (0x7)) /* set_t0 t_rc from sram_cycles */ + +#define NOR_SET_OPMODE ((0x1 << 13) | /* set_burst_align,set to 32 beats */ \ + (0x1 << 12) | /* set_bls,set to default */ \ + (0x0 << 11) | /* set_adv bit, set to default */ \ + (0x0 << 10) | /* set_baa, we don't use baa_n */ \ + (0x0 << 7) | /* set_wr_bl,write brust len,set to 0 */ \ + (0x0 << 6) | /* set_wr_sync, set to 0 */ \ + (0x0 << 3) | /* set_rd_bl,read brust len,set to 0 */ \ + (0x0 << 2) | /* set_rd_sync, set to 0 */ \ + (0x0)) /* set_mw, memory width, 16bits width*/ + /* 0x00002000 */ +#define NOR_DIRECT_CMD ((0x0 << 23) | /* Chip 0 from interface 0 */ \ + (0x2 << 21) | /* UpdateRegs operation */ \ + (0x0 << 20) | /* No ModeReg write */ \ + (0x0)) /* Addr, not used in UpdateRegs */ + +/* Register values for using SRAM interface of SMC Controller */ +#define SRAM_SET_CYCLES (0x00125155) +#define SRAM_SET_OPMODE (0x00003000) +#define SRAM_DIRECT_CMD (0x00C00000) /* Chip 1 */ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +/**************************************************************************** +* +* Configure the SMC interface for SRAM. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XSmc_SramInit (void) +{ + Xil_Out32(XPAR_XPARPORTPS_CTRL_BASEADDR + XSMCPSS_MC_SET_CYCLES, + SRAM_SET_CYCLES); + Xil_Out32(XPAR_XPARPORTPS_CTRL_BASEADDR + XSMCPSS_MC_SET_OPMODE, + SRAM_SET_OPMODE); + Xil_Out32(XPAR_XPARPORTPS_CTRL_BASEADDR + XSMCPSS_MC_DIRECT_CMD, + SRAM_DIRECT_CMD); +} + +/**************************************************************************** +* +* Configure the SMC interface for NOR flash. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XSmc_NorInit(void) +{ + Xil_Out32(XPAR_XPARPORTPS_CTRL_BASEADDR + XSMCPSS_MC_SET_CYCLES, + NOR_SET_CYCLES); + Xil_Out32(XPAR_XPARPORTPS_CTRL_BASEADDR + XSMCPSS_MC_SET_OPMODE, + NOR_SET_OPMODE); + Xil_Out32(XPAR_XPARPORTPS_CTRL_BASEADDR + XSMCPSS_MC_DIRECT_CMD, + NOR_DIRECT_CMD); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.h new file mode 100755 index 000000000..fcfccebaa --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.h @@ -0,0 +1,124 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file smc.h +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 11/03/09 Initial release. +* </pre> +* +* @note None. +* +******************************************************************************/ + +#ifndef SMC_H /* prevent circular inclusions */ +#define SMC_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xparameters.h" +#include "xil_io.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/* Memory controller configuration register offset */ +#define XSMCPSS_MC_STATUS 0x000 /* Controller status reg, RO */ +#define XSMCPSS_MC_INTERFACE_CONFIG 0x004 /* Interface config reg, RO */ +#define XSMCPSS_MC_SET_CONFIG 0x008 /* Set configuration reg, WO */ +#define XSMCPSS_MC_CLR_CONFIG 0x00C /* Clear config reg, WO */ +#define XSMCPSS_MC_DIRECT_CMD 0x010 /* Direct command reg, WO */ +#define XSMCPSS_MC_SET_CYCLES 0x014 /* Set cycles register, WO */ +#define XSMCPSS_MC_SET_OPMODE 0x018 /* Set opmode register, WO */ +#define XSMCPSS_MC_REFRESH_PERIOD_0 0x020 /* Refresh period_0 reg, RW */ +#define XSMCPSS_MC_REFRESH_PERIOD_1 0x024 /* Refresh period_1 reg, RW */ + +/* Chip select configuration register offset */ +#define XSMCPSS_CS_IF0_CHIP_0_OFFSET 0x100 /* Interface 0 chip 0 config */ +#define XSMCPSS_CS_IF0_CHIP_1_OFFSET 0x120 /* Interface 0 chip 1 config */ +#define XSMCPSS_CS_IF0_CHIP_2_OFFSET 0x140 /* Interface 0 chip 2 config */ +#define XSMCPSS_CS_IF0_CHIP_3_OFFSET 0x160 /* Interface 0 chip 3 config */ +#define XSMCPSS_CS_IF1_CHIP_0_OFFSET 0x180 /* Interface 1 chip 0 config */ +#define XSMCPSS_CS_IF1_CHIP_1_OFFSET 0x1A0 /* Interface 1 chip 1 config */ +#define XSMCPSS_CS_IF1_CHIP_2_OFFSET 0x1C0 /* Interface 1 chip 2 config */ +#define XSMCPSS_CS_IF1_CHIP_3_OFFSET 0x1E0 /* Interface 1 chip 3 config */ + +/* User configuration register offset */ +#define XSMCPSS_UC_STATUS_OFFSET 0x200 /* User status reg, RO */ +#define XSMCPSS_UC_CONFIG_OFFSET 0x204 /* User config reg, WO */ + +/* Integration test register offset */ +#define XSMCPSS_IT_OFFSET 0xE00 + +/* ID configuration register offset */ +#define XSMCPSS_ID_PERIP_0_OFFSET 0xFE0 +#define XSMCPSS_ID_PERIP_1_OFFSET 0xFE4 +#define XSMCPSS_ID_PERIP_2_OFFSET 0xFE8 +#define XSMCPSS_ID_PERIP_3_OFFSET 0xFEC +#define XSMCPSS_ID_PCELL_0_OFFSET 0xFF0 +#define XSMCPSS_ID_PCELL_1_OFFSET 0xFF4 +#define XSMCPSS_ID_PCELL_2_OFFSET 0xFF8 +#define XSMCPSS_ID_PCELL_3_OFFSET 0xFFC + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void XSmc_SramInit (void); +void XSmc_NorInit(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SMC_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/smc.o new file mode 100644 index 0000000000000000000000000000000000000000..f8db831f2d57e707ffe9913e933abba501bfe83d GIT binary patch literal 3020 zcma)8OK%%h6h3#xj-5wM9u1@~FersoG~>8wmA+J*1ZXSu0ezqX1v9p%iG^bad)ziv z5l?}r3ZfDf3l?P21&c0V#isoYh!rd<gp>tPHXuMk0ujFN`rdd_B;ZJMzw^H5o;i2y zR~|d`xKc_iDH)NrB=TuoTjJX_jL4w$OENe5!&*r#o$QM*i5yw#@69d!wY>bJyMA$L z2zu%$_kwo^7qy(s-TWT9+cx&x`Yx?^{v}r35xW(IIl7LR+5%KNu)L-fBIgY{D%k+* zIEh~YZgYH_IH&hf6HDwNBol`TDp@5s@d0Ly#lO)ueOgC#B%qAN;^k_{xD;)%#3m@? zY6Aq-1S_(a3rKx|rDF)odgv1)hPeSuswdqp8Iw->Dw?S|Fg?sv-%)o-(Zur86zS4& z0-R1&vWyATspz|sDmR5xU5bwGPfB%<gV76o`qbvsK)0LPkm^(Ys<#8D7?$qteNe&s zZgG>lyZ3Y-9KczPK8dnC^+=DKqUE6;#^pLboa#|<>UigMC4DLjHUSptvjfy8FG25g zU76|<>1-LUPW8~OE1GL>4=Rfbx6>5E>d4DNWDCG!`xa5o;h~+#BS-BUwTwka6WbF& z{uw-uOmJ0yq}B*V93A9jD{0IXy&?oTU#{fCh54Z2&04WsYw>7<o;3G2QJKXzXSce& zo<_$(u1c*slhz9dq*-m0XR1LdP2tq>xnll!-Jd&HEr+uI$jS6{db>B_jhk(C)T)Sf zvQ_F+DDG%8#P}9x{d#*7EoCaTqF>20i+(-K94;5@wdu)YC-T{e(d^F5OHIF&xv)^E z<<B$<m3*NwpP6q=<cqa>7@YTa<;OCWa-mT#W*VViE&13#$e$h0XR~=f1GTIiOrPaQ zt*(#Km_>YgRf*=<x}uhu9cYv<1njEF{^{x6>5=2LX1y5H7t+(UQZN-%i?iuN<uFKZ z8_SM+V>?F2cWp5pn)L7*{J<}iMPaBVJ~28e9bJjZr0R6~V{6r*y2l+->oEKGIu9tp zJjpT$!*?;&vqskPEgIqgO{J1=IPa+yJ#|sNc#Va*&@TYPdJAVQR}U&4+7*gd@<U&| zLZcxbm8GE2oXMA~XKFBM-Y*pD!C5Qe%|spjx?i0MR>fAz)xdgVJMoIOxw!zH^CpiS z_WUrcmkZ5sb<7z|6gv9<={~q};&JCS@%zn7WQmuK#IISW=32{X+~F~>yrhh$A8+Mm zBfCJ-^%ktG^d&uvhyMTN$9ilGSe<VyqOdG$iPm=+^(A3sef(J4`f}iH3|P4Z;UhAJ ztnCP7%hPlY*E~nYkhMJr+43}f4!<-RL)P{*<Y;{#bc^&t$NH$Z_05B~F<|8@<a?fs zA#1BZj^?|DeC#LlfnCXW5j<nqAJPsq{6U)pGFd)v8?=7UqM$5vmaO0VP#^`%)N~ns z87ly7>T406<{R+Kkud~O(<0XBIj*DlG;};iFCO~wTzz=#tbmn2Vfc)UA-gXTEnA`A z5zKkvowxaj+%uYQ1oN_OC8~Xnh)T0|9||$~c{yr#S5Dv3x~q2JelbZz1ODO9No|vR zhqtRc5w%A<$NYTrZE|Ie;8^<HEiF&pCO2ZC))oGNX_G5=Aw!G!J?uxl{0>-RHr{vp zy`<gzd=2|DT)N{&uKi23>Ib9sZZ_ft4<i?GCvX$+2_wH?Ff@98s~j|v-*pE^hO5Rw zgX@SGf=veRC!!G}#?E<V+@!$+29Fwi${_DH{YnO3G`L{!RfBICe3yuQuNb^a#Qc41 z<WCIVH25VE`M);uErZ_@5qI0jzZm5AjQKYb5vTirh3|p-M-6h;9lW?9BX2eGn34Ym DJBM$T literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/translation_table.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/translation_table.o new file mode 100644 index 0000000000000000000000000000000000000000..32ad058fbe256a5d24aa40d6ac9b2328202d17fb GIT binary patch literal 17043 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 G3||gsmoXLq literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/translation_table.s b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/translation_table.s new file mode 100755 index 000000000..c842ee9d4 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/translation_table.s @@ -0,0 +1,141 @@ +/****************************************************************************** +* +* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file translation_table.s +* +* This file contains the initialization for the MMU table in RAM +* needed by the Cortex A9 processor +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a ecm 10/20/09 Initial version +* 3.04a sdm 01/13/12 Updated MMU table to mark DDR memory as Shareable +* 3.07a sgd 07/05/2012 Configuring device address spaces as shareable device +* instead of strongly-ordered. +* 3.07a asa 07/17/2012 Changed the property of the ".mmu_tbl" section. +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + .globl MMUTable + + .section .mmu_tbl,"a" + +MMUTable: + /* Each table entry occupies one 32-bit word and there are + * 4096 entries, so the entire table takes up 16KB. + * Each entry covers a 1MB section. + */ + +.set SECT, 0 + +.rept 0x0400 /* 0x00000000 - 0x3fffffff (DDR Cacheable) */ +.word SECT + 0x15de6 /* S=b1 TEX=b101 AP=b11, Domain=b1111, C=b0, B=b1 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0400 /* 0x40000000 - 0x7fffffff (FPGA slave0) */ +.word SECT + 0xc02 /* S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0400 /* 0x80000000 - 0xbfffffff (FPGA slave1) */ +.word SECT + 0xc02 /* S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0200 /* 0xc0000000 - 0xdfffffff (unassigned/reserved). + * Generates a translation fault if accessed */ +.word SECT + 0x0 /* S=b0 TEX=b000 AP=b00, Domain=b0, C=b0, B=b0 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0020 /* 0xe0000000 - 0xe1ffffff (Memory mapped devices) + * UART/USB/IIC/SPI/CAN/GEM/GPIO/QSPI/SD/NAND */ +.word SECT + 0xc06 /* S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0020 /* 0xe2000000 - 0xe3ffffff (NOR) */ +.word SECT + 0xc06 /* S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0020 /* 0xe4000000 - 0xe5ffffff (SRAM) */ +.word SECT + 0xc0e /* S=b0 TEX=b000 AP=b11, Domain=b0, C=b1, B=b1 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0120 /* 0xe6000000 - 0xf7ffffff (unassigned/reserved). + * Generates a translation fault if accessed */ +.word SECT + 0x0 /* S=b0 TEX=b000 AP=b00, Domain=b0, C=b0, B=b0 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0010 /* 0xf8000000 - 0xf8ffffff (AMBA APB Peripherals) */ +.word SECT + 0xc06 /* S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x0030 /* 0xf9000000 - 0xfbffffff (unassigned/reserved). + * Generates a translation fault if accessed */ +.word SECT + 0x0 /* S=b0 TEX=b000 AP=b00, Domain=b0, C=b0, B=b0 */ +.set SECT, SECT+0x100000 +.endr + +.rept 0x003f /* 0xfc000000 - 0xffefffff (Linear QSPI - XIP) */ +.word SECT + 0xc0a /* S=b0 TEX=b000 AP=b11, Domain=b0, C=b1, B=b1 */ +.set SECT, SECT+0x100000 +.endr + + /* 256K OCM when mapped to high address space + * inner-cacheable */ +.word SECT + 0x4c0e /* S=b0 TEX=b100 AP=b11, Domain=b0, C=b1, B=b1 */ +.set SECT, SECT+0x100000 + +.end diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/uart.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/uart.c new file mode 100755 index 000000000..ba7240ed2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/uart.c @@ -0,0 +1,159 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file uart.c +* +* This file contains APIs for configuring the UART. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 08/02/10 Initial version +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#include "xparameters.h" +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/* Register offsets */ +#define UART_CR_OFFSET 0x00 +#define UART_MR_OFFSET 0x04 +#define UART_BAUDGEN_OFFSET 0x18 +#define UART_BAUDDIV_OFFSET 0x34 + +#define MAX_BAUD_ERROR_RATE 3 /* max % error allowed */ +#define UART_BAUDRATE 115200 + +void Init_Uart(void); + +void Init_Uart(void) +{ +#ifdef STDOUT_BASEADDRESS + u8 IterBAUDDIV; /* Iterator for available baud divisor values */ + u32 BRGR_Value; /* Calculated value for baud rate generator */ + u32 CalcBaudRate; /* Calculated baud rate */ + u32 BaudError; /* Diff between calculated and requested baud + * rate */ + u32 Best_BRGR = 0; /* Best value for baud rate generator */ + u8 Best_BAUDDIV = 0; /* Best value for baud divisor */ + u32 Best_Error = 0xFFFFFFFF; + u32 PercentError; + u32 InputClk; + u32 BaudRate = UART_BAUDRATE; + +#if (STDOUT_BASEADDRESS == XPAR_XUARTPS_0_BASEADDR) + InputClk = XPAR_XUARTPS_0_UART_CLK_FREQ_HZ; +#elif (STDOUT_BASEADDRESS == XPAR_XUARTPS_1_BASEADDR) + InputClk = XPAR_XUARTPS_1_UART_CLK_FREQ_HZ; +#else + /* STDIO is not set or axi_uart is being used for STDIO */ + return; +#endif + + /* + * Determine the Baud divider. It can be 4to 254. + * Loop through all possible combinations + */ + for (IterBAUDDIV = 4; IterBAUDDIV < 255; IterBAUDDIV++) { + + /* + * Calculate the value for BRGR register + */ + BRGR_Value = InputClk / (BaudRate * (IterBAUDDIV + 1)); + + /* + * Calculate the baud rate from the BRGR value + */ + CalcBaudRate = InputClk/ (BRGR_Value * (IterBAUDDIV + 1)); + + /* + * Avoid unsigned integer underflow + */ + if (BaudRate > CalcBaudRate) { + BaudError = BaudRate - CalcBaudRate; + } else { + BaudError = CalcBaudRate - BaudRate; + } + + /* + * Find the calculated baud rate closest to requested baud rate. + */ + if (Best_Error > BaudError) { + + Best_BRGR = BRGR_Value; + Best_BAUDDIV = IterBAUDDIV; + Best_Error = BaudError; + } + } + + /* + * Make sure the best error is not too large. + */ + PercentError = (Best_Error * 100) / BaudRate; + if (MAX_BAUD_ERROR_RATE < PercentError) { + return; + } + + /* set CD and BDIV */ + Xil_Out32(STDOUT_BASEADDRESS + UART_BAUDGEN_OFFSET, Best_BRGR); + Xil_Out32(STDOUT_BASEADDRESS + UART_BAUDDIV_OFFSET, Best_BAUDDIV); + + /* + * 8 data, 1 stop, 0 parity bits + * sel_clk=uart_clk=APB clock + */ + Xil_Out32(STDOUT_BASEADDRESS + UART_MR_OFFSET, 0x20); + + /* enable Tx/Rx and reset Tx/Rx data path */ + Xil_Out32((STDOUT_BASEADDRESS + UART_CR_OFFSET), 0x17); + + return; +#endif +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/uart.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/uart.o new file mode 100644 index 0000000000000000000000000000000000000000..7ab0c0b3b1b31cef88f2d9d6d12b1c3682f6a570 GIT binary patch literal 3728 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 literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/unlink.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/unlink.c new file mode 100755 index 000000000..908457004 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/unlink.c @@ -0,0 +1,58 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +#include <errno.h> + +#ifdef __cplusplus +extern "C" { + int unlink(char *path); +} +#endif +/* + * unlink -- since we have no file system, + * we just return an error. + */ +int unlink(char *path) +{ + (void)path; + errno = EIO; + return (-1); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/unlink.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/unlink.o new file mode 100644 index 0000000000000000000000000000000000000000..603e225b7bbc46fd31567314706309408753310a GIT binary patch literal 2700 zcma)8PiP!f7=LeOHoNVn+a_sgYO9WtVv1yD*EGh~e@)X^Leo-O1wH6GJ3HN7-OR?B z*^<<XRSzN*DOm8PJ@nu~1ur6kH_?L^4|)}$D2gXh5D|>O-^_cv6EFI;@BP02?|a{S z^ENLptvn{B6q=-%7DGu0tB_g>hf|mqd&IaX9h>?2@6F9$3e_98MD@xKLVSO#bmg<3 zzJ!mF`dRW2P}-Q*F-Vgc2*WCL!bF&I<WFc!S$d9O6be|?G>Sh`vWgW#DP7wv6;Gzh z!nc`iCq1p=93;zPdL(%UP>?=mIVTSSNP0>6F@%x*nB-i9*~TcAFi|f`@;l7Nr2HHp zEh~+dWAb2SqHI?7SH|SH+%*D^DN!yzQZ^B2Di&2*JE2{k!0L{CbkwXIEk9VkXLNaj zQO8E!K0Yd88!3p)vOHlRQ}K;gr5KYnSW1q_M?Eykia-{IAzn(6+W^mk2UG+n#aRN) zmiSGceOFr#fKlh5RfAqo!EGCY?uPuUvP0nfdE^+<?X4y5lbvoSTz6}Soq2cp{8IhI zd3Wi=DYq5&T`yX7VRRc9jsv#gwtS!Jne{YkCh!^^7m>~^9R~mZ?a>MSZoe70@kT5} zKSa*w9Uh+uqA2V+?d%d3(ruV?vf4H*)Y<KYEjyifhx%dMX@x=4rm*HE?O~#mXP&SZ z?X(P$`fu?arrDzQ+g_wn40ESSx7+i*uG{y$C~;4B{HV9MaPIMXZGNWqfcrw<Yr2;< z8om03xY4aQ;x%_Ip0E48C<)fRBlRlV6i2=rCtld}uy|0vI9spP>YfXARv))eucw<A zaT}rbmeSNl(_%6+1LDr5AlX<8ggCjlc+{Rg-|I(y5N+6ty=HJc2>rIb(n$jQzG`jO zsm{&J9yz3Xvf!ZA9?we1DX@k4nFTSjy|_@4+l+B*x7;K5nv-&$yiML=+>M*Ti@6Ds z!nj-+-63{E*2Eilyi$72coU9Jys?^i4PX*w*w$PWbRD!L5l+)fJmECrSU6NRgGRqq z?}Qh6Fr~cLXhgw9Eus5)M=$ciR<I=&_b1TaSWY;8Z*?_5i=2gXryVazqE4fqY>l}P zd8=sM|ED|Q$`1vfa7ug=^&3M4KUxxBnr$hUO;;iC>&5q;#?y~7UmE5!F-R*J3})I$ z_hQihzx-H_jsctI`-+SrZL31g*LNMl*U+)P0*0>d7<e56R_ujvnT#TBI|EtsG`$63 zLHQ80?dcp({Wmb!WE5$?ry%F+Yi<`}7j&$TdR^ZdcpU>){0`w$GK#dV3pt-JK|XyR zW!Q8+?u{|*59vd^K9f2LWU?HuE7X2p;9zRdY0`ezpn!>Grt}8{R|`O$`eu%&c^U;x zlTpO_NH;L@`?#Fz%P!dTKE}Z7y8>36h2bMIiuAg~>~|tFte`12l>D}JJ|fr5=j%ej zZ$XpJr)7<Ky(NC#)Ow;h*nOrox2!<BC9u65<+IVwn>r*@@V9VCW_rSTIo~<P^W=wQ ziXHfu?K{(Q=R-2nj^t(ji83Tp>>POTO&G`i_72UNZSXrc<%y}L{;AQ=etLcfaCm%Q z3~YyQu7NUnp2R&0_YrY$w=2Ahh-UF_(eHkR4=X&O@RY)H3i+MU|5=4Cg`vV16~3bI pDiP~mQ+S<-JM)gRzo+C6l>HN>Pxpg~9cBFc3VF{AG@bpT{vX`YKYIWG literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/usleep.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/usleep.c new file mode 100755 index 000000000..84c0f20e3 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/usleep.c @@ -0,0 +1,113 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file usleep.c +* +* This function provides a microsecond delay using the Global Timer register in +* the ARM Cortex A9 MP core. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 11/11/09 First release +* 3.07a sgd 07/05/12 Upadted micro sleep function to make use Global Timer +* </pre> +* +******************************************************************************/ +/***************************** Include Files *********************************/ + +#include "sleep.h" +#include "xtime_l.h" +#include "xparameters.h" +#include "xpseudo_asm.h" +#include "xreg_cortexa9.h" + +/* Global Timer is always clocked at half of the CPU frequency */ +#define COUNTS_PER_USECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ / (2*1000000)) + +/*****************************************************************************/ +/** +* +* This is not implemented . +* +* @param nanoseconds +* +* @return None +* +* @note None. +* +****************************************************************************/ +void nanosleep(unsigned int nanoseconds){ + /* not implemented */ + (void)nanoseconds; +} + +/*****************************************************************************/ +/** +* +* This API gives a delay in microseconds +* +* @param useconds requested +* +* @return 0 if the delay can be achieved, -1 if the requested delay +* is out of range +* +* @note None. +* +****************************************************************************/ +int usleep(unsigned int useconds) +{ + XTime tEnd, tCur; + + XTime_GetTime(&tCur); + tEnd = tCur + ((XTime) useconds) * COUNTS_PER_USECOND; + do + { + XTime_GetTime(&tCur); + } while (tCur < tEnd); + + return 0; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/usleep.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/usleep.o new file mode 100644 index 0000000000000000000000000000000000000000..ce913107e3a57c2657d9b5e518d9450afbeddd0d GIT binary patch literal 2816 zcmb7GU2IfE6h3qBZoBQa+tPyaC$3r)qrKa;m<k&05C4C`QV5#pa(DN(tl93?-Ma(` z1Vcch2?SCTUi%=gCdT+=On6crB*6!x@xf4d(fFbyJ`fYv@0*?3Zi$KUG-tl^H)qbA znVs8n+xP8IN{J;Un`B87*%j5E=w=O@WR>*EhI(poZglY1*zNsy<=Dbvw=69FU9bOk zd-T@g_O#ra-*Np;)0Vuo7?ned5t&pE>h-N63-@BTFWsGc@2g+_L{3NNji@S6eXEtm zu*=BK7Z991Lm1sy`!zsBUBaj)b(s-*&x(2*7`>tG6xBg-BkgZNYEz$5&#NB*jJAoj zq5U20<do;Zu`j7kZ^YO(H6J-VABlb6v^ZCfb*zT=Gx%$8r#gt0CC-Vo8C|*}(LyPd zZgmbu=S`*V0}~viC&JXCR;Z1M{<xc1msp|tRBs#N9uYUOHU4sZcRw~dAo2LC@S|c+ zz1G$6Jk!PC(avk*T?#?bXmf_siF#WDclYbiHWS+35{k8Ao0rY(`0%_!Md^NK?fmGx z5~uU(I8w%~L!`@86cg!gUFa2EN+K#OyQc?bQ_y`zC{FjR5W5<3FOmI+ot@OgGg%2% za*#l`k|P*3t;cBYh_Ni4APrO6&m(ZuUx{wPUFN+2E2&kBK``g#pv%dyFdJlw-f=2u zp3dohC(7;j)SmQSaU!a~Vedt!4Ovpfa?UTNYB|3WruG+dmGZ>c<Wwd-GMIiT^={42 zr%s>BmNV1UY%!Cq&ZXw6Bbi*e5(X#zEt#QIv5>7+a;a+Qm-2qGTnaKLhBN7O#!ta4 zwNkY(Qws7)-jiB2$dya^s_Z;)I60Br?2UNCa&(I2?hHbrl>Aaz??sSmCaH&qa&V`O zSrTq9<r`B>;$|PhiCRTu=fuR;<fcRAS|t}$P9-PG`CvRK<&G!!6~Z9-!ccnH8+vhY zc+0b<mN5?v^8-Iy5H-NwjSP-STW9-NOm#SYk(FwddemL5)~K~=gYzUh&r`00aFNa= zy1KOvlO~=v&y+-Y8+bg?dm(bsec!pP#uL03UiH*$=x2dprGdw-R0)b6njDIk_d{R2 zY_%#Ljrky3o5>VP(`C4{>}Ru;;Dpt1o~?m?#V^eS%jOmfrNBmGIq`Dk+1UUm<c&@4 z_xv!d6tcB&`JCyBkMsE-^f+R9LGd%x#CMff-V%F4S_kgXQe*fXN-sqIx;US4F)-f~ z>ModcrUA{7KGJhw#{X9w>#=hn>U<9<7_vUT$F21V-iw>CvA!tS);9{-&VeX3D2o&f zS>FNZR;KF+exQ3y48i*Nq+6Nx1;iyO7_z=Mptsg{6ZP5t(QfOTgKXz8#SP>;O2Lrz z6`{B0`w{urPwqDkw)xn9&S8H@tI_bE8loQQBY$Af#@$C;T1PYn8+QdNTr5-5Q&=cv z6(HkCpMb4QeF|}-6b!LG(gL`3A9t{iBy8MAFPL%M*9x$`D-h*lI6k9b$gV|1%bIir zlZRmBQ*QGSxn^s=8!-IaKAMS)VAr7<kw5CKes|f9nZI=f>JeVc7HZ8#KX2+1xzfI* zKyq~_mQ3!l&e6}4Um{n!@z>aQ!^)j6k*hn>s^bISLay{QBX|yd*xy<p<!wfP0%%ER zZ$9n=z6_XmUw;f5j)%S^`drrc3I5B&I}GGI<Y3!;vmI=Q=T2N@a19X${Fp(m&wn?b zHvVCQTMUj85zl&wuN%8>aK<3ML)w4B;AtZ6&IRMYZ1j1fUpM$U5qZBcc*ofFJ}|H+ W^y_+nyoU}Bg`XAL2aL}BQ~w9QTtg86 literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.c new file mode 100755 index 000000000..dd010d7ef --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.c @@ -0,0 +1,177 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file vectors.c +* +* This file contains the C level vectors for the ARM Cortex A9 core. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a ecm 10/20/09 Initial version, moved over from bsp area +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ +/***************************** Include Files *********************************/ + +#include "xil_exception.h" +#include "vectors.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +typedef struct { + Xil_ExceptionHandler Handler; + void *Data; +} XExc_VectorTableEntry; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +extern XExc_VectorTableEntry XExc_VectorTable[]; + +/************************** Function Prototypes ******************************/ + + + +/*****************************************************************************/ +/** +* +* This is the C level wrapper for the FIQ interrupt called from the vectors.s +* file. +* +* @param None. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void FIQInterrupt(void) +{ + XExc_VectorTable[XIL_EXCEPTION_ID_FIQ_INT].Handler(XExc_VectorTable[ + XIL_EXCEPTION_ID_FIQ_INT].Data); +} + +/*****************************************************************************/ +/** +* +* This is the C level wrapper for the IRQ interrupt called from the vectors.s +* file. +* +* @param None. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void IRQInterrupt(void) +{ + XExc_VectorTable[XIL_EXCEPTION_ID_IRQ_INT].Handler(XExc_VectorTable[ + XIL_EXCEPTION_ID_IRQ_INT].Data); +} + +/*****************************************************************************/ +/** +* +* This is the C level wrapper for the SW Interrupt called from the vectors.s +* file. +* +* @param None. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void SWInterrupt(void) +{ + XExc_VectorTable[XIL_EXCEPTION_ID_SWI_INT].Handler(XExc_VectorTable[ + XIL_EXCEPTION_ID_SWI_INT].Data); +} + +/*****************************************************************************/ +/** +* +* This is the C level wrapper for the DataAbort Interrupt called from the +* vectors.s file. +* +* @param None. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void DataAbortInterrupt(void) +{ + XExc_VectorTable[XIL_EXCEPTION_ID_DATA_ABORT_INT].Handler( + XExc_VectorTable[XIL_EXCEPTION_ID_DATA_ABORT_INT].Data); +} + +/*****************************************************************************/ +/** +* +* This is the C level wrapper for the PrefetchAbort Interrupt called from the +* vectors.s file. +* +* @param None. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void PrefetchAbortInterrupt(void) +{ + XExc_VectorTable[XIL_EXCEPTION_ID_PREFETCH_ABORT_INT].Handler( + XExc_VectorTable[XIL_EXCEPTION_ID_PREFETCH_ABORT_INT].Data); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.h new file mode 100755 index 000000000..1b094cd17 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.h @@ -0,0 +1,90 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file vectors.h +* +* This file contains the C level vector prototypes for the ARM Cortex A9 core. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a ecm 10/20/10 Initial version, moved over from bsp area +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _VECTORS_H_ +#define _VECTORS_H_ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" + +#ifdef __cplusplus +extern "C" { +#endif +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/************************** Function Prototypes ******************************/ +void FIQInterrupt(void); +void IRQInterrupt(void); +void SWInterrupt(void); +void DataAbortInterrupt(void); +void PrefetchAbortInterrupt(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/vectors.o new file mode 100644 index 0000000000000000000000000000000000000000..29be1675f757fbf328e87e42209449ce70f1942d GIT binary patch literal 3568 zcma)8O>9(E6h8OOw4HXQL+Ou}A90W(HMBERS}7pHlu~FF2o@Cl9p22mwv$X}>YG<= z2?i2OV1dSj#28jhWT7T5T(~is5aZ6B3m3)>Atac%(3M6L@%!GpZ{`iQ(UZLUopZi( z&%O8DJNM3|iDO5UQsRq}eyLj`KQ+5d(})ZG(j%P`$qfE1X}K%u%-wY2#=Q}_ac|dy z)SbxXukQ!BesBY8a2?>f*WeQ1`qtoj!EFw3yD?eAom*H90M(OleB?Sru4^<@<PucF zXh}0X+_HyOq~#1jMc$&*Xc~99rXE71iCsf1g^`<s8V;AyHmM6}o7qT9I1+9umK|x0 zsELo^XxoBlb>wxZ#x`l&0aQmBYHSNj=v|tVSI|b)M(QS_MK-g6sHl35;3#@HzXZ*w ziW9CXdQRiZ(2S}Ahq|fgS-^MB^B$-7Ger-Vewp4Fr#1khUE*AVI<b{eO4NF_J>C@! z#W%&*t4`H{jW+ru8a)6Pmi~x@;`^e{M5ns2_;v78L2-7(6qM#Bq1{44B%=F8L|VI4 zG|GOAYHP10+0%xFC*@$w%eo`RF*D5{9Eyp=l$z>deEU{RFg{Z2bTGCbv@2n>hP*9A zRtP#q^MrN+A9<p?y8)i|e$5kEwP1hRXEje`{enDgNApD1HpqMPfzzEGv3~TZzk<(@ zVYce8csq*k{@}O`a^A{26}y_uGjOR`%34c#Yr!d2%E>vpP;>Wqhwg|<g*v}%_>35G zl`7@ggxl~io;ovCb}ZXoTyW&b)C+avu<4j`^u&va@x(}SG&wA8m&J0mI9s*~3HF_u z4#d~fHpHBrSjuN#awmP-%#|#uvH3aEmWSzyvSTkxs#M9FrPN~Hw4K!PV&1Ndk4>M> z4vh{D?Mc14XckfzmUETtOf^@^=Bf*+h3aTFU$Gr)$=sVwr%J_K)y}7?j#)04n3t73 zKb##J%9<&-<t&PZNqI$^L`cc9y~S}&zN22}>KrmBYSU(r=c0Dfwq`6RKR1>`&{VCG zEZ##dce!$Oe0*P`|5Rns&Rh0!V!TqY4q4^=T;f>Ku@bw|L&M4R(}Tl%pVCDiOJYY& z%ghx;^>K4Y2gjtjtz|5tT8++dx9U-khI-WowNY&`p1=v=`F{XWVqA>J+NB$|FFbdL z;*l%Hd#dKAZ#6%E1FQLY_E+=s%m@9FtS-+xW)A4s9?toiZIzPPD@T$A9<pSvT9qW7 z1uM5Wn=O`SDxh55%;jwByl>%H1OrXmEYDgEeM`l%<ws*UN#-l_^A<KLIW~PfX*!Nw z%q=>NeP(QP-oo_%w>*wWlv=!}PGkf+f8)OJ&Y^6=*Xn9s^9QcJlTdMUx&0Z(OKH2d zLqN)Hx2-oEi?S0R<Nqs;^YQyYb@S~DID9n?E;zqQ9G(nF&X4bzKfergzYkRT6UL`h zwD{Z!*uGBc7H*;yDq4JwFP^WHI*bJ+sA%!ImthCzcdcEd13u1=et&*Edww6NQb4{p zsA%!I66|2U50Q`cWIk+7E#F1x?8Ev{zCpf=eiGPJ`CZlM#~nb?hT!wXk9!{uq~J7N zsUR-p8$dtxt$<E?1##D?XyJM(EBJ!zSiw3@!pC)V;PdOU9y-RYNk0zk=QXQ7F30!& z6M1AG-rjR?^6v2S5jkcs-#aLp?R9Zme;onWzx-kO?Lm-t|1t#}p@tDSUfA86dPw6a zAwiJ>5|WmH#s1vkx`Y}kN1i)hmk|H=z~p*8scW=D0mic#U6+uo6V{!=`>+$cyT!G< zhS|9H<a~ZVbpO6({3LAuo~8XN?1eyl;7>rGDSd^;hx_3twegt_zW1xVQfs_t-kI8o zg|V6gzyy$XpSHOM+8J&0e-Z81wC!knN!z?T4Qv(PD+61AP#1eNZXn`NKBjRi5$CdB z^Q<BJ?bi6L#={z)*Ep?_cM0QpFA#ZO6K`t#MB^74zanD%+Zw+mV)5S*(eHch|3TxA zn!ls@``Z7D#$Pr6yXODaegnsu<1`bIznzHu-P+%)akJ(JHSg9B4bKz%XEgFRYv4ZU d)%Jk4)7p0H1AbE5+#klD(>C{sHus5n{{aPR!rlM? literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/write.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/write.c new file mode 100755 index 000000000..fff2882ad --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/write.c @@ -0,0 +1,103 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ + +/* write.c -- write bytes to an output device. + */ + +#include "xparameters.h" +#include "xil_printf.h" + +#ifdef __cplusplus +extern "C" { + int _write (int fd, char* buf, int nbytes); +} +#endif + +/* + * write -- write bytes to the serial port. Ignore fd, since + * stdout and stderr are the same. Since we have no filesystem, + * open will only return an error. + */ +int +write (int fd, char* buf, int nbytes) + +{ +#ifdef STDOUT_BASEADDRESS + int i; + + (void)fd; + for (i = 0; i < nbytes; i++) { + if (*(buf + i) == '\n') { + outbyte ('\r'); + } + outbyte (*(buf + i)); + } + return (nbytes); +#else + (void)fd; + (void)buf; + (void)nbytes; + return 0; +#endif +} + +int +_write (int fd, char* buf, int nbytes) +{ +#ifdef STDOUT_BASEADDRESS + int i; + + (void)fd; + for (i = 0; i < nbytes; i++) { + if (*(buf + i) == '\n') { + outbyte ('\r'); + } + outbyte (*(buf + i)); + } + return (nbytes); +#else + (void)fd; + (void)buf; + (void)nbytes; + return 0; +#endif +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/write.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/write.o new file mode 100644 index 0000000000000000000000000000000000000000..35de8997566e0a485196b3a3d9c37a563e256131 GIT binary patch literal 3484 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 YCY~exwrJ#AvG5LgPSp2lnde3MZwKA06#xJL literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil-crt0.S b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil-crt0.S new file mode 100755 index 000000000..d5409c29d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil-crt0.S @@ -0,0 +1,166 @@ +/****************************************************************************** +* +* (c) Copyright 2009-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil-crt0.S +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a ecm 10/20/09 Initial version +* 3.05a sdm 02/02/12 Added code for profiling +* 3.06a sgd 05/16/12 Added global constructors and cleanup code +* Uart initialization based on compiler flag +* 3.07a sgd 07/05/12 Updated with reset and start Global Timer +* 3.07a sgd 10/19/12 SMC NOR and SRAM initialization with build option +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +.extern XSmc_NorInit +.extern XSmc_SramInit + + .file "xil-crt0.S" + .section ".got2","aw" + .align 2 + + .text +.Lsbss_start: + .long __sbss_start + +.Lsbss_end: + .long __sbss_end + +.Lbss_start: + .long __bss_start + +.Lbss_end: + .long __bss_end + +.Lstack: + .long __stack + + + .globl _start +_start: + bl __cpu_init /* Initialize the CPU first (BSP provides this) */ + + mov r0, #0 + + /* clear sbss */ + ldr r1,.Lsbss_start /* calculate beginning of the SBSS */ + ldr r2,.Lsbss_end /* calculate end of the SBSS */ + +.Lloop_sbss: + cmp r1,r2 + bge .Lenclsbss /* If no SBSS, no clearing required */ + str r0, [r1], #4 + b .Lloop_sbss + +.Lenclsbss: + /* clear bss */ + ldr r1,.Lbss_start /* calculate beginning of the BSS */ + ldr r2,.Lbss_end /* calculate end of the BSS */ + +.Lloop_bss: + cmp r1,r2 + bge .Lenclbss /* If no BSS, no clearing required */ + str r0, [r1], #4 + b .Lloop_bss + +.Lenclbss: + + /* set stack pointer */ + ldr r13,.Lstack /* stack address */ + + /* Reset and start Global Timer */ + mov r0, #0x0 + mov r1, #0x0 + bl XTime_SetTime + +#ifdef PEEP + /* Initialize STDOUT */ + bl Init_Uart + + /* Initialize the SMC interfaces for NOR */ + bl XSmc_NorInit + + /* Initialize the SMC interfaces for SRAM */ + bl XSmc_SramInit +#endif + +#ifdef PROFILING /* defined in Makefile */ + /* Setup profiling stuff */ + bl _profile_init +#endif /* PROFILING */ + + /* run global constructors */ + bl __libc_init_array + + /* make sure argc and argv are valid */ + mov r0, #0 + mov r1, #0 + + /* Let her rip */ + bl main + + /* Cleanup global constructors */ + bl __libc_fini_array + +#ifdef PROFILING + /* Cleanup profiling stuff */ + bl _profile_clean +#endif /* PROFILING */ + + /* All done */ + bl exit + +.Lexit: /* should never get here */ + b .Lexit + +.Lstart: + .size _start,.Lstart-_start diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil-crt0.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil-crt0.o new file mode 100644 index 0000000000000000000000000000000000000000..483d0a4a6f7a44f81fd59e4ebf4b02fdb5b53e06 GIT binary patch literal 2016 zcma)7&u`pR5FXpvbQ4NR+ER)dDO;3E6)1LglQ!kX3MdFsXqy&Q2+4Z(I;mA>cd@-y z(o5mQi31nTIU>XXi3@)M7o=V}q7n&}6X!}S-)DPv-3SCDy*KlHZ{E!NF@Apd_WM^Y z%Muk!F3J>%4DDj1u~DdtvM49i^%?!wc>IUR!Q+*M<-?WM@}Vs^enp&bXXNwWo{q;) zHo$NE1OL{e<wMSsg@eb8p>gWC;-7R|NNFMy#A2O++1Om|%Iy5HZqu5x=bhu$4Uo2+ zXKy_{@w{MT+zXl|dvUTFrumw?1qRZvPosB!5o@jOwLQ=46#Y6(=adVoeYtJh2=OJ{ z%0rl8utN6G*8+OUAT)_L3Qd}O*Wxf8yxF~Z%WrS4wy$`fj!e&cupbQk?JP+AARBta zY|{@1X&&vF*ZnmwiGwT+y(~BVo=FD%$iKhtx7)t)K+8KH+-`NZS{=8u?q2GM^_jIO z3$u&XNy}-TYhGxcYH&$QXw@nS3*jm!;%581xe3J0^0d@<)k>qp#aeQ4dnPyH23aQV z&LHoI+r4?sHF=)K!6=Ww(zO=_qa8nq`%xXo{p|q)6k{d`(&&DD)TE}rg8=_qmf^|c zo~>rE{_6XgsrYlybCpeX{g}ud=oip9pMFiW3l(;tDc_Z9((Bc}28RCs<+lbO&iOY# zUEk%>X9!gY^PaD4D$V;|%_jdd+HD$@sNYrK`hLH`ez{)m7v^NYAH&u;Fy$41uV_@F zV;=$6<9&}HEpUuSUe9kEw$6bmKLGFpQqeKqk=h*l37|!z60Vh!qt)|1Lf!>%%zGS7 z^De^HGlnU@Bi<J@D$!ijW&M`}XYo}WfMiU*Sd2%TIqUI$M1g$`PDSG>R$b?3<j=A4 z)Xp<ICaz~7)@mqcInpThIE`Ty`<|X>JsaoG75+SzQl=KMBhOWQshpw`rj&Cen}e_F z<aD?=7k+OlJf~L`Kohf$RfykE08RWZ8rR<|uq7Wtt8kq4s6u>K0W|T0BlzJFT(4dF z*Pq{&o~#)0{R|J6k5@F!6-50W%sNfGWZ@XzlZk&g9QkoS&gIUncsKI5qMRDD@j8da zh;P!=?8~l+`$}(PMny+^m|KdCg5!<bC}!5XjRo_@Y!oxsZsYKIR!ivkRxQ0K@(J~s o@?4f)5=n^9;{QwivWN?f-%;@%+VfRBTze4@JmXEqkyQD=0eZjoDgXcg literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.c new file mode 100755 index 000000000..5ef2eee45 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.c @@ -0,0 +1,139 @@ +/****************************************************************************** +* +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_assert.c +* +* This file contains basic assert related functions for Xilinx software IP. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 07/14/09 Initial release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Variable Definitions *****************************/ + +/** + * This variable allows testing to be done easier with asserts. An assert + * sets this variable such that a driver can evaluate this variable + * to determine if an assert occurred. + */ +unsigned int Xil_AssertStatus; + +/** + * This variable allows the assert functionality to be changed for testing + * such that it does not wait infinitely. Use the debugger to disable the + * waiting during testing of asserts. + */ +int Xil_AssertWait = TRUE; + +/* The callback function to be invoked when an assert is taken */ +static Xil_AssertCallback Xil_AssertCallbackRoutine = NULL; + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* +* Implement assert. Currently, it calls a user-defined callback function +* if one has been set. Then, it potentially enters an infinite loop depending +* on the value of the Xil_AssertWait variable. +* +* @param file is the name of the filename of the source +* @param line is the linenumber within File +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void Xil_Assert(const char *File, int Line) +{ + /* if the callback has been set then invoke it */ + if (Xil_AssertCallbackRoutine != 0) { + (*Xil_AssertCallbackRoutine)(File, Line); + } + + /* if specified, wait indefinitely such that the assert will show up + * in testing + */ + while (Xil_AssertWait) { + } +} + +/*****************************************************************************/ +/** +* +* Set up a callback function to be invoked when an assert occurs. If there +* was already a callback installed, then it is replaced. +* +* @param routine is the callback to be invoked when an assert is taken +* +* @return None. +* +* @note This function has no effect if NDEBUG is set +* +******************************************************************************/ +void Xil_AssertSetCallback(Xil_AssertCallback Routine) +{ + Xil_AssertCallbackRoutine = Routine; +} + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.h new file mode 100755 index 000000000..419492f94 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.h @@ -0,0 +1,195 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_assert.h +* +* This file contains assert related functions. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 07/14/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XIL_ASSERT_H /* prevent circular inclusions */ +#define XIL_ASSERT_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ + + +/************************** Constant Definitions *****************************/ + +#define XIL_ASSERT_NONE 0 +#define XIL_ASSERT_OCCURRED 1 + +extern unsigned int Xil_AssertStatus; +extern void Xil_Assert(const char *, int); + + +/** + * This data type defines a callback to be invoked when an + * assert occurs. The callback is invoked only when asserts are enabled + */ +typedef void (*Xil_AssertCallback) (const char *File, int Line); + +/***************** Macros (Inline Functions) Definitions *********************/ + +#ifndef NDEBUG + +/*****************************************************************************/ +/** +* This assert macro is to be used for functions that do not return anything +* (void). This in conjunction with the Xil_AssertWait boolean can be used to +* accomodate tests so that asserts which fail allow execution to continue. +* +* @param expression is the expression to evaluate. If it evaluates to +* false, the assert occurs. +* +* @return Returns void unless the Xil_AssertWait variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define Xil_AssertVoid(Expression) \ +{ \ + if (Expression) { \ + Xil_AssertStatus = XIL_ASSERT_NONE; \ + } else { \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return; \ + } \ +} + +/*****************************************************************************/ +/** +* This assert macro is to be used for functions that do return a value. This in +* conjunction with the Xil_AssertWait boolean can be used to accomodate tests +* so that asserts which fail allow execution to continue. +* +* @param expression is the expression to evaluate. If it evaluates to false, +* the assert occurs. +* +* @return Returns 0 unless the Xil_AssertWait variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define Xil_AssertNonvoid(Expression) \ +{ \ + if (Expression) { \ + Xil_AssertStatus = XIL_ASSERT_NONE; \ + } else { \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return 0; \ + } \ +} + +/*****************************************************************************/ +/** +* Always assert. This assert macro is to be used for functions that do not +* return anything (void). Use for instances where an assert should always +* occur. +* +* @return Returns void unless the Xil_AssertWait variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define Xil_AssertVoidAlways() \ +{ \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return; \ +} + +/*****************************************************************************/ +/** +* Always assert. This assert macro is to be used for functions that do return +* a value. Use for instances where an assert should always occur. +* +* @return Returns void unless the Xil_AssertWait variable is true, in which +* case no return is made and an infinite loop is entered. +* +* @note None. +* +******************************************************************************/ +#define Xil_AssertNonvoidAlways() \ +{ \ + Xil_Assert(__FILE__, __LINE__); \ + Xil_AssertStatus = XIL_ASSERT_OCCURRED; \ + return 0; \ +} + + +#else + +#define Xil_AssertVoid(Expression) +#define Xil_AssertVoidAlways() +#define Xil_AssertNonvoid(Expression) +#define Xil_AssertNonvoidAlways() + +#endif + +/************************** Function Prototypes ******************************/ + +void Xil_AssertSetCallback(Xil_AssertCallback Routine); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_assert.o new file mode 100644 index 0000000000000000000000000000000000000000..d97b7d56024c9735b3ae122b2003be7cd9f70491 GIT binary patch literal 3356 zcma)8-EWgs7=O;&cI(!z8-vN0VlhKz*xJqw2N+=85Hyat4+wan&D-u}Yv@{R-w|dY z5bz^%;YT1bF+_~<%6Q|A7aG078~+HSL1K_AKQ2r(%-`?yoc1lo#3y~v@A*2<dCqgb zdhwa5!%8W!q+~#vlE|JmZHbI(7?3{cmFW1;UCGF8$&BN>c1L9XHq4zPYv~^!)JHFU z9lgJ{_De%ASMF?sAICU=#?f)Z>JU(!fZ~=`h)_XtRP+YHX+K2waQh6UXnVeHD^ux2 z7PKugNQg#YlF%R>=9bWg!)3G)brEfwZmxoZ`gOGJSv1jbq*(T)Lv2R@bsCLGeZ~;K zhtT;B8g-hTlN1kXkzv?9_Ar{bnhpJ~X5(rGfF!%rDxKa?48++u7eqx6I&od=Ut&8W z-JcRqQi_DoNKb-_=>d4Ex(1Vel!o0@9p|9NAZnf3kysxKCAKEksb1BC#d7*37CQhH zO7M_`68mCL$DUh{*>*!uCeo*N#ub>hh)`~STtn3Ki;8rl)WLYY=gv6ej<>x(p}TZO z8WA0g6?^NlLJFAs)yqnp&i5udG4Fr%?lip<f!=WJ9&HAL*wYjb#vLd$h0!{4L5M6Q zcx2e5tzebR5NHkyYJan77O6YT1|4P_4qP|00~>wp#-rkxwvVt?e<ivECk3<R0a0?U zSjxGznpgEx1?Yk@HytRVLx=8(%G|`xRimNaFV{O!L@8Cui%H#Z+nq$Dtd2DAyZ%Z| zR?4;FV%b|rwpu6MQYr5iPRmrW?8%Yo<H^b7Xlg7qB05w{ujU9X>cCK*--vg(Sn_19 zvf?vt!@scPRs*?NZ|j#XRSIq?y;5+ie)?#!P_0a6=Z@uu$A*UYq+eNa7t*h;<}0~V zwR|a;uboMssg30dm8$QZbNA*l=~6LYs}|BV-z_h=$kxl99mx$3=iD^Zfnn=&Yc0eH zx9Cf43Bi($Z0XUmBy~I0dLnXUa&ljCV7{_aEqK+{<YZ;RoAAnorQ}r6_mWR$hDTDF z-9saLpD;Derm%#r=jMx|`nj58Ls@C-Y|lnjhtnJ0p!(Ft&?dE6ZBg5t$G9!x_|`x; z3g;8?F4+Lt5;x~WB6`JnTWLS)sp}z=s;w^jZXW1Y>$qgOs#i*(WWJ;pT;G*czE+bI zl?z^eWieMQpQ^y5c{iW0dS|VK)d@PfRkyt8we&4<wM}0PC#gbZdD%m~QrWqqDcAR_ z#r%rj+UHc&UG|vr|0P~rtWEtHsn0oh!g#JpJf9t!t2ftUf+s@+7nJT#KOX!YM%Gs) z_;dJd46qG;7kK(xzw-eb*oGh1fcaUX-$X!RS>_VV?-ue)!pQvi-q`%c!P`Dy<r@fm zKrC6?G!&Mn?FQ}&K53S$O}`RW3A_)#WI(olFG3g0?<Z_V?k(m=z0L0oc-sf8Y(s%g zk}+g$CCI^ee;^*~$#|H0BOdF;KCBPvEaKH{5XfZty=l<;-9<vf&{?v6??QnPOjFYq z6gO=Jpbh;=fTwv1etXCm;(SRT;S0{=Z_FbJ9p}-5&(>ufc)M4?%4>-CIT=HCT%x|# zjs6mXzY8VLdLKT<V_c3IjMsyrU4hP$jb~+xL48<$U9);(s4@GxHq<f#?P1}chbAfE zyqXl&=d3A*^m+PkIgEdUb>h5~o?XxzMG8<z+5-~v;f`risAVN+=T2%;NV;@BtY4j) z9OY2`wlp@%t+NeDw@er-&vh>{J_@w=Eaif+b3W@3p$a5lmw#JpeM9<j<4$F#C!c*` zF4N$KrGFvtKt1>_HlNsl(|q8yZ93?8tSOq;U+1z57bdGW2;{$%T_|mmGLZA3o%@}3 z{KUb&#!noSjB8Hhek5)tV$(iia67SE^xD$S^F@5h;C_RL3_fpg&LHm^`oC=On!yi< z80SNS9}~MoJ~Q?&jQo|6zcuoAMD+W?=zliyJ%fK5eH#u3$L%Fz!8RJXpSTG%F>=P> de&R+`A8a*r)#HpC<e7DPMbK622aTLD@;}!mm}~$5 literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.c new file mode 100755 index 000000000..0d33b8be0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.c @@ -0,0 +1,1499 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache.c +* +* Contains required functions for the ARM cache functionality. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 01/29/10 First release +* 1.00a ecm 06/24/10 Moved the L1 and L2 specific function prototypes +* to xil_cache_mach.h to give access to sophisticated users +* 3.02a sdm 04/07/11 Updated Flush/InvalidateRange APIs to flush/invalidate +* L1 and L2 caches in a single loop and used dsb, L2 sync +* at the end of the loop. +* 3.04a sdm 01/02/12 Remove redundant dsb/dmb instructions in cache maintenance +* APIs. +* 3.07a asa 07/16/12 Corrected the L1 and L2 cache invalidation order. +* 3.07a sgd 09/18/12 Corrected the L2 cache enable and disable sequence. +* 3.10a srt 04/18/13 Implemented ARM Erratas. Please refer to file +* 'xil_errata.h' for errata description +* 3.10a asa 05/13/13 Modified cache disable APIs. The L2 cache disable +* operation was being done with L1 Data cache disabled. This is +* fixed so that L2 cache disable operation happens independent of +* L1 cache disable operation. This fixes CR #706464. +* Changes are done to do a L2 cache sync (poll reg7_?cache_?sync). +* This is done to fix the CR #700542. +* 3.11a asa 09/23/13 Modified the Xil_DCacheFlushRange and +* Xil_DCacheInvalidateRange to fix potential issues. Fixed other +* relevant cache APIs to disable and enable back the interrupts. +* This fixes CR #663885. +* 3.11a asa 09/28/13 Made changes for L2 cache sync operation. It is found +* out that for L2 cache flush/clean/invalidation by cache lines +* does not need a cache sync as these are atomic nature. Similarly +* figured out that for complete L2 cache flush/invalidation by way +* we need to wait for some more time in a loop till the status +* shows that the cache operation is completed. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_cache.h" +#include "xil_cache_l.h" +#include "xil_io.h" +#include "xpseudo_asm.h" +#include "xparameters.h" +#include "xreg_cortexa9.h" +#include "xl2cc.h" +#include "xil_errata.h" +#include "xil_exception.h" + +/************************** Function Prototypes ******************************/ + +/**************************************************************************** +* +* Access L2 Debug Control Register. +* +* @param Value, value to be written to Debug Control Register. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +#ifdef __GNUC__ +static inline Xil_L2WriteDebugCtrl(u32 Value) +#else +static void Xil_L2WriteDebugCtrl(u32 Value) +#endif +{ +#if defined(CONFIG_PL310_ERRATA_588369) || defined(CONFIG_PL310_ERRATA_727915) + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_DEBUG_CTRL_OFFSET, Value); +#else + (void)(Value); +#endif +} + +/**************************************************************************** +* +* Perform L2 Cache Sync Operation. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +#ifdef __GNUC__ +static inline Xil_L2CacheSync(void) +#else +static void Xil_L2CacheSync(void) +#endif +{ +#ifdef CONFIG_PL310_ERRATA_753970 + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_DUMMY_CACHE_SYNC_OFFSET, 0x0); +#else + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_SYNC_OFFSET, 0x0); +#endif +} + +/**************************************************************************** +* +* Enable the Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheEnable(void) +{ + Xil_L1DCacheEnable(); + Xil_L2CacheEnable(); +} + +/**************************************************************************** +* +* Disable the Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheDisable(void) +{ + Xil_L2CacheDisable(); + Xil_L1DCacheDisable(); +} + +/**************************************************************************** +* +* Invalidate the entire Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheInvalidate(void) +{ + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + Xil_L2CacheInvalidate(); + Xil_L1DCacheInvalidate(); + + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Invalidate a Data cache line. If the byte specified by the address (adr) +* is cached by the Data cache, the cacheline containing that byte is +* invalidated. If the cacheline is modified (dirty), the modified contents +* are lost and are NOT written to system memory before the line is +* invalidated. +* +* @param Address to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_DCacheInvalidateLine(unsigned int adr) +{ + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + Xil_L2CacheInvalidateLine(adr); + Xil_L1DCacheInvalidateLine(adr); + + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Invalidate the Data cache for the given address range. +* If the bytes specified by the address (adr) are cached by the Data cache, +* the cacheline containing that byte is invalidated. If the cacheline +* is modified (dirty), the modified contents are lost and are NOT +* written to system memory before the line is invalidated. +* +* @param Start address of range to be invalidated. +* @param Length of range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheInvalidateRange(unsigned int adr, unsigned len) +{ + const unsigned cacheline = 32; + unsigned int end; + unsigned int tempadr = adr; + unsigned int tempend; + unsigned int currmask; + volatile u32 *L2CCOffset = (volatile u32 *) (XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INVLD_PA_OFFSET); + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + if (len != 0) { + end = tempadr + len; + tempend = end; + /* Select L1 Data cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + + if (tempadr & (cacheline-1)) { + tempadr &= ~(cacheline - 1); + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3); + Xil_L2CacheFlushLine(tempadr); + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0); + Xil_L1DCacheFlushLine(tempadr); + tempadr += cacheline; + } + if (tempend & (cacheline-1)) { + tempend &= ~(cacheline - 1); + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3); + Xil_L2CacheFlushLine(tempend); + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0); + Xil_L1DCacheFlushLine(tempadr); + } + + while (tempadr < tempend) { + /* Invalidate L2 cache line */ + *L2CCOffset = tempadr; + dsb(); +#ifdef __GNUC__ + /* Invalidate L1 Data cache line */ + __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_DC_LINE_MVA_POC :: "r" (tempadr)); +#elif defined (__ICCARM__) + __asm volatile ("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (tempadr)); +#else + { volatile register unsigned int Reg + __asm(XREG_CP15_INVAL_DC_LINE_MVA_POC); + Reg = tempadr; } +#endif + tempadr += cacheline; + } + } + + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Flush the entire Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheFlush(void) +{ + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + Xil_L1DCacheFlush(); + Xil_L2CacheFlush(); + + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Flush a Data cache line. If the byte specified by the address (adr) +* is cached by the Data cache, the cacheline containing that byte is +* invalidated. If the cacheline is modified (dirty), the entire +* contents of the cacheline are written to system memory before the +* line is invalidated. +* +* @param Address to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_DCacheFlushLine(unsigned int adr) +{ + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + Xil_L1DCacheFlushLine(adr); + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3); + + Xil_L2CacheFlushLine(adr); + + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0); + mtcpsr(currmask); +} + +/**************************************************************************** +* Flush the Data cache for the given address range. +* If the bytes specified by the address (adr) are cached by the Data cache, +* the cacheline containing that byte is invalidated. If the cacheline +* is modified (dirty), the written to system memory first before the +* before the line is invalidated. +* +* @param Start address of range to be flushed. +* @param Length of range to be flushed in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_DCacheFlushRange(unsigned int adr, unsigned len) +{ + const unsigned cacheline = 32; + unsigned int end; + unsigned int currmask; + volatile u32 *L2CCOffset = (volatile u32 *) (XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INV_CLN_PA_OFFSET); + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + if (len != 0) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = adr + len; + adr &= ~(cacheline - 1); + + while (adr < end) { +#ifdef __GNUC__ + /* Flush L1 Data cache line */ + __asm__ __volatile__("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (adr)); +#elif defined (__ICCARM__) + __asm volatile ("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (adr)); +#else + { volatile register unsigned int Reg + __asm(XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC); + Reg = adr; } +#endif + /* Flush L2 cache line */ + *L2CCOffset = adr; + dsb(); + adr += cacheline; + } + } + dsb(); + mtcpsr(currmask); +} +/**************************************************************************** +* +* Store a Data cache line. If the byte specified by the address (adr) +* is cached by the Data cache and the cacheline is modified (dirty), +* the entire contents of the cacheline are written to system memory. +* After the store completes, the cacheline is marked as unmodified +* (not dirty). +* +* @param Address to be stored. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_DCacheStoreLine(unsigned int adr) +{ + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + Xil_L1DCacheStoreLine(adr); + Xil_L2CacheStoreLine(adr); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Enable the instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ICacheEnable(void) +{ + Xil_L1ICacheEnable(); + Xil_L2CacheEnable(); +} + +/**************************************************************************** +* +* Disable the instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ICacheDisable(void) +{ + Xil_L2CacheDisable(); + Xil_L1ICacheDisable(); +} + +/**************************************************************************** +* +* Invalidate the entire instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ICacheInvalidate(void) +{ + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + Xil_L2CacheInvalidate(); + Xil_L1ICacheInvalidate(); + + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Invalidate an instruction cache line. If the instruction specified by the +* parameter adr is cached by the instruction cache, the cacheline containing +* that instruction is invalidated. +* +* @param None. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_ICacheInvalidateLine(unsigned int adr) +{ + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + Xil_L2CacheInvalidateLine(adr); + Xil_L1ICacheInvalidateLine(adr); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Invalidate the instruction cache for the given address range. +* If the bytes specified by the address (adr) are cached by the Data cache, +* the cacheline containing that byte is invalidated. If the cacheline +* is modified (dirty), the modified contents are lost and are NOT +* written to system memory before the line is invalidated. +* +* @param Start address of range to be invalidated. +* @param Length of range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ICacheInvalidateRange(unsigned int adr, unsigned len) +{ + const unsigned cacheline = 32; + unsigned int end; + volatile u32 *L2CCOffset = (volatile u32 *) (XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INVLD_PA_OFFSET); + + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + if (len != 0) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = adr + len; + adr = adr & ~(cacheline - 1); + + /* Select cache L0 I-cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 1); + + while (adr < end) { + /* Invalidate L2 cache line */ + *L2CCOffset = adr; + dsb(); +#ifdef __GNUC__ + /* Invalidate L1 I-cache line */ + __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (adr)); +#elif defined (__ICCARM__) + __asm volatile ("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (adr)); +#else + { volatile register unsigned int Reg + __asm(XREG_CP15_INVAL_IC_LINE_MVA_POU); + Reg = adr; } +#endif + + adr += cacheline; + } + } + + /* Wait for L1 and L2 invalidate to complete */ + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Enable the level 1 Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1DCacheEnable(void) +{ + register unsigned int CtrlReg; + + /* enable caches only if they are disabled */ +#ifdef __GNUC__ + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_SYS_CONTROL, CtrlReg); +#else + { volatile register unsigned int Reg __asm(XREG_CP15_SYS_CONTROL); + CtrlReg = Reg; } +#endif + if (CtrlReg & XREG_CP15_CONTROL_C_BIT) { + return; + } + + /* clean and invalidate the Data cache */ + Xil_L1DCacheInvalidate(); + + /* enable the Data cache */ + CtrlReg |= (XREG_CP15_CONTROL_C_BIT); + + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); +} + +/**************************************************************************** +* +* Disable the level 1 Data cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1DCacheDisable(void) +{ + register unsigned int CtrlReg; + + /* clean and invalidate the Data cache */ + Xil_L1DCacheFlush(); + +#ifdef __GNUC__ + /* disable the Data cache */ + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_SYS_CONTROL, CtrlReg); +#else + { volatile register unsigned int Reg __asm(XREG_CP15_SYS_CONTROL); + CtrlReg = Reg; } +#endif + + CtrlReg &= ~(XREG_CP15_CONTROL_C_BIT); + + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); +} + +/**************************************************************************** +* +* Invalidate the level 1 Data cache. +* +* @param None. +* +* @return None. +* +* @note In Cortex A9, there is no cp instruction for invalidating +* the whole D-cache. This function invalidates each line by +* set/way. +* +****************************************************************************/ +void Xil_L1DCacheInvalidate(void) +{ + register unsigned int CsidReg, C7Reg; + unsigned int CacheSize, LineSize, NumWays; + unsigned int Way, WayIndex, Set, SetIndex, NumSet; + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + /* Select cache level 0 and D cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + +#ifdef __GNUC__ + CsidReg = mfcp(XREG_CP15_CACHE_SIZE_ID); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_CACHE_SIZE_ID, CsidReg); +#else + { volatile register unsigned int Reg __asm(XREG_CP15_CACHE_SIZE_ID); + CsidReg = Reg; } +#endif + /* Determine Cache Size */ + CacheSize = (CsidReg >> 13) & 0x1FF; + CacheSize +=1; + CacheSize *=128; /* to get number of bytes */ + + /* Number of Ways */ + NumWays = (CsidReg & 0x3ff) >> 3; + NumWays += 1; + + /* Get the cacheline size, way size, index size from csidr */ + LineSize = (CsidReg & 0x07) + 4; + + NumSet = CacheSize/NumWays; + NumSet /= (1 << LineSize); + + Way = 0UL; + Set = 0UL; + + /* Invalidate all the cachelines */ + for (WayIndex =0; WayIndex < NumWays; WayIndex++) { + for (SetIndex =0; SetIndex < NumSet; SetIndex++) { + C7Reg = Way | Set; +#ifdef __GNUC__ + /* Invalidate by Set/Way */ + __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_DC_LINE_SW :: "r" (C7Reg)); +#elif defined (__ICCARM__) + __asm volatile ("mcr " \ + XREG_CP15_INVAL_DC_LINE_SW :: "r" (C7Reg)); +#else + //mtcp(XREG_CP15_INVAL_DC_LINE_SW, C7Reg); + { volatile register unsigned int Reg + __asm(XREG_CP15_INVAL_DC_LINE_SW); + Reg = C7Reg; } +#endif + Set += (1 << LineSize); + } + Way += 0x40000000; + } + + /* Wait for L1 invalidate to complete */ + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Invalidate a level 1 Data cache line. If the byte specified by the address +* (Addr) is cached by the Data cache, the cacheline containing that byte is +* invalidated. If the cacheline is modified (dirty), the modified contents +* are lost and are NOT written to system memory before the line is +* invalidated. +* +* @param Address to be flushed. +* +* @return None. +* +* @note The bottom 5 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L1DCacheInvalidateLine(unsigned int adr) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + mtcp(XREG_CP15_INVAL_DC_LINE_MVA_POC, (adr & (~0x1F))); + + /* Wait for L1 invalidate to complete */ + dsb(); +} + +/**************************************************************************** +* +* Invalidate the level 1 Data cache for the given address range. +* If the bytes specified by the address (adr) are cached by the Data cache, +* the cacheline containing that byte is invalidated. If the cacheline +* is modified (dirty), the modified contents are lost and are NOT +* written to system memory before the line is invalidated. +* +* @param Start address of range to be invalidated. +* @param Length of range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1DCacheInvalidateRange(unsigned int adr, unsigned len) +{ + const unsigned cacheline = 32; + unsigned int end; + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + if (len != 0) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = adr + len; + adr = adr & ~(cacheline - 1); + + /* Select cache L0 D-cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + + while (adr < end) { +#ifdef __GNUC__ + __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_DC_LINE_MVA_POC :: "r" (adr)); +#elif defined (__ICCARM__) + __asm volatile ("mcr " \ + XREG_CP15_INVAL_DC_LINE_MVA_POC :: "r" (adr)); +#else + { volatile register unsigned int Reg + __asm(XREG_CP15_INVAL_DC_LINE_MVA_POC); + Reg = adr; } +#endif + adr += cacheline; + } + } + + /* Wait for L1 invalidate to complete */ + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Flush the level 1 Data cache. +* +* @param None. +* +* @return None. +* +* @note In Cortex A9, there is no cp instruction for flushing +* the whole D-cache. Need to flush each line. +* +****************************************************************************/ +void Xil_L1DCacheFlush(void) +{ + register unsigned int CsidReg, C7Reg; + unsigned int CacheSize, LineSize, NumWays; + unsigned int Way, WayIndex, Set, SetIndex, NumSet; + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + /* Select cache level 0 and D cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + +#ifdef __GNUC__ + CsidReg = mfcp(XREG_CP15_CACHE_SIZE_ID); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_CACHE_SIZE_ID, CsidReg); +#else + { volatile register unsigned int Reg __asm(XREG_CP15_CACHE_SIZE_ID); + CsidReg = Reg; } +#endif + + /* Determine Cache Size */ + + CacheSize = (CsidReg >> 13) & 0x1FF; + CacheSize +=1; + CacheSize *=128; /* to get number of bytes */ + + /* Number of Ways */ + NumWays = (CsidReg & 0x3ff) >> 3; + NumWays += 1; + + /* Get the cacheline size, way size, index size from csidr */ + LineSize = (CsidReg & 0x07) + 4; + + NumSet = CacheSize/NumWays; + NumSet /= (1 << LineSize); + + Way = 0UL; + Set = 0UL; + + /* Invalidate all the cachelines */ + for (WayIndex =0; WayIndex < NumWays; WayIndex++) { + for (SetIndex =0; SetIndex < NumSet; SetIndex++) { + C7Reg = Way | Set; + /* Flush by Set/Way */ +#ifdef __GNUC__ + __asm__ __volatile__("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_SW :: "r" (C7Reg)); +#elif defined (__ICCARM__) + __asm volatile ("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_SW :: "r" (C7Reg)); +#else + { volatile register unsigned int Reg + __asm(XREG_CP15_CLEAN_INVAL_DC_LINE_SW); + Reg = C7Reg; } +#endif + Set += (1 << LineSize); + } + Way += 0x40000000; + } + + /* Wait for L1 flush to complete */ + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Flush a level 1 Data cache line. If the byte specified by the address (adr) +* is cached by the Data cache, the cacheline containing that byte is +* invalidated. If the cacheline is modified (dirty), the entire +* contents of the cacheline are written to system memory before the +* line is invalidated. +* +* @param Address to be flushed. +* +* @return None. +* +* @note The bottom 5 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L1DCacheFlushLine(unsigned int adr) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + mtcp(XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC, (adr & (~0x1F))); + + /* Wait for L1 flush to complete */ + dsb(); +} + +/**************************************************************************** +* Flush the level 1 Data cache for the given address range. +* If the bytes specified by the address (adr) are cached by the Data cache, +* the cacheline containing that byte is invalidated. If the cacheline +* is modified (dirty), the written to system memory first before the +* before the line is invalidated. +* +* @param Start address of range to be flushed. +* @param Length of range to be flushed in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1DCacheFlushRange(unsigned int adr, unsigned len) +{ + const unsigned cacheline = 32; + unsigned int end; + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + if (len != 0) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = adr + len; + adr = adr & ~(cacheline - 1); + + /* Select cache L0 D-cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + + while (adr < end) { +#ifdef __GNUC__ + __asm__ __volatile__("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (adr)); +#elif defined (__ICCARM__) + __asm volatile ("mcr " \ + XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC :: "r" (adr)); +#else + { volatile register unsigned int Reg + __asm(XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC); + Reg = adr; } +#endif + adr += cacheline; + } + } + + /* Wait for L1 flush to complete */ + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Store a level 1 Data cache line. If the byte specified by the address (adr) +* is cached by the Data cache and the cacheline is modified (dirty), +* the entire contents of the cacheline are written to system memory. +* After the store completes, the cacheline is marked as unmodified +* (not dirty). +* +* @param Address to be stored. +* +* @return None. +* +* @note The bottom 5 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L1DCacheStoreLine(unsigned int adr) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 0); + mtcp(XREG_CP15_CLEAN_DC_LINE_MVA_POC, (adr & (~0x1F))); + + /* Wait for L1 store to complete */ + dsb(); +} + +/**************************************************************************** +* +* Enable the level 1 instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1ICacheEnable(void) +{ + register unsigned int CtrlReg; + + /* enable caches only if they are disabled */ +#ifdef __GNUC__ + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_SYS_CONTROL, CtrlReg); +#else + { volatile register unsigned int Reg __asm(XREG_CP15_SYS_CONTROL); + CtrlReg = Reg; } +#endif + if (CtrlReg & XREG_CP15_CONTROL_I_BIT) { + return; + } + + /* invalidate the instruction cache */ + mtcp(XREG_CP15_INVAL_IC_POU, 0); + + /* enable the instruction cache */ + CtrlReg |= (XREG_CP15_CONTROL_I_BIT); + + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); +} + +/**************************************************************************** +* +* Disable level 1 the instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1ICacheDisable(void) +{ + register unsigned int CtrlReg; + + dsb(); + + /* invalidate the instruction cache */ + mtcp(XREG_CP15_INVAL_IC_POU, 0); + + /* disable the instruction cache */ +#ifdef __GNUC__ + CtrlReg = mfcp(XREG_CP15_SYS_CONTROL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_SYS_CONTROL, CtrlReg); +#else + { volatile register unsigned int Reg __asm(XREG_CP15_SYS_CONTROL); + CtrlReg = Reg; } +#endif + CtrlReg &= ~(XREG_CP15_CONTROL_I_BIT); + + mtcp(XREG_CP15_SYS_CONTROL, CtrlReg); +} + +/**************************************************************************** +* +* Invalidate the entire level 1 instruction cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1ICacheInvalidate(void) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 1); + /* invalidate the instruction cache */ + mtcp(XREG_CP15_INVAL_IC_POU, 0); + + /* Wait for L1 invalidate to complete */ + dsb(); +} + +/**************************************************************************** +* +* Invalidate a level 1 instruction cache line. If the instruction specified by +* the parameter adr is cached by the instruction cache, the cacheline containing +* that instruction is invalidated. +* +* @param None. +* +* @return None. +* +* @note The bottom 5 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L1ICacheInvalidateLine(unsigned int adr) +{ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 1); + mtcp(XREG_CP15_INVAL_IC_LINE_MVA_POU, (adr & (~0x1F))); + + /* Wait for L1 invalidate to complete */ + dsb(); +} + +/**************************************************************************** +* +* Invalidate the level 1 instruction cache for the given address range. +* If the bytes specified by the address (adr) are cached by the Data cache, +* the cacheline containing that byte is invalidated. If the cacheline +* is modified (dirty), the modified contents are lost and are NOT +* written to system memory before the line is invalidated. +* +* @param Start address of range to be invalidated. +* @param Length of range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L1ICacheInvalidateRange(unsigned int adr, unsigned len) +{ + const unsigned cacheline = 32; + unsigned int end; + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + if (len != 0) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = adr + len; + adr = adr & ~(cacheline - 1); + + /* Select cache L0 I-cache in CSSR */ + mtcp(XREG_CP15_CACHE_SIZE_SEL, 1); + + while (adr < end) { +#ifdef __GNUC__ + __asm__ __volatile__("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (adr)); +#elif defined (__ICCARM__) + __asm volatile ("mcr " \ + XREG_CP15_INVAL_IC_LINE_MVA_POU :: "r" (adr)); +#else + { volatile register unsigned int Reg + __asm(XREG_CP15_INVAL_IC_LINE_MVA_POU); + Reg = adr; } +#endif + adr += cacheline; + } + } + + /* Wait for L1 invalidate to complete */ + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Enable the L2 cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheEnable(void) +{ + register unsigned int L2CCReg; + + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CNTRL_OFFSET); + + /* only enable if L2CC is currently disabled */ + if ((L2CCReg & 0x01) == 0) { + /* set up the way size and latencies */ + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + + XPS_L2CC_AUX_CNTRL_OFFSET); + L2CCReg &= XPS_L2CC_AUX_REG_ZERO_MASK; + L2CCReg |= XPS_L2CC_AUX_REG_DEFAULT_MASK; + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_AUX_CNTRL_OFFSET, + L2CCReg); + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_TAG_RAM_CNTRL_OFFSET, + XPS_L2CC_TAG_RAM_DEFAULT_MASK); + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_DATA_RAM_CNTRL_OFFSET, + XPS_L2CC_DATA_RAM_DEFAULT_MASK); + + /* Clear the pending interrupts */ + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + + XPS_L2CC_ISR_OFFSET); + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_IAR_OFFSET, L2CCReg); + + Xil_L2CacheInvalidate(); + /* Enable the L2CC */ + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + + XPS_L2CC_CNTRL_OFFSET); + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CNTRL_OFFSET, + (L2CCReg | (0x01))); + + Xil_L2CacheSync(); + /* synchronize the processor */ + dsb(); + + } +} + +/**************************************************************************** +* +* Disable the L2 cache. +* +* @param None. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheDisable(void) +{ + register unsigned int L2CCReg; + + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CNTRL_OFFSET); + + if(L2CCReg & 0x1) { + + /* Clean and Invalidate L2 Cache */ + Xil_L2CacheFlush(); + + /* Disable the L2CC */ + L2CCReg = Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CNTRL_OFFSET); + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CNTRL_OFFSET, + (L2CCReg & (~0x01))); + /* Wait for the cache operations to complete */ + + dsb(); + } +} + +/**************************************************************************** +* +* Invalidate the L2 cache. If the byte specified by the address (adr) +* is cached by the Data cache, the cacheline containing that byte is +* invalidated. If the cacheline is modified (dirty), the modified contents +* are lost and are NOT written to system memory before the line is +* invalidated. +* +* @param Address to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L2CacheInvalidate(void) +{ + /* Invalidate the caches */ + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INVLD_WAY_OFFSET, + 0x0000FFFF); + while((Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INVLD_WAY_OFFSET)) + & 0x0000FFFF); + + /* Wait for the invalidate to complete */ + Xil_L2CacheSync(); + + /* synchronize the processor */ + dsb(); +} + +/**************************************************************************** +* +* Invalidate a level 2 cache line. If the byte specified by the address (adr) +* is cached by the Data cache, the cacheline containing that byte is +* invalidated. If the cacheline is modified (dirty), the modified contents +* are lost and are NOT written to system memory before the line is +* invalidated. +* +* @param Address to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L2CacheInvalidateLine(unsigned int adr) +{ + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INVLD_PA_OFFSET, adr); + /* synchronize the processor */ + dsb(); +} + +/**************************************************************************** +* +* Invalidate the level 2 cache for the given address range. +* If the bytes specified by the address (adr) are cached by the Data cache, +* the cacheline containing that byte is invalidated. If the cacheline +* is modified (dirty), the modified contents are lost and are NOT +* written to system memory before the line is invalidated. +* +* @param Start address of range to be invalidated. +* @param Length of range to be invalidated in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheInvalidateRange(unsigned int adr, unsigned len) +{ + const unsigned cacheline = 32; + unsigned int end; + volatile u32 *L2CCOffset = (volatile u32 *) (XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INVLD_PA_OFFSET); + + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + + if (len != 0) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = adr + len; + adr = adr & ~(cacheline - 1); + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3); + + while (adr < end) { + *L2CCOffset = adr; + adr += cacheline; + } + + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0); + } + + /* synchronize the processor */ + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Flush the L2 cache. If the byte specified by the address (adr) +* is cached by the Data cache, the cacheline containing that byte is +* invalidated. If the cacheline is modified (dirty), the entire +* contents of the cacheline are written to system memory before the +* line is invalidated. +* +* @param Address to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L2CacheFlush(void) +{ + unsigned int L2CCReg; + + /* Flush the caches */ + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3); + + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET, + 0x0000FFFF); + + while((Xil_In32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET)) + & 0x0000FFFF); + + Xil_L2CacheSync(); + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0); + + /* synchronize the processor */ + dsb(); +} + +/**************************************************************************** +* +* Flush a level 2 cache line. If the byte specified by the address (adr) +* is cached by the Data cache, the cacheline containing that byte is +* invalidated. If the cacheline is modified (dirty), the entire +* contents of the cacheline are written to system memory before the +* line is invalidated. +* +* @param Address to be flushed. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L2CacheFlushLine(unsigned int adr) +{ +#ifdef CONFIG_PL310_ERRATA_588369 + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_CLEAN_PA_OFFSET, adr); + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INVLD_PA_OFFSET, adr); +#else + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_INV_CLN_PA_OFFSET, adr); +#endif + /* synchronize the processor */ + dsb(); +} + +/**************************************************************************** +* Flush the level 2 cache for the given address range. +* If the bytes specified by the address (adr) are cached by the Data cache, +* the cacheline containing that byte is invalidated. If the cacheline +* is modified (dirty), the written to system memory first before the +* before the line is invalidated. +* +* @param Start address of range to be flushed. +* @param Length of range to be flushed in bytes. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_L2CacheFlushRange(unsigned int adr, unsigned len) +{ + const unsigned cacheline = 32; + unsigned int end; + volatile u32 *L2CCOffset = (volatile u32 *) (XPS_L2CC_BASEADDR + + XPS_L2CC_CACHE_INV_CLN_PA_OFFSET); + + unsigned int currmask; + + currmask = mfcpsr(); + mtcpsr(currmask | 0xC0); + if (len != 0) { + /* Back the starting address up to the start of a cache line + * perform cache operations until adr+len + */ + end = adr + len; + adr = adr & ~(cacheline - 1); + + /* Disable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x3); + + while (adr < end) { + *L2CCOffset = adr; + Xil_L2CacheSync(); + adr += cacheline; + } + + /* Enable Write-back and line fills */ + Xil_L2WriteDebugCtrl(0x0); + } + /* synchronize the processor */ + dsb(); + mtcpsr(currmask); +} + +/**************************************************************************** +* +* Store a level 2 cache line. If the byte specified by the address (adr) +* is cached by the Data cache and the cacheline is modified (dirty), +* the entire contents of the cacheline are written to system memory. +* After the store completes, the cacheline is marked as unmodified +* (not dirty). +* +* @param Address to be stored. +* +* @return None. +* +* @note The bottom 4 bits are set to 0, forced by architecture. +* +****************************************************************************/ +void Xil_L2CacheStoreLine(unsigned int adr) +{ + Xil_Out32(XPS_L2CC_BASEADDR + XPS_L2CC_CACHE_CLEAN_PA_OFFSET, adr); + /* synchronize the processor */ + dsb(); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.h new file mode 100755 index 000000000..e1e0adaac --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.h @@ -0,0 +1,84 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache.h +* +* Contains required functions for the ARM cache functionality +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 01/29/10 First release +* 3.04a sdm 01/02/12 Remove redundant dsb/dmb instructions in cache maintenance +* APIs. +* </pre> +* +******************************************************************************/ +#ifndef XIL_CACHE_H +#define XIL_CACHE_H + +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void Xil_DCacheEnable(void); +void Xil_DCacheDisable(void); +void Xil_DCacheInvalidate(void); +void Xil_DCacheInvalidateRange(unsigned int adr, unsigned len); +void Xil_DCacheFlush(void); +void Xil_DCacheFlushRange(unsigned int adr, unsigned len); + +void Xil_ICacheEnable(void); +void Xil_ICacheDisable(void); +void Xil_ICacheInvalidate(void); +void Xil_ICacheInvalidateRange(unsigned int adr, unsigned len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache.o new file mode 100644 index 0000000000000000000000000000000000000000..f1dc768a3dac639c156ff2d3c83fb8c9815e9a26 GIT binary patch literal 21832 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 literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache_l.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache_l.h new file mode 100755 index 000000000..d0c3f40e6 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache_l.h @@ -0,0 +1,103 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache_l.h +* +* Contains L1 and L2 specific functions for the ARM cache functionality +* used by xcache.c. This functionality is being made available here for +* more sophisticated users. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 01/24/10 First release +* </pre> +* +******************************************************************************/ +#ifndef XIL_CACHE_MACH_H +#define XIL_CACHE_MACH_H + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Function Prototypes ******************************/ + +void Xil_DCacheInvalidateLine(unsigned int adr); +void Xil_DCacheFlushLine(unsigned int adr); +void Xil_DCacheStoreLine(unsigned int adr); +void Xil_ICacheInvalidateLine(unsigned int adr); + +void Xil_L1DCacheEnable(void); +void Xil_L1DCacheDisable(void); +void Xil_L1DCacheInvalidate(void); +void Xil_L1DCacheInvalidateLine(unsigned int adr); +void Xil_L1DCacheInvalidateRange(unsigned int adr, unsigned len); +void Xil_L1DCacheFlush(void); +void Xil_L1DCacheFlushLine(unsigned int adr); +void Xil_L1DCacheFlushRange(unsigned int adr, unsigned len); +void Xil_L1DCacheStoreLine(unsigned int adr); + +void Xil_L1ICacheEnable(void); +void Xil_L1ICacheDisable(void); +void Xil_L1ICacheInvalidate(void); +void Xil_L1ICacheInvalidateLine(unsigned int adr); +void Xil_L1ICacheInvalidateRange(unsigned int adr, unsigned len); + +void Xil_L2CacheEnable(void); +void Xil_L2CacheDisable(void); +void Xil_L2CacheInvalidate(void); +void Xil_L2CacheInvalidateLine(unsigned int adr); +void Xil_L2CacheInvalidateRange(unsigned int adr, unsigned len); +void Xil_L2CacheFlush(void); +void Xil_L2CacheFlushLine(unsigned int adr); +void Xil_L2CacheFlushRange(unsigned int adr, unsigned len); +void Xil_L2CacheStoreLine(unsigned int adr); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache_vxworks.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache_vxworks.h new file mode 100755 index 000000000..3ad8965df --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_cache_vxworks.h @@ -0,0 +1,103 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_cache_vxworks.h +* +* Contains the cache related functions for VxWorks that is wrapped by +* xil_cache. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 12/11/09 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ + +#ifndef XIL_CACHE_VXWORKS_H +#define XIL_CACHE_VXWORKS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "vxWorks.h" +#include "vxLib.h" +#include "sysLibExtra.h" +#include "cacheLib.h" + +#if (CPU_FAMILY==PPC) + +#define Xil_DCacheEnable() cacheEnable(DATA_CACHE) + +#define Xil_DCacheDisable() cacheDisable(DATA_CACHE) + +#define Xil_DCacheInvalidateRange(Addr, Len) \ + cacheInvalidate(DATA_CACHE, (void *)(Addr), (Len)) + +#define Xil_DCacheFlushRange(Addr, Len) \ + cacheFlush(DATA_CACHE, (void *)(Addr), (Len)) + +#define Xil_ICacheEnable() cacheEnable(INSTRUCTION_CACHE) + +#define Xil_ICacheDisable() cacheDisable(INSTRUCTION_CACHE) + +#define Xil_ICacheInvalidateRange(Addr, Len) \ + cacheInvalidate(INSTRUCTION_CACHE, (void *)(Addr), (Len)) + + +#else +#error "Unknown processor / architecture. Must be PPC for VxWorks." +#endif + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_errata.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_errata.h new file mode 100755 index 000000000..bb09eef3f --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_errata.h @@ -0,0 +1,117 @@ +/******************************************************************************* +* +* (c) Copyright 2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_errata.h +* +* This header file contains Cortex A9 and PL310 Errata definitions. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a srt 04/18/13 First release +* </pre> +* +******************************************************************************/ +#ifndef XIL_ERRATA_H +#define XIL_ERRATA_H + +#define ENABLE_ARM_ERRATA 1 + +#ifdef ENABLE_ARM_ERRATA +/* Cortex A9 ARM Errata */ + +/* + * Errata No: 742230 + * Description: DMB operation may be faulty + */ +#define CONFIG_ARM_ERRATA_742230 1 + +/* + * Errata No: 743622 + * Description: Faulty hazard checking in the Store Buffer may lead + * to data corruption. + */ +#define CONFIG_ARM_ERRATA_743622 1 + +/* + * Errata No: 775420 + * Description: A data cache maintenance operation which aborts, + * might lead to deadlock + */ +#define CONFIG_ARM_ERRATA_775420 1 + +/* + * Errata No: 794073 + * Description: Speculative instruction fetches with MMU disabled + * might not comply with architectural requirements + */ +#define CONFIG_ARM_ERRATA_794073 1 + + +/* PL310 L2 Cache Errata */ + +/* + * Errata No: 588369 + * Description: Clean & Invalidate maintenance operations do not + * invalidate clean lines + */ +#define CONFIG_PL310_ERRATA_588369 1 + +/* + * Errata No: 727915 + * Description: Background Clean and Invalidate by Way operation + * can cause data corruption + */ +#define CONFIG_PL310_ERRATA_727915 1 + +/* + * Errata No: 753970 + * Description: Cache sync operation may be faulty + */ +#define CONFIG_PL310_ERRATA_753970 1 + +#endif /* ENABLE_ARM_ERRATA */ + +#endif /* XIL_ERRATA_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.c new file mode 100755 index 000000000..77ab9986d --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.c @@ -0,0 +1,188 @@ +/***************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xil_exception.c +* +* This file contains low-level driver functions for the Cortex A9 exception +* Handler. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 11/04/09 First release +* 3.05a sdm 02/02/12 Updated to resiter a null handler only if a handler +* is not already registered +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_exception.h" +#include "xpseudo_asm.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +typedef struct { + Xil_ExceptionHandler Handler; + void *Data; +} XExc_VectorTableEntry; + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Function Prototypes *****************************/ + +/************************** Variable Definitions *****************************/ +/* + * Exception vector table to store handlers for each exception vector. + */ +XExc_VectorTableEntry XExc_VectorTable[XIL_EXCEPTION_ID_LAST + 1]; + +/*****************************************************************************/ + +/****************************************************************************/ +/** +* +* This function is a stub Handler that is the default Handler that gets called +* if the application has not setup a Handler for a specific exception. The +* function interface has to match the interface specified for a Handler even +* though none of the arguments are used. +* +* @param Data is unused by this function. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +static void Xil_ExceptionNullHandler(void *Data) +{ + (void)Data; +DieLoop: goto DieLoop; +} + +/****************************************************************************/ +/** +* +* Initialize exception handling for the Processor. The exception vector table +* is setup with the stub Handler for all exceptions. +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void Xil_ExceptionInit(void) +{ + unsigned long index; + + /* + * Initialize the vector table. Register the stub Handler for each + * exception. + */ + for(index = XIL_EXCEPTION_ID_FIRST; index < XIL_EXCEPTION_ID_LAST + 1; + index++) { + if (XExc_VectorTable[index].Handler == NULL) { + Xil_ExceptionRegisterHandler(index, + Xil_ExceptionNullHandler, + NULL); + } + } +} + +/*****************************************************************************/ +/** +* +* Makes the connection between the Id of the exception source and the +* associated Handler that is to run when the exception is recognized. The +* argument provided in this call as the Data is used as the argument +* for the Handler when it is called. +* +* @param exception_id contains the ID of the exception source and should +* be in the range of 0 to XIL_EXCEPTION_ID_LAST. + See xil_exception_l.h for further information. +* @param Handler to the Handler for that exception. +* @param Data is a reference to Data that will be passed to the +* Handler when it gets called. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ExceptionRegisterHandler(u32 exception_id, + Xil_ExceptionHandler Handler, + void *Data) +{ + XExc_VectorTable[exception_id].Handler = Handler; + XExc_VectorTable[exception_id].Data = Data; +} + +/*****************************************************************************/ +/** +* +* Removes the Handler for a specific exception Id. The stub Handler is then +* registered for this exception Id. +* +* @param exception_id contains the ID of the exception source and should +* be in the range of 0 to XIL_EXCEPTION_ID_LAST. +* See xil_exception_l.h for further information. + +* @return None. +* +* @note None. +* +****************************************************************************/ +void Xil_ExceptionRemoveHandler(u32 exception_id) +{ + Xil_ExceptionRegisterHandler(exception_id, + Xil_ExceptionNullHandler, + NULL); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.h new file mode 100755 index 000000000..dfa50d7fa --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.h @@ -0,0 +1,241 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_exception.h +* +* This header file contains ARM Cortex A9 specific exception related APIs. +* For exception related functions that can be used across all Xilinx supported +* processors, please use xil_exception.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 11/04/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XIL_EXCEPTION_H /* prevent circular inclusions */ +#define XIL_EXCEPTION_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xpseudo_asm.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions ****************************/ + +#define XIL_EXCEPTION_FIQ XREG_CPSR_FIQ_ENABLE +#define XIL_EXCEPTION_IRQ XREG_CPSR_IRQ_ENABLE +#define XIL_EXCEPTION_ALL (XREG_CPSR_FIQ_ENABLE | XREG_CPSR_IRQ_ENABLE) + +#define XIL_EXCEPTION_ID_FIRST 0 +#define XIL_EXCEPTION_ID_RESET 0 +#define XIL_EXCEPTION_ID_UNDEFINED_INT 1 +#define XIL_EXCEPTION_ID_SWI_INT 2 +#define XIL_EXCEPTION_ID_PREFETCH_ABORT_INT 3 +#define XIL_EXCEPTION_ID_DATA_ABORT_INT 4 +#define XIL_EXCEPTION_ID_IRQ_INT 5 +#define XIL_EXCEPTION_ID_FIQ_INT 6 +#define XIL_EXCEPTION_ID_LAST 6 + +/* + * XIL_EXCEPTION_ID_INT is defined for all Xilinx processors. + */ +#define XIL_EXCEPTION_ID_INT XIL_EXCEPTION_ID_IRQ_INT + +/**************************** Type Definitions ******************************/ + +/** + * This typedef is the exception handler function. + */ +typedef void (*Xil_ExceptionHandler)(void *data); +typedef void (*Xil_InterruptHandler)(void *data); + +/***************** Macros (Inline Functions) Definitions ********************/ + +/****************************************************************************/ +/** +* Enable Exceptions. +* +* @param Mask for exceptions to be enabled. +* +* @return None. +* +* @note If bit is 0, exception is enabled. +* C-Style signature: void Xil_ExceptionEnableMask(Mask); +* +******************************************************************************/ +#ifdef __GNUC__ +#define Xil_ExceptionEnableMask(Mask) \ + mtcpsr(mfcpsr() & ~ (Mask & XIL_EXCEPTION_ALL)) +#elif defined (__ICCARM__) +#define Xil_ExceptionEnableMask(Mask) \ + { register unsigned int rval; \ + mfcpsr(rval); \ + mtcpsr(rval & ~ (Mask & XIL_EXCEPTION_ALL)) ;} +#else +#define Xil_ExceptionEnableMask(Mask) \ + { register unsigned int Reg __asm("cpsr"); \ + mtcpsr(Reg & ~ (Mask & XIL_EXCEPTION_ALL)) } +#endif + +/****************************************************************************/ +/** +* Enable the IRQ exception. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +#define Xil_ExceptionEnable() \ + Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ) + +/****************************************************************************/ +/** +* Disable Exceptions. +* +* @param Mask for exceptions to be enabled. +* +* @return None. +* +* @note If bit is 1, exception is disabled. +* C-Style signature: Xil_ExceptionDisableMask(Mask); +* +******************************************************************************/ +#ifdef __GNUC__ +#define Xil_ExceptionDisableMask(Mask) \ + mtcpsr(mfcpsr() | (Mask & XIL_EXCEPTION_ALL)) +#elif defined (__ICCARM__) +#define Xil_ExceptionDisableMask(Mask) \ + { register unsigned int rval; \ + mfcpsr(rval); \ + mtcpsr(rval | (Mask & XIL_EXCEPTION_ALL)) ;} +#else +#define Xil_ExceptionDisableMask(Mask) \ + { register unsigned int Reg __asm("cpsr"); \ + mtcpsr(Reg | (Mask & XIL_EXCEPTION_ALL)) } +#endif + +/****************************************************************************/ +/** +* Disable the IRQ exception. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +#define Xil_ExceptionDisable() \ + Xil_ExceptionDisableMask(XIL_EXCEPTION_IRQ) + +/****************************************************************************/ +/** +* Enable nested interrupts by clearing the I and F bits it CPSR +* +* @return None. +* +* @note This macro is supposed to be used from interrupt handlers. In the +* interrupt handler the interrupts are disabled by default (I and F +* are 1). To allow nesting of interrupts, this macro should be +* used. It clears the I and F bits by changing the ARM mode to +* system mode. Once these bits are cleared and provided the +* preemption of interrupt conditions are met in the GIC, nesting of +* interrupts will start happening. +* Caution: This macro must be used with caution. Before calling this +* macro, the user must ensure that the source of the current IRQ +* is appropriately cleared. Otherwise, as soon as we clear the I and +* F bits, there can be an infinite loop of interrupts with an +* eventual crash (all the stack space getting consumed). +******************************************************************************/ +#define Xil_EnableNestedInterrupts() \ + __asm__ __volatile__ ("mrs lr, spsr"); \ + __asm__ __volatile__ ("stmfd sp!, {lr}"); \ + __asm__ __volatile__ ("msr cpsr_c, #0x1F"); \ + __asm__ __volatile__ ("stmfd sp!, {lr}"); + +/****************************************************************************/ +/** +* Disable the nested interrupts by setting the I and F bits. +* +* @return None. +* +* @note This macro is meant to be called in the interrupt service routines. +* This macro cannot be used independently. It can only be used when +* nesting of interrupts have been enabled by using the macro +* Xil_EnableNestedInterrupts(). In a typical flow, the user first +* calls the Xil_EnableNestedInterrupts in the ISR at the appropriate +* point. The user then must call this macro before exiting the interrupt +* service routine. This macro puts the ARM back in IRQ/FIQ mode and +* hence sets back the I and F bits. +******************************************************************************/ +#define Xil_DisableNestedInterrupts() \ + __asm__ __volatile__ ("ldmfd sp!, {lr}"); \ + __asm__ __volatile__ ("msr cpsr_c, #0x92"); \ + __asm__ __volatile__ ("ldmfd sp!, {lr}"); \ + __asm__ __volatile__ ("msr spsr_cxsf, lr"); + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +extern void Xil_ExceptionRegisterHandler(u32 id, + Xil_ExceptionHandler handler, + void *data); + +extern void Xil_ExceptionRemoveHandler(u32 id); + +extern void Xil_ExceptionInit(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_EXCEPTION_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_exception.o new file mode 100644 index 0000000000000000000000000000000000000000..b12e27372656aba03c901b03d4b51dcaa63e9c1f GIT binary patch literal 4016 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 T)*teWmU*^mKcnSfA0Yo5&u0>s literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_hal.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_hal.h new file mode 100755 index 000000000..b58c7eb8a --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_hal.h @@ -0,0 +1,71 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_hal.h +* +* Contains all the HAL header files. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 07/28/09 Initial release +* +* </pre> +* +* @note +* +******************************************************************************/ + +#ifndef XIL_HAL_H +#define XIL_HAL_H + +#include "xil_cache.h" +#include "xil_io.h" +#include "xil_assert.h" +#include "xil_exception.h" +#include "xil_types.h" + +#endif + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.c new file mode 100755 index 000000000..a091b232e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.c @@ -0,0 +1,350 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_io.c +* +* Contains I/O functions for memory-mapped or non-memory-mapped I/O +* architectures. These functions encapsulate Cortex A9 architecture-specific +* I/O requirements. +* +* @note +* +* This file contains architecture-dependent code. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 10/24/09 First release +* 3.06a sgd 05/15/12 Pointer volatile used for the all read functions +* 3.07a sgd 08/17/12 Removed barriers (SYNCHRONIZE_IO) calls. +* 3.09a sgd 02/05/13 Comments cleanup +* </pre> +******************************************************************************/ + + +/***************************** Include Files *********************************/ +#include "xil_io.h" +#include "xil_types.h" +#include "xil_assert.h" +#include "xpseudo_asm.h" +#include "xreg_cortexa9.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/*****************************************************************************/ +/** +* +* Performs an input operation for an 8-bit memory location by reading from the +* specified address and returning the Value read from that address. +* +* @param Addr contains the address to perform the input operation +* at. +* +* @return The Value read from the specified input address. +* +* @note None. +* +******************************************************************************/ +u8 Xil_In8(u32 Addr) +{ + return *(volatile u8 *) Addr; +} + +/*****************************************************************************/ +/** +* +* Performs an input operation for a 16-bit memory location by reading from the +* specified address and returning the Value read from that address. +* +* @param Addr contains the address to perform the input operation +* at. +* +* @return The Value read from the specified input address. +* +* @note None. +* +******************************************************************************/ +u16 Xil_In16(u32 Addr) +{ + return *(volatile u16 *) Addr; +} + +/*****************************************************************************/ +/** +* +* Performs an input operation for a 32-bit memory location by reading from the +* specified address and returning the Value read from that address. +* +* @param Addr contains the address to perform the input operation +* at. +* +* @return The Value read from the specified input address. +* +* @note None. +* +******************************************************************************/ +u32 Xil_In32(u32 Addr) +{ + return *(volatile u32 *) Addr; +} + +/*****************************************************************************/ +/** +* +* Performs an output operation for an 8-bit memory location by writing the +* specified Value to the the specified address. +* +* @param OutAddress contains the address to perform the output operation +* at. +* @param Value contains the Value to be output at the specified address. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void Xil_Out8(u32 OutAddress, u8 Value) +{ + *(volatile u8 *) OutAddress = Value; +} + +/*****************************************************************************/ +/** +* +* Performs an output operation for a 16-bit memory location by writing the +* specified Value to the the specified address. +* +* @param OutAddress contains the address to perform the output operation +* at. +* @param Value contains the Value to be output at the specified address. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void Xil_Out16(u32 OutAddress, u16 Value) +{ + *(volatile u16 *) OutAddress = Value; +} + +/*****************************************************************************/ +/** +* +* Performs an output operation for a 32-bit memory location by writing the +* specified Value to the the specified address. +* +* @param OutAddress contains the address to perform the output operation +* at. +* @param Value contains the Value to be output at the specified address. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void Xil_Out32(u32 OutAddress, u32 Value) +{ + *(volatile u32 *) OutAddress = Value; +} + +/*****************************************************************************/ +/** +* +* Performs an input operation for a 16-bit memory location by reading from the +* specified address and returning the byte-swapped Value read from that +* address. +* +* @param Addr contains the address to perform the input operation +* at. +* +* @return The byte-swapped Value read from the specified input address. +* +* @note None. +* +******************************************************************************/ +u16 Xil_In16BE(u32 Addr) +{ + u16 temp; + u16 result; + + temp = Xil_In16(Addr); + + result = Xil_EndianSwap16(temp); + + return result; +} + +/*****************************************************************************/ +/** +* +* Performs an input operation for a 32-bit memory location by reading from the +* specified address and returning the byte-swapped Value read from that +* address. +* +* @param Addr contains the address to perform the input operation +* at. +* +* @return The byte-swapped Value read from the specified input address. +* +* @note None. +* +******************************************************************************/ +u32 Xil_In32BE(u32 Addr) +{ + u32 temp; + u32 result; + + temp = Xil_In32(Addr); + + result = Xil_EndianSwap32(temp); + + return result; +} + +/*****************************************************************************/ +/** +* +* Performs an output operation for a 16-bit memory location by writing the +* specified Value to the the specified address. The Value is byte-swapped +* before being written. +* +* @param OutAddress contains the address to perform the output operation +* at. +* @param Value contains the Value to be output at the specified address. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void Xil_Out16BE(u32 OutAddress, u16 Value) +{ + u16 temp; + + temp = Xil_EndianSwap16(Value); + + Xil_Out16(OutAddress, temp); +} + +/*****************************************************************************/ +/** +* +* Performs an output operation for a 32-bit memory location by writing the +* specified Value to the the specified address. The Value is byte-swapped +* before being written. +* +* @param OutAddress contains the address to perform the output operation +* at. +* @param Value contains the Value to be output at the specified address. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void Xil_Out32BE(u32 OutAddress, u32 Value) +{ + u32 temp; + + temp = Xil_EndianSwap32(Value); + + Xil_Out32(OutAddress, temp); +} + +/*****************************************************************************/ +/** +* +* Perform a 16-bit endian converion. +* +* @param Data contains the value to be converted. +* +* @return converted value. +* +* @note None. +* +******************************************************************************/ +u16 Xil_EndianSwap16(u16 Data) +{ + return (u16) (((Data & 0xFF00) >> 8) | ((Data & 0x00FF) << 8)); +} + +/*****************************************************************************/ +/** +* +* Perform a 32-bit endian converion. +* +* @param Data contains the value to be converted. +* +* @return converted value. +* +* @note None. +* +******************************************************************************/ +u32 Xil_EndianSwap32(u32 Data) +{ + u16 LoWord; + u16 HiWord; + + /* get each of the half words from the 32 bit word */ + + LoWord = (u16) (Data & 0x0000FFFF); + HiWord = (u16) ((Data & 0xFFFF0000) >> 16); + + /* byte swap each of the 16 bit half words */ + + LoWord = (((LoWord & 0xFF00) >> 8) | ((LoWord & 0x00FF) << 8)); + HiWord = (((HiWord & 0xFF00) >> 8) | ((HiWord & 0x00FF) << 8)); + + /* swap the half words before returning the value */ + + return (u32) ((LoWord << 16) | HiWord); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.h new file mode 100755 index 000000000..06e83bfa8 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.h @@ -0,0 +1,254 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_io.h +* +* This file contains the interface for the general IO component, which +* encapsulates the Input/Output functions for processors that do not +* require any special I/O handling. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 10/24/09 First release +* 1.00a sdm 07/21/10 Added Xil_Htonl/s, Xil_Ntohl/s +* 3.07a asa 08/31/12 Added xil_printf.h include +* 3.08a sgd 11/05/12 Reverted SYNC macros definitions +* </pre> +******************************************************************************/ + +#ifndef XIL_IO_H /* prevent circular inclusions */ +#define XIL_IO_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xpseudo_asm.h" +#include "xil_printf.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +#if defined __GNUC__ +# define SYNCHRONIZE_IO dmb() +# define INST_SYNC isb() +# define DATA_SYNC dsb() +#else +# define SYNCHRONIZE_IO +# define INST_SYNC +# define DATA_SYNC +#endif /* __GNUC__ */ + +/*****************************************************************************/ +/** +* +* Perform an big-endian input operation for a 16-bit memory location +* by reading from the specified address and returning the Value read from +* that address. +* +* @param Addr contains the address to perform the input operation at. +* +* @return The Value read from the specified input address with the +* proper endianness. The return Value has the same endianness +* as that of the processor, i.e. if the processor is +* little-engian, the return Value is the byte-swapped Value read +* from the address. +* +* @note None. +* +******************************************************************************/ +#define Xil_In16LE(Addr) Xil_In16(Addr) + +/*****************************************************************************/ +/** +* +* Perform a big-endian input operation for a 32-bit memory location +* by reading from the specified address and returning the Value read from +* that address. +* +* @param Addr contains the address to perform the input operation at. +* +* @return The Value read from the specified input address with the +* proper endianness. The return Value has the same endianness +* as that of the processor, i.e. if the processor is +* little-engian, the return Value is the byte-swapped Value read +* from the address. +* +* +* @note None. +* +******************************************************************************/ +#define Xil_In32LE(Addr) Xil_In32(Addr) + +/*****************************************************************************/ +/** +* +* Perform a big-endian output operation for a 16-bit memory location +* by writing the specified Value to the specified address. +* +* @param Addr contains the address to perform the output operation at. +* @param Value contains the Value to be output at the specified address. +* The Value has the same endianness as that of the processor. +* If the processor is little-endian, the byte-swapped Value is +* written to the address. +* +* +* @return None +* +* @note None. +* +******************************************************************************/ +#define Xil_Out16LE(Addr, Value) Xil_Out16(Addr, Value) + +/*****************************************************************************/ +/** +* +* Perform a big-endian output operation for a 32-bit memory location +* by writing the specified Value to the specified address. +* +* @param Addr contains the address to perform the output operation at. +* @param Value contains the Value to be output at the specified address. +* The Value has the same endianness as that of the processor. +* If the processor is little-endian, the byte-swapped Value is +* written to the address. +* +* @return None +* +* @note None. +* +******************************************************************************/ +#define Xil_Out32LE(Addr, Value) Xil_Out32(Addr, Value) + +/*****************************************************************************/ +/** +* +* Convert a 32-bit number from host byte order to network byte order. +* +* @param Data the 32-bit number to be converted. +* +* @return The converted 32-bit number in network byte order. +* +* @note None. +* +******************************************************************************/ +#define Xil_Htonl(Data) Xil_EndianSwap32(Data) + +/*****************************************************************************/ +/** +* +* Convert a 16-bit number from host byte order to network byte order. +* +* @param Data the 16-bit number to be converted. +* +* @return The converted 16-bit number in network byte order. +* +* @note None. +* +******************************************************************************/ +#define Xil_Htons(Data) Xil_EndianSwap16(Data) + +/*****************************************************************************/ +/** +* +* Convert a 32-bit number from network byte order to host byte order. +* +* @param Data the 32-bit number to be converted. +* +* @return The converted 32-bit number in host byte order. +* +* @note None. +* +******************************************************************************/ +#define Xil_Ntohl(Data) Xil_EndianSwap32(Data) + +/*****************************************************************************/ +/** +* +* Convert a 16-bit number from network byte order to host byte order. +* +* @param Data the 16-bit number to be converted. +* +* @return The converted 16-bit number in host byte order. +* +* @note None. +* +******************************************************************************/ +#define Xil_Ntohs(Data) Xil_EndianSwap16(Data) + +/************************** Function Prototypes ******************************/ + +/* The following functions allow the software to be transportable across + * processors which may use memory mapped I/O or I/O which is mapped into a + * seperate address space. + */ +u8 Xil_In8(u32 Addr); +u16 Xil_In16(u32 Addr); +u32 Xil_In32(u32 Addr); + +void Xil_Out8(u32 Addr, u8 Value); +void Xil_Out16(u32 Addr, u16 Value); +void Xil_Out32(u32 Addr, u32 Value); + +u16 Xil_In16BE(u32 Addr); +u32 Xil_In32BE(u32 Addr); +void Xil_Out16BE(u32 Addr, u16 Value); +void Xil_Out32BE(u32 Addr, u32 Value); + +u16 Xil_EndianSwap16(u16 Data); +u32 Xil_EndianSwap32(u32 Data); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_io.o new file mode 100644 index 0000000000000000000000000000000000000000..2dc426b652c47f600a668d65a6e8074bfd6ee331 GIT binary patch literal 6412 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 F{|~{yBAoyL literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_macroback.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_macroback.h new file mode 100755 index 000000000..c614daaf5 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_macroback.h @@ -0,0 +1,1069 @@ +/*********************************************************************/ +/** + * (c) Copyright 2010 Xilinx, Inc. All rights reserved. + * + * This file contains confidential and proprietary information + * of Xilinx, Inc. and is protected under U.S. and + * international copyright and other intellectual property + * laws. + * + * DISCLAIMER + * This disclaimer is not a license and does not grant any + * rights to the materials distributed herewith. Except as + * otherwise provided in a valid license issued to you by + * Xilinx, and to the maximum extent permitted by applicable + * law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND + * WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES + * AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING + * BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- + * INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and + * (2) Xilinx shall not be liable (whether in contract or tort, + * including negligence, or under any other theory of + * liability) for any loss or damage of any kind or nature + * related to, arising under or in connection with these + * materials, including for any direct, or any indirect, + * special, incidental, or consequential loss or damage + * (including loss of data, profits, goodwill, or any type of + * loss or damage suffered as a result of any action brought + * by a third party) even if such damage or loss was + * reasonably foreseeable or Xilinx had been advised of the + * possibility of the same. + * + * CRITICAL APPLICATIONS + * Xilinx products are not designed or intended to be fail- + * safe, or for use in any application requiring fail-safe + * performance, such as life-support or safety devices or + * systems, Class III medical devices, nuclear facilities, + * applications related to the deployment of airbags, or any + * other applications that could lead to death, personal + * injury, or severe property or environmental damage + * (individually and collectively, "Critical + * Applications"). Customer assumes the sole risk and + * liability of any use of Xilinx products in Critical + * Applications, subject only to applicable laws and + * regulations governing limitations on product liability. + * + * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS + * PART OF THIS FILE AT ALL TIMES. + *********************************************************************/ + +/*********************************************************************/ +/** + * @file xil_macroback.h + * + * This header file is meant to bring back the removed _m macros. + * This header file must be included last. + * The following macros are not defined here due to the driver change: + * XGpio_mSetDataDirection + * XGpio_mGetDataReg + * XGpio_mSetDataReg + * XIIC_RESET + * XIIC_CLEAR_STATS + * XSpi_mReset + * XSysAce_mSetCfgAddr + * XSysAce_mIsCfgDone + * XTft_mSetPixel + * XTft_mGetPixel + * XWdtTb_mEnableWdt + * XWdtTb_mDisbleWdt + * XWdtTb_mRestartWdt + * XWdtTb_mGetTimebaseReg + * XWdtTb_mHasReset + * + * Please refer the corresonding driver document for replacement. + * + *********************************************************************/ + +#ifndef XIL_MACROBACK_H +#define XIL_MACROBACK_H + +/*********************************************************************/ +/** + * Macros for Driver XCan + * + *********************************************************************/ +#ifndef XCan_mReadReg +#define XCan_mReadReg XCan_ReadReg +#endif + +#ifndef XCan_mWriteReg +#define XCan_mWriteReg XCan_WriteReg +#endif + +#ifndef XCan_mIsTxDone +#define XCan_mIsTxDone XCan_IsTxDone +#endif + +#ifndef XCan_mIsTxFifoFull +#define XCan_mIsTxFifoFull XCan_IsTxFifoFull +#endif + +#ifndef XCan_mIsHighPriorityBufFull +#define XCan_mIsHighPriorityBufFull XCan_IsHighPriorityBufFull +#endif + +#ifndef XCan_mIsRxEmpty +#define XCan_mIsRxEmpty XCan_IsRxEmpty +#endif + +#ifndef XCan_mIsAcceptFilterBusy +#define XCan_mIsAcceptFilterBusy XCan_IsAcceptFilterBusy +#endif + +#ifndef XCan_mCreateIdValue +#define XCan_mCreateIdValue XCan_CreateIdValue +#endif + +#ifndef XCan_mCreateDlcValue +#define XCan_mCreateDlcValue XCan_CreateDlcValue +#endif + +/*********************************************************************/ +/** + * Macros for Driver XDmaCentral + * + *********************************************************************/ +#ifndef XDmaCentral_mWriteReg +#define XDmaCentral_mWriteReg XDmaCentral_WriteReg +#endif + +#ifndef XDmaCentral_mReadReg +#define XDmaCentral_mReadReg XDmaCentral_ReadReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XDsAdc + * + *********************************************************************/ +#ifndef XDsAdc_mWriteReg +#define XDsAdc_mWriteReg XDsAdc_WriteReg +#endif + +#ifndef XDsAdc_mReadReg +#define XDsAdc_mReadReg XDsAdc_ReadReg +#endif + +#ifndef XDsAdc_mIsEmpty +#define XDsAdc_mIsEmpty XDsAdc_IsEmpty +#endif + +#ifndef XDsAdc_mSetFstmReg +#define XDsAdc_mSetFstmReg XDsAdc_SetFstmReg +#endif + +#ifndef XDsAdc_mGetFstmReg +#define XDsAdc_mGetFstmReg XDsAdc_GetFstmReg +#endif + +#ifndef XDsAdc_mEnableConversion +#define XDsAdc_mEnableConversion XDsAdc_EnableConversion +#endif + +#ifndef XDsAdc_mDisableConversion +#define XDsAdc_mDisableConversion XDsAdc_DisableConversion +#endif + +#ifndef XDsAdc_mGetFifoOccyReg +#define XDsAdc_mGetFifoOccyReg XDsAdc_GetFifoOccyReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XDsDac + * + *********************************************************************/ +#ifndef XDsDac_mWriteReg +#define XDsDac_mWriteReg XDsDac_WriteReg +#endif + +#ifndef XDsDac_mReadReg +#define XDsDac_mReadReg XDsDac_ReadReg +#endif + +#ifndef XDsDac_mIsEmpty +#define XDsDac_mIsEmpty XDsDac_IsEmpty +#endif + +#ifndef XDsDac_mFifoIsFull +#define XDsDac_mFifoIsFull XDsDac_FifoIsFull +#endif + +#ifndef XDsDac_mGetVacancy +#define XDsDac_mGetVacancy XDsDac_GetVacancy +#endif + +/*********************************************************************/ +/** + * Macros for Driver XEmacLite + * + *********************************************************************/ +#ifndef XEmacLite_mReadReg +#define XEmacLite_mReadReg XEmacLite_ReadReg +#endif + +#ifndef XEmacLite_mWriteReg +#define XEmacLite_mWriteReg XEmacLite_WriteReg +#endif + +#ifndef XEmacLite_mGetTxStatus +#define XEmacLite_mGetTxStatus XEmacLite_GetTxStatus +#endif + +#ifndef XEmacLite_mSetTxStatus +#define XEmacLite_mSetTxStatus XEmacLite_SetTxStatus +#endif + +#ifndef XEmacLite_mGetRxStatus +#define XEmacLite_mGetRxStatus XEmacLite_GetRxStatus +#endif + +#ifndef XEmacLite_mSetRxStatus +#define XEmacLite_mSetRxStatus XEmacLite_SetRxStatus +#endif + +#ifndef XEmacLite_mIsTxDone +#define XEmacLite_mIsTxDone XEmacLite_IsTxDone +#endif + +#ifndef XEmacLite_mIsRxEmpty +#define XEmacLite_mIsRxEmpty XEmacLite_IsRxEmpty +#endif + +#ifndef XEmacLite_mNextTransmitAddr +#define XEmacLite_mNextTransmitAddr XEmacLite_NextTransmitAddr +#endif + +#ifndef XEmacLite_mNextReceiveAddr +#define XEmacLite_mNextReceiveAddr XEmacLite_NextReceiveAddr +#endif + +#ifndef XEmacLite_mIsMdioConfigured +#define XEmacLite_mIsMdioConfigured XEmacLite_IsMdioConfigured +#endif + +#ifndef XEmacLite_mIsLoopbackConfigured +#define XEmacLite_mIsLoopbackConfigured XEmacLite_IsLoopbackConfigured +#endif + +#ifndef XEmacLite_mGetReceiveDataLength +#define XEmacLite_mGetReceiveDataLength XEmacLite_GetReceiveDataLength +#endif + +#ifndef XEmacLite_mGetTxActive +#define XEmacLite_mGetTxActive XEmacLite_GetTxActive +#endif + +#ifndef XEmacLite_mSetTxActive +#define XEmacLite_mSetTxActive XEmacLite_SetTxActive +#endif + +/*********************************************************************/ +/** + * Macros for Driver XGpio + * + *********************************************************************/ +#ifndef XGpio_mWriteReg +#define XGpio_mWriteReg XGpio_WriteReg +#endif + +#ifndef XGpio_mReadReg +#define XGpio_mReadReg XGpio_ReadReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XHwIcap + * + *********************************************************************/ +#ifndef XHwIcap_mFifoWrite +#define XHwIcap_mFifoWrite XHwIcap_FifoWrite +#endif + +#ifndef XHwIcap_mFifoRead +#define XHwIcap_mFifoRead XHwIcap_FifoRead +#endif + +#ifndef XHwIcap_mSetSizeReg +#define XHwIcap_mSetSizeReg XHwIcap_SetSizeReg +#endif + +#ifndef XHwIcap_mGetControlReg +#define XHwIcap_mGetControlReg XHwIcap_GetControlReg +#endif + +#ifndef XHwIcap_mStartConfig +#define XHwIcap_mStartConfig XHwIcap_StartConfig +#endif + +#ifndef XHwIcap_mStartReadBack +#define XHwIcap_mStartReadBack XHwIcap_StartReadBack +#endif + +#ifndef XHwIcap_mGetStatusReg +#define XHwIcap_mGetStatusReg XHwIcap_GetStatusReg +#endif + +#ifndef XHwIcap_mIsTransferDone +#define XHwIcap_mIsTransferDone XHwIcap_IsTransferDone +#endif + +#ifndef XHwIcap_mIsDeviceBusy +#define XHwIcap_mIsDeviceBusy XHwIcap_IsDeviceBusy +#endif + +#ifndef XHwIcap_mIntrGlobalEnable +#define XHwIcap_mIntrGlobalEnable XHwIcap_IntrGlobalEnable +#endif + +#ifndef XHwIcap_mIntrGlobalDisable +#define XHwIcap_mIntrGlobalDisable XHwIcap_IntrGlobalDisable +#endif + +#ifndef XHwIcap_mIntrGetStatus +#define XHwIcap_mIntrGetStatus XHwIcap_IntrGetStatus +#endif + +#ifndef XHwIcap_mIntrDisable +#define XHwIcap_mIntrDisable XHwIcap_IntrDisable +#endif + +#ifndef XHwIcap_mIntrEnable +#define XHwIcap_mIntrEnable XHwIcap_IntrEnable +#endif + +#ifndef XHwIcap_mIntrGetEnabled +#define XHwIcap_mIntrGetEnabled XHwIcap_IntrGetEnabled +#endif + +#ifndef XHwIcap_mIntrClear +#define XHwIcap_mIntrClear XHwIcap_IntrClear +#endif + +#ifndef XHwIcap_mGetWrFifoVacancy +#define XHwIcap_mGetWrFifoVacancy XHwIcap_GetWrFifoVacancy +#endif + +#ifndef XHwIcap_mGetRdFifoOccupancy +#define XHwIcap_mGetRdFifoOccupancy XHwIcap_GetRdFifoOccupancy +#endif + +#ifndef XHwIcap_mSliceX2Col +#define XHwIcap_mSliceX2Col XHwIcap_SliceX2Col +#endif + +#ifndef XHwIcap_mSliceY2Row +#define XHwIcap_mSliceY2Row XHwIcap_SliceY2Row +#endif + +#ifndef XHwIcap_mSliceXY2Slice +#define XHwIcap_mSliceXY2Slice XHwIcap_SliceXY2Slice +#endif + +#ifndef XHwIcap_mReadReg +#define XHwIcap_mReadReg XHwIcap_ReadReg +#endif + +#ifndef XHwIcap_mWriteReg +#define XHwIcap_mWriteReg XHwIcap_WriteReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XIic + * + *********************************************************************/ +#ifndef XIic_mReadReg +#define XIic_mReadReg XIic_ReadReg +#endif + +#ifndef XIic_mWriteReg +#define XIic_mWriteReg XIic_WriteReg +#endif + +#ifndef XIic_mEnterCriticalRegion +#define XIic_mEnterCriticalRegion XIic_IntrGlobalDisable +#endif + +#ifndef XIic_mExitCriticalRegion +#define XIic_mExitCriticalRegion XIic_IntrGlobalEnable +#endif + +#ifndef XIIC_GINTR_DISABLE +#define XIIC_GINTR_DISABLE XIic_IntrGlobalDisable +#endif + +#ifndef XIIC_GINTR_ENABLE +#define XIIC_GINTR_ENABLE XIic_IntrGlobalEnable +#endif + +#ifndef XIIC_IS_GINTR_ENABLED +#define XIIC_IS_GINTR_ENABLED XIic_IsIntrGlobalEnabled +#endif + +#ifndef XIIC_WRITE_IISR +#define XIIC_WRITE_IISR XIic_WriteIisr +#endif + +#ifndef XIIC_READ_IISR +#define XIIC_READ_IISR XIic_ReadIisr +#endif + +#ifndef XIIC_WRITE_IIER +#define XIIC_WRITE_IIER XIic_WriteIier +#endif + +#ifndef XIic_mClearIisr +#define XIic_mClearIisr XIic_ClearIisr +#endif + +#ifndef XIic_mSend7BitAddress +#define XIic_mSend7BitAddress XIic_Send7BitAddress +#endif + +#ifndef XIic_mDynSend7BitAddress +#define XIic_mDynSend7BitAddress XIic_DynSend7BitAddress +#endif + +#ifndef XIic_mDynSendStartStopAddress +#define XIic_mDynSendStartStopAddress XIic_DynSendStartStopAddress +#endif + +#ifndef XIic_mDynSendStop +#define XIic_mDynSendStop XIic_DynSendStop +#endif + +#ifndef XIic_mSend10BitAddrByte1 +#define XIic_mSend10BitAddrByte1 XIic_Send10BitAddrByte1 +#endif + +#ifndef XIic_mSend10BitAddrByte2 +#define XIic_mSend10BitAddrByte2 XIic_Send10BitAddrByte2 +#endif + +#ifndef XIic_mSend7BitAddr +#define XIic_mSend7BitAddr XIic_Send7BitAddr +#endif + +#ifndef XIic_mDisableIntr +#define XIic_mDisableIntr XIic_DisableIntr +#endif + +#ifndef XIic_mEnableIntr +#define XIic_mEnableIntr XIic_EnableIntr +#endif + +#ifndef XIic_mClearIntr +#define XIic_mClearIntr XIic_ClearIntr +#endif + +#ifndef XIic_mClearEnableIntr +#define XIic_mClearEnableIntr XIic_ClearEnableIntr +#endif + +#ifndef XIic_mFlushRxFifo +#define XIic_mFlushRxFifo XIic_FlushRxFifo +#endif + +#ifndef XIic_mFlushTxFifo +#define XIic_mFlushTxFifo XIic_FlushTxFifo +#endif + +#ifndef XIic_mReadRecvByte +#define XIic_mReadRecvByte XIic_ReadRecvByte +#endif + +#ifndef XIic_mWriteSendByte +#define XIic_mWriteSendByte XIic_WriteSendByte +#endif + +#ifndef XIic_mSetControlRegister +#define XIic_mSetControlRegister XIic_SetControlRegister +#endif + +/*********************************************************************/ +/** + * Macros for Driver XIntc + * + *********************************************************************/ +#ifndef XIntc_mMasterEnable +#define XIntc_mMasterEnable XIntc_MasterEnable +#endif + +#ifndef XIntc_mMasterDisable +#define XIntc_mMasterDisable XIntc_MasterDisable +#endif + +#ifndef XIntc_mEnableIntr +#define XIntc_mEnableIntr XIntc_EnableIntr +#endif + +#ifndef XIntc_mDisableIntr +#define XIntc_mDisableIntr XIntc_DisableIntr +#endif + +#ifndef XIntc_mAckIntr +#define XIntc_mAckIntr XIntc_AckIntr +#endif + +#ifndef XIntc_mGetIntrStatus +#define XIntc_mGetIntrStatus XIntc_GetIntrStatus +#endif + +/*********************************************************************/ +/** + * Macros for Driver XLlDma + * + *********************************************************************/ +#ifndef XLlDma_mBdRead +#define XLlDma_mBdRead XLlDma_BdRead +#endif + +#ifndef XLlDma_mBdWrite +#define XLlDma_mBdWrite XLlDma_BdWrite +#endif + +#ifndef XLlDma_mWriteReg +#define XLlDma_mWriteReg XLlDma_WriteReg +#endif + +#ifndef XLlDma_mReadReg +#define XLlDma_mReadReg XLlDma_ReadReg +#endif + +#ifndef XLlDma_mBdClear +#define XLlDma_mBdClear XLlDma_BdClear +#endif + +#ifndef XLlDma_mBdSetStsCtrl +#define XLlDma_mBdSetStsCtrl XLlDma_BdSetStsCtrl +#endif + +#ifndef XLlDma_mBdGetStsCtrl +#define XLlDma_mBdGetStsCtrl XLlDma_BdGetStsCtrl +#endif + +#ifndef XLlDma_mBdSetLength +#define XLlDma_mBdSetLength XLlDma_BdSetLength +#endif + +#ifndef XLlDma_mBdGetLength +#define XLlDma_mBdGetLength XLlDma_BdGetLength +#endif + +#ifndef XLlDma_mBdSetId +#define XLlDma_mBdSetId XLlDma_BdSetId +#endif + +#ifndef XLlDma_mBdGetId +#define XLlDma_mBdGetId XLlDma_BdGetId +#endif + +#ifndef XLlDma_mBdSetBufAddr +#define XLlDma_mBdSetBufAddr XLlDma_BdSetBufAddr +#endif + +#ifndef XLlDma_mBdGetBufAddr +#define XLlDma_mBdGetBufAddr XLlDma_BdGetBufAddr +#endif + +#ifndef XLlDma_mBdGetLength +#define XLlDma_mBdGetLength XLlDma_BdGetLength +#endif + +#ifndef XLlDma_mGetTxRing +#define XLlDma_mGetTxRing XLlDma_GetTxRing +#endif + +#ifndef XLlDma_mGetRxRing +#define XLlDma_mGetRxRing XLlDma_GetRxRing +#endif + +#ifndef XLlDma_mGetCr +#define XLlDma_mGetCr XLlDma_GetCr +#endif + +#ifndef XLlDma_mSetCr +#define XLlDma_mSetCr XLlDma_SetCr +#endif + +#ifndef XLlDma_mBdRingCntCalc +#define XLlDma_mBdRingCntCalc XLlDma_BdRingCntCalc +#endif + +#ifndef XLlDma_mBdRingMemCalc +#define XLlDma_mBdRingMemCalc XLlDma_BdRingMemCalc +#endif + +#ifndef XLlDma_mBdRingGetCnt +#define XLlDma_mBdRingGetCnt XLlDma_BdRingGetCnt +#endif + +#ifndef XLlDma_mBdRingGetFreeCnt +#define XLlDma_mBdRingGetFreeCnt XLlDma_BdRingGetFreeCnt +#endif + +#ifndef XLlDma_mBdRingSnapShotCurrBd +#define XLlDma_mBdRingSnapShotCurrBd XLlDma_BdRingSnapShotCurrBd +#endif + +#ifndef XLlDma_mBdRingNext +#define XLlDma_mBdRingNext XLlDma_BdRingNext +#endif + +#ifndef XLlDma_mBdRingPrev +#define XLlDma_mBdRingPrev XLlDma_BdRingPrev +#endif + +#ifndef XLlDma_mBdRingGetSr +#define XLlDma_mBdRingGetSr XLlDma_BdRingGetSr +#endif + +#ifndef XLlDma_mBdRingSetSr +#define XLlDma_mBdRingSetSr XLlDma_BdRingSetSr +#endif + +#ifndef XLlDma_mBdRingGetCr +#define XLlDma_mBdRingGetCr XLlDma_BdRingGetCr +#endif + +#ifndef XLlDma_mBdRingSetCr +#define XLlDma_mBdRingSetCr XLlDma_BdRingSetCr +#endif + +#ifndef XLlDma_mBdRingBusy +#define XLlDma_mBdRingBusy XLlDma_BdRingBusy +#endif + +#ifndef XLlDma_mBdRingIntEnable +#define XLlDma_mBdRingIntEnable XLlDma_BdRingIntEnable +#endif + +#ifndef XLlDma_mBdRingIntDisable +#define XLlDma_mBdRingIntDisable XLlDma_BdRingIntDisable +#endif + +#ifndef XLlDma_mBdRingIntGetEnabled +#define XLlDma_mBdRingIntGetEnabled XLlDma_BdRingIntGetEnabled +#endif + +#ifndef XLlDma_mBdRingGetIrq +#define XLlDma_mBdRingGetIrq XLlDma_BdRingGetIrq +#endif + +#ifndef XLlDma_mBdRingAckIrq +#define XLlDma_mBdRingAckIrq XLlDma_BdRingAckIrq +#endif + +/*********************************************************************/ +/** + * Macros for Driver XMbox + * + *********************************************************************/ +#ifndef XMbox_mWriteReg +#define XMbox_mWriteReg XMbox_WriteReg +#endif + +#ifndef XMbox_mReadReg +#define XMbox_mReadReg XMbox_ReadReg +#endif + +#ifndef XMbox_mWriteMBox +#define XMbox_mWriteMBox XMbox_WriteMBox +#endif + +#ifndef XMbox_mReadMBox +#define XMbox_mReadMBox XMbox_ReadMBox +#endif + +#ifndef XMbox_mFSLReadMBox +#define XMbox_mFSLReadMBox XMbox_FSLReadMBox +#endif + +#ifndef XMbox_mFSLWriteMBox +#define XMbox_mFSLWriteMBox XMbox_FSLWriteMBox +#endif + +#ifndef XMbox_mFSLIsEmpty +#define XMbox_mFSLIsEmpty XMbox_FSLIsEmpty +#endif + +#ifndef XMbox_mFSLIsFull +#define XMbox_mFSLIsFull XMbox_FSLIsFull +#endif + +#ifndef XMbox_mIsEmpty +#define XMbox_mIsEmpty XMbox_IsEmptyHw +#endif + +#ifndef XMbox_mIsFull +#define XMbox_mIsFull XMbox_IsFullHw +#endif + +/*********************************************************************/ +/** + * Macros for Driver XMpmc + * + *********************************************************************/ +#ifndef XMpmc_mReadReg +#define XMpmc_mReadReg XMpmc_ReadReg +#endif + +#ifndef XMpmc_mWriteReg +#define XMpmc_mWriteReg XMpmc_WriteReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XMutex + * + *********************************************************************/ +#ifndef XMutex_mWriteReg +#define XMutex_mWriteReg XMutex_WriteReg +#endif + +#ifndef XMutex_mReadReg +#define XMutex_mReadReg XMutex_ReadReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XPcie + * + *********************************************************************/ +#ifndef XPcie_mReadReg +#define XPcie_mReadReg XPcie_ReadReg +#endif + +#ifndef XPcie_mWriteReg +#define XPcie_mWriteReg XPcie_WriteReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XSpi + * + *********************************************************************/ +#ifndef XSpi_mIntrGlobalEnable +#define XSpi_mIntrGlobalEnable XSpi_IntrGlobalEnable +#endif + +#ifndef XSpi_mIntrGlobalDisable +#define XSpi_mIntrGlobalDisable XSpi_IntrGlobalDisable +#endif + +#ifndef XSpi_mIsIntrGlobalEnabled +#define XSpi_mIsIntrGlobalEnabled XSpi_IsIntrGlobalEnabled +#endif + +#ifndef XSpi_mIntrGetStatus +#define XSpi_mIntrGetStatus XSpi_IntrGetStatus +#endif + +#ifndef XSpi_mIntrClear +#define XSpi_mIntrClear XSpi_IntrClear +#endif + +#ifndef XSpi_mIntrEnable +#define XSpi_mIntrEnable XSpi_IntrEnable +#endif + +#ifndef XSpi_mIntrDisable +#define XSpi_mIntrDisable XSpi_IntrDisable +#endif + +#ifndef XSpi_mIntrGetEnabled +#define XSpi_mIntrGetEnabled XSpi_IntrGetEnabled +#endif + +#ifndef XSpi_mSetControlReg +#define XSpi_mSetControlReg XSpi_SetControlReg +#endif + +#ifndef XSpi_mGetControlReg +#define XSpi_mGetControlReg XSpi_GetControlReg +#endif + +#ifndef XSpi_mGetStatusReg +#define XSpi_mGetStatusReg XSpi_GetStatusReg +#endif + +#ifndef XSpi_mSetSlaveSelectReg +#define XSpi_mSetSlaveSelectReg XSpi_SetSlaveSelectReg +#endif + +#ifndef XSpi_mGetSlaveSelectReg +#define XSpi_mGetSlaveSelectReg XSpi_GetSlaveSelectReg +#endif + +#ifndef XSpi_mEnable +#define XSpi_mEnable XSpi_Enable +#endif + +#ifndef XSpi_mDisable +#define XSpi_mDisable XSpi_Disable +#endif + +/*********************************************************************/ +/** + * Macros for Driver XSysAce + * + *********************************************************************/ +#ifndef XSysAce_mGetControlReg +#define XSysAce_mGetControlReg XSysAce_GetControlReg +#endif + +#ifndef XSysAce_mSetControlReg +#define XSysAce_mSetControlReg XSysAce_SetControlReg +#endif + +#ifndef XSysAce_mOrControlReg +#define XSysAce_mOrControlReg XSysAce_OrControlReg +#endif + +#ifndef XSysAce_mAndControlReg +#define XSysAce_mAndControlReg XSysAce_AndControlReg +#endif + +#ifndef XSysAce_mGetErrorReg +#define XSysAce_mGetErrorReg XSysAce_GetErrorReg +#endif + +#ifndef XSysAce_mGetStatusReg +#define XSysAce_mGetStatusReg XSysAce_GetStatusReg +#endif + +#ifndef XSysAce_mWaitForLock +#define XSysAce_mWaitForLock XSysAce_WaitForLock +#endif + +#ifndef XSysAce_mEnableIntr +#define XSysAce_mEnableIntr XSysAce_EnableIntr +#endif + +#ifndef XSysAce_mDisableIntr +#define XSysAce_mDisableIntr XSysAce_DisableIntr +#endif + +#ifndef XSysAce_mIsReadyForCmd +#define XSysAce_mIsReadyForCmd XSysAce_IsReadyForCmd +#endif + +#ifndef XSysAce_mIsMpuLocked +#define XSysAce_mIsMpuLocked XSysAce_IsMpuLocked +#endif + +#ifndef XSysAce_mIsIntrEnabled +#define XSysAce_mIsIntrEnabled XSysAce_IsIntrEnabled +#endif + +/*********************************************************************/ +/** + * Macros for Driver XSysMon + * + *********************************************************************/ +#ifndef XSysMon_mIsEventSamplingModeSet +#define XSysMon_mIsEventSamplingModeSet XSysMon_IsEventSamplingModeSet +#endif + +#ifndef XSysMon_mIsDrpBusy +#define XSysMon_mIsDrpBusy XSysMon_IsDrpBusy +#endif + +#ifndef XSysMon_mIsDrpLocked +#define XSysMon_mIsDrpLocked XSysMon_IsDrpLocked +#endif + +#ifndef XSysMon_mRawToTemperature +#define XSysMon_mRawToTemperature XSysMon_RawToTemperature +#endif + +#ifndef XSysMon_mRawToVoltage +#define XSysMon_mRawToVoltage XSysMon_RawToVoltage +#endif + +#ifndef XSysMon_mTemperatureToRaw +#define XSysMon_mTemperatureToRaw XSysMon_TemperatureToRaw +#endif + +#ifndef XSysMon_mVoltageToRaw +#define XSysMon_mVoltageToRaw XSysMon_VoltageToRaw +#endif + +#ifndef XSysMon_mReadReg +#define XSysMon_mReadReg XSysMon_ReadReg +#endif + +#ifndef XSysMon_mWriteReg +#define XSysMon_mWriteReg XSysMon_WriteReg +#endif + +/*********************************************************************/ +/** + * Macros for Driver XTmrCtr + * + *********************************************************************/ +#ifndef XTimerCtr_mReadReg +#define XTimerCtr_mReadReg XTimerCtr_ReadReg +#endif + +#ifndef XTmrCtr_mWriteReg +#define XTmrCtr_mWriteReg XTmrCtr_WriteReg +#endif + +#ifndef XTmrCtr_mSetControlStatusReg +#define XTmrCtr_mSetControlStatusReg XTmrCtr_SetControlStatusReg +#endif + +#ifndef XTmrCtr_mGetControlStatusReg +#define XTmrCtr_mGetControlStatusReg XTmrCtr_GetControlStatusReg +#endif + +#ifndef XTmrCtr_mGetTimerCounterReg +#define XTmrCtr_mGetTimerCounterReg XTmrCtr_GetTimerCounterReg +#endif + +#ifndef XTmrCtr_mSetLoadReg +#define XTmrCtr_mSetLoadReg XTmrCtr_SetLoadReg +#endif + +#ifndef XTmrCtr_mGetLoadReg +#define XTmrCtr_mGetLoadReg XTmrCtr_GetLoadReg +#endif + +#ifndef XTmrCtr_mEnable +#define XTmrCtr_mEnable XTmrCtr_Enable +#endif + +#ifndef XTmrCtr_mDisable +#define XTmrCtr_mDisable XTmrCtr_Disable +#endif + +#ifndef XTmrCtr_mEnableIntr +#define XTmrCtr_mEnableIntr XTmrCtr_EnableIntr +#endif + +#ifndef XTmrCtr_mDisableIntr +#define XTmrCtr_mDisableIntr XTmrCtr_DisableIntr +#endif + +#ifndef XTmrCtr_mLoadTimerCounterReg +#define XTmrCtr_mLoadTimerCounterReg XTmrCtr_LoadTimerCounterReg +#endif + +#ifndef XTmrCtr_mHasEventOccurred +#define XTmrCtr_mHasEventOccurred XTmrCtr_HasEventOccurred +#endif + +/*********************************************************************/ +/** + * Macros for Driver XUartLite + * + *********************************************************************/ +#ifndef XUartLite_mUpdateStats +#define XUartLite_mUpdateStats XUartLite_UpdateStats +#endif + +#ifndef XUartLite_mWriteReg +#define XUartLite_mWriteReg XUartLite_WriteReg +#endif + +#ifndef XUartLite_mReadReg +#define XUartLite_mReadReg XUartLite_ReadReg +#endif + +#ifndef XUartLite_mClearStats +#define XUartLite_mClearStats XUartLite_ClearStats +#endif + +#ifndef XUartLite_mSetControlReg +#define XUartLite_mSetControlReg XUartLite_SetControlReg +#endif + +#ifndef XUartLite_mGetStatusReg +#define XUartLite_mGetStatusReg XUartLite_GetStatusReg +#endif + +#ifndef XUartLite_mIsReceiveEmpty +#define XUartLite_mIsReceiveEmpty XUartLite_IsReceiveEmpty +#endif + +#ifndef XUartLite_mIsTransmitFull +#define XUartLite_mIsTransmitFull XUartLite_IsTransmitFull +#endif + +#ifndef XUartLite_mIsIntrEnabled +#define XUartLite_mIsIntrEnabled XUartLite_IsIntrEnabled +#endif + +#ifndef XUartLite_mEnableIntr +#define XUartLite_mEnableIntr XUartLite_EnableIntr +#endif + +#ifndef XUartLite_mDisableIntr +#define XUartLite_mDisableIntr XUartLite_DisableIntr +#endif + +/*********************************************************************/ +/** + * Macros for Driver XUartNs550 + * + *********************************************************************/ +#ifndef XUartNs550_mUpdateStats +#define XUartNs550_mUpdateStats XUartNs550_UpdateStats +#endif + +#ifndef XUartNs550_mReadReg +#define XUartNs550_mReadReg XUartNs550_ReadReg +#endif + +#ifndef XUartNs550_mWriteReg +#define XUartNs550_mWriteReg XUartNs550_WriteReg +#endif + +#ifndef XUartNs550_mClearStats +#define XUartNs550_mClearStats XUartNs550_ClearStats +#endif + +#ifndef XUartNs550_mGetLineStatusReg +#define XUartNs550_mGetLineStatusReg XUartNs550_GetLineStatusReg +#endif + +#ifndef XUartNs550_mGetLineControlReg +#define XUartNs550_mGetLineControlReg XUartNs550_GetLineControlReg +#endif + +#ifndef XUartNs550_mSetLineControlReg +#define XUartNs550_mSetLineControlReg XUartNs550_SetLineControlReg +#endif + +#ifndef XUartNs550_mEnableIntr +#define XUartNs550_mEnableIntr XUartNs550_EnableIntr +#endif + +#ifndef XUartNs550_mDisableIntr +#define XUartNs550_mDisableIntr XUartNs550_DisableIntr +#endif + +#ifndef XUartNs550_mIsReceiveData +#define XUartNs550_mIsReceiveData XUartNs550_IsReceiveData +#endif + +#ifndef XUartNs550_mIsTransmitEmpty +#define XUartNs550_mIsTransmitEmpty XUartNs550_IsTransmitEmpty +#endif + +/*********************************************************************/ +/** + * Macros for Driver XUsb + * + *********************************************************************/ +#ifndef XUsb_mReadReg +#define XUsb_mReadReg XUsb_ReadReg +#endif + +#ifndef XUsb_mWriteReg +#define XUsb_mWriteReg XUsb_WriteReg +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.c new file mode 100755 index 000000000..d1054692e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.c @@ -0,0 +1,531 @@ +/****************************************************************************** +* +* (c) Copyright 2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_misc_reset.c +* +* This file contains the implementation of the reset sequence for various +* zynq ps devices like DDR,OCM,Slcr,Ethernet,Usb.. controllers. The reset +* sequence provided to the interfaces is based on the provision in +* slcr reset functional blcok. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00b kpc 03/07/13 First release +* </pre> +* +******************************************************************************/ + + +/***************************** Include Files *********************************/ +#include "xil_misc_psreset_api.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/*****************************************************************************/ +/** +* This function contains the implementation for ddr reset. +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XDdr_ResetHw() +{ + u32 RegVal; + + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert and deassert the ddr softreset bit */ + RegVal = Xil_In32(XDDRC_CTRL_BASEADDR); + RegVal &= ~XDDRPS_CTRL_RESET_MASK; + Xil_Out32(XDDRC_CTRL_BASEADDR,RegVal); + RegVal |= XDDRPS_CTRL_RESET_MASK; + Xil_Out32(XDDRC_CTRL_BASEADDR,RegVal); + +} + +/*****************************************************************************/ +/** +* This function contains the implementation for remapping the ocm memory region +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XOcm_Remap() +{ + u32 RegVal; + + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Map the ocm region to postbootrom state */ + RegVal = Xil_In32(XSLCR_OCM_CFG_ADDR); + RegVal = (RegVal & ~XSLCR_OCM_CFG_HIADDR_MASK) | XSLCR_OCM_CFG_RESETVAL; + Xil_Out32(XSLCR_OCM_CFG_ADDR, RegVal); +} + +/*****************************************************************************/ +/** +* This function contains the implementation for SMC reset sequence +* +* @param BaseAddress of the interface +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSmc_ResetHw(u32 BaseAddress) +{ + u32 RegVal; + + /* Clear the interuupts */ + RegVal = Xil_In32(BaseAddress + XSMC_MEMC_CLR_CONFIG_OFFSET); + RegVal = RegVal | XSMC_MEMC_CLR_CONFIG_MASK; + Xil_Out32(BaseAddress + XSMC_MEMC_CLR_CONFIG_OFFSET, RegVal); + /* Clear the idle counter registers */ + Xil_Out32(BaseAddress + XSMC_REFRESH_PERIOD_0_OFFSET, 0x0); + Xil_Out32(BaseAddress + XSMC_REFRESH_PERIOD_1_OFFSET, 0x0); + /* Update the ecc registers with reset values */ + Xil_Out32(BaseAddress + XSMC_ECC_MEMCFG1_OFFSET, + XSMC_ECC_MEMCFG1_RESET_VAL); + Xil_Out32(BaseAddress + XSMC_ECC_MEMCMD1_OFFSET, + XSMC_ECC_MEMCMD1_RESET_VAL); + Xil_Out32(BaseAddress + XSMC_ECC_MEMCMD2_OFFSET, + XSMC_ECC_MEMCMD2_RESET_VAL); + +} + +/*****************************************************************************/ +/** +* This function contains the implementation for updating the slcr mio registers +* with reset values +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_MioWriteResetValues() +{ + u32 i; + + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Update all the MIO registers with reset values */ + for (i=0; i<=1;i++); + { + Xil_Out32((XSLCR_MIO_PIN_00_ADDR + (i * 4)), + XSLCR_MIO_PIN_00_RESET_VAL); + } + for (; i<=8;i++); + { + Xil_Out32((XSLCR_MIO_PIN_00_ADDR + (i * 4)), + XSLCR_MIO_PIN_02_RESET_VAL); + } + for (; i<=53 ;i++); + { + Xil_Out32((XSLCR_MIO_PIN_00_ADDR + (i * 4)), + XSLCR_MIO_PIN_00_RESET_VAL); + } + + +} + +/*****************************************************************************/ +/** +* This function contains the implementation for updating the slcr pll registers +* with reset values +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_PllWriteResetValues() +{ + + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + + /* update the pll control registers with reset values */ + Xil_Out32(XSLCR_IO_PLL_CTRL_ADDR, XSLCR_IO_PLL_CTRL_RESET_VAL); + Xil_Out32(XSLCR_ARM_PLL_CTRL_ADDR, XSLCR_ARM_PLL_CTRL_RESET_VAL); + Xil_Out32(XSLCR_DDR_PLL_CTRL_ADDR, XSLCR_DDR_PLL_CTRL_RESET_VAL); + /* update the pll config registers with reset values */ + Xil_Out32(XSLCR_IO_PLL_CFG_ADDR, XSLCR_IO_PLL_CFG_RESET_VAL); + Xil_Out32(XSLCR_ARM_PLL_CFG_ADDR, XSLCR_ARM_PLL_CFG_RESET_VAL); + Xil_Out32(XSLCR_DDR_PLL_CFG_ADDR, XSLCR_DDR_PLL_CFG_RESET_VAL); + /* update the clock control registers with reset values */ + Xil_Out32(XSLCR_ARM_CLK_CTRL_ADDR, XSLCR_ARM_CLK_CTRL_RESET_VAL); + Xil_Out32(XSLCR_DDR_CLK_CTRL_ADDR, XSLCR_DDR_CLK_CTRL_RESET_VAL); +} + +/*****************************************************************************/ +/** +* This function contains the implementation for disabling the level shifters +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_DisableLevelShifters() +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Disable the level shifters */ + RegVal = Xil_In32(XSLCR_LVL_SHFTR_EN_ADDR); + RegVal = RegVal & ~XSLCR_LVL_SHFTR_EN_MASK; + Xil_Out32(XSLCR_LVL_SHFTR_EN_ADDR, RegVal); + +} +/*****************************************************************************/ +/** +* This function contains the implementation for OCM software reset from the +* slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_OcmReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_OCM_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_OCM_RST_CTRL_VAL; + Xil_Out32(XSLCR_OCM_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_OCM_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_OCM_RST_CTRL_VAL; + Xil_Out32(XSLCR_OCM_RST_CTRL_ADDR, RegVal); +} + +/*****************************************************************************/ +/** +* This function contains the implementation for Ethernet software reset from +* the slcr +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_EmacPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_GEM_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_GEM_RST_CTRL_VAL; + Xil_Out32(XSLCR_GEM_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_GEM_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_GEM_RST_CTRL_VAL; + Xil_Out32(XSLCR_GEM_RST_CTRL_ADDR, RegVal); +} + +/*****************************************************************************/ +/** +* This function contains the implementation for USB software reset from the +* slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_UsbPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_USB_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_USB_RST_CTRL_VAL; + Xil_Out32(XSLCR_USB_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_USB_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_USB_RST_CTRL_VAL; + Xil_Out32(XSLCR_USB_RST_CTRL_ADDR, RegVal); +} +/*****************************************************************************/ +/** +* This function contains the implementation for QSPI software reset from the +* slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_QspiPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_LQSPI_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_QSPI_RST_CTRL_VAL; + Xil_Out32(XSLCR_LQSPI_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_LQSPI_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_QSPI_RST_CTRL_VAL; + Xil_Out32(XSLCR_LQSPI_RST_CTRL_ADDR, RegVal); +} +/*****************************************************************************/ +/** +* This function contains the implementation for SPI software reset from the +* slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_SpiPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_SPI_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_SPI_RST_CTRL_VAL; + Xil_Out32(XSLCR_SPI_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_SPI_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_SPI_RST_CTRL_VAL; + Xil_Out32(XSLCR_SPI_RST_CTRL_ADDR, RegVal); +} +/*****************************************************************************/ +/** +* This function contains the implementation for i2c software reset from the slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_I2cPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_I2C_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_I2C_RST_CTRL_VAL; + Xil_Out32(XSLCR_I2C_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_I2C_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_I2C_RST_CTRL_VAL; + Xil_Out32(XSLCR_I2C_RST_CTRL_ADDR, RegVal); +} +/*****************************************************************************/ +/** +* This function contains the implementation for UART software reset from the +* slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_UartPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_UART_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_UART_RST_CTRL_VAL; + Xil_Out32(XSLCR_UART_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_UART_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_UART_RST_CTRL_VAL; + Xil_Out32(XSLCR_UART_RST_CTRL_ADDR, RegVal); +} +/*****************************************************************************/ +/** +* This function contains the implementation for CAN software reset from slcr +* registers +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_CanPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_CAN_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_CAN_RST_CTRL_VAL; + Xil_Out32(XSLCR_CAN_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_CAN_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_CAN_RST_CTRL_VAL; + Xil_Out32(XSLCR_CAN_RST_CTRL_ADDR, RegVal); +} +/*****************************************************************************/ +/** +* This function contains the implementation for SMC software reset from the slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_SmcPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_SMC_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_SMC_RST_CTRL_VAL; + Xil_Out32(XSLCR_SMC_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_SMC_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_SMC_RST_CTRL_VAL; + Xil_Out32(XSLCR_SMC_RST_CTRL_ADDR, RegVal); +} +/*****************************************************************************/ +/** +* This function contains the implementation for DMA controller software reset +* from the slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_DmaPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_DMAC_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_DMAC_RST_CTRL_VAL; + Xil_Out32(XSLCR_DMAC_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_DMAC_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_DMAC_RST_CTRL_VAL; + Xil_Out32(XSLCR_DMAC_RST_CTRL_ADDR, RegVal); +} +/*****************************************************************************/ +/** +* This function contains the implementation for Gpio AMBA software reset from +* the slcr +* +* @param N/A. +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XSlcr_GpioPsReset(void) +{ + u32 RegVal; + /* Unlock the slcr register access lock */ + Xil_Out32(XSLCR_UNLOCK_ADDR, XSLCR_UNLOCK_CODE); + /* Assert the reset */ + RegVal = Xil_In32(XSLCR_GPIO_RST_CTRL_ADDR); + RegVal = RegVal | XSLCR_GPIO_RST_CTRL_VAL; + Xil_Out32(XSLCR_GPIO_RST_CTRL_ADDR, RegVal); + /* Release the reset */ + RegVal = Xil_In32(XSLCR_GPIO_RST_CTRL_ADDR); + RegVal = RegVal & ~XSLCR_GPIO_RST_CTRL_VAL; + Xil_Out32(XSLCR_GPIO_RST_CTRL_ADDR, RegVal); +} \ No newline at end of file diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.h new file mode 100755 index 000000000..d74906877 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.h @@ -0,0 +1,286 @@ +/****************************************************************************** +* +* (c) Copyright 2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil_misc_psreset_api.h +* +* This file contains the various register defintions and function prototypes for +* implementing the reset functionality of zynq ps devices +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00b kpc 03/07/13 First release. +* </pre> +* +******************************************************************************/ + +#ifndef XIL_MISC_RESET_H /* prevent circular inclusions */ +#define XIL_MISC_RESET_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/***************************** Include Files *********************************/ +#include "xil_types.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ +#define XDDRC_CTRL_BASEADDR 0xF8006000 +#define XSLCR_BASEADDR 0xF8000000 +/**< OCM configuration register */ +#define XSLCR_OCM_CFG_ADDR (XSLCR_BASEADDR + 0x910) +/**< SLCR unlock register */ +#define XSLCR_UNLOCK_ADDR (XSLCR_BASEADDR + 0x8) +/**< SLCR GEM0 rx clock control register */ +#define XSLCR_GEM0_RCLK_CTRL_ADDR (XSLCR_BASEADDR + 0x138) +/**< SLCR GEM1 rx clock control register */ +#define XSLCR_GEM1_RCLK_CTRL_ADDR (XSLCR_BASEADDR + 0x13C) +/**< SLCR GEM0 clock control register */ +#define XSLCR_GEM0_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x140) +/**< SLCR GEM1 clock control register */ +#define XSLCR_GEM1_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x144) +/**< SLCR SMC clock control register */ +#define XSLCR_SMC_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x148) +/**< SLCR GEM reset control register */ +#define XSLCR_GEM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x214) +/**< SLCR USB0 clock control register */ +#define XSLCR_USB0_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x130) +/**< SLCR USB1 clock control register */ +#define XSLCR_USB1_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x134) +/**< SLCR USB1 reset control register */ +#define XSLCR_USB_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x210) +/**< SLCR SMC reset control register */ +#define XSLCR_SMC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x234) +/**< SLCR Level shifter enable register */ +#define XSLCR_LVL_SHFTR_EN_ADDR (XSLCR_BASEADDR + 0x900) +/**< SLCR ARM pll control register */ +#define XSLCR_ARM_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x100) +/**< SLCR DDR pll control register */ +#define XSLCR_DDR_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x104) +/**< SLCR IO pll control register */ +#define XSLCR_IO_PLL_CTRL_ADDR (XSLCR_BASEADDR + 0x108) +/**< SLCR ARM pll configuration register */ +#define XSLCR_ARM_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x110) +/**< SLCR DDR pll configuration register */ +#define XSLCR_DDR_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x114) +/**< SLCR IO pll configuration register */ +#define XSLCR_IO_PLL_CFG_ADDR (XSLCR_BASEADDR + 0x118) +/**< SLCR ARM clock control register */ +#define XSLCR_ARM_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x120) +/**< SLCR DDR clock control register */ +#define XSLCR_DDR_CLK_CTRL_ADDR (XSLCR_BASEADDR + 0x124) +/**< SLCR MIO pin address register */ +#define XSLCR_MIO_PIN_00_ADDR (XSLCR_BASEADDR + 0x700) +/**< SLCR DMAC reset control address register */ +#define XSLCR_DMAC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x20C) +/**< SLCR USB reset control address register */ +#define XSLCR_USB_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x210) +/**< SLCR GEM reset control address register */ +#define XSLCR_GEM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x214) +/**< SLCR SDIO reset control address register */ +#define XSLCR_SDIO_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x218) +/**< SLCR SPI reset control address register */ +#define XSLCR_SPI_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x21C) +/**< SLCR CAN reset control address register */ +#define XSLCR_CAN_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x220) +/**< SLCR I2C reset control address register */ +#define XSLCR_I2C_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x224) +/**< SLCR UART reset control address register */ +#define XSLCR_UART_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x228) +/**< SLCR GPIO reset control address register */ +#define XSLCR_GPIO_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x22C) +/**< SLCR LQSPI reset control address register */ +#define XSLCR_LQSPI_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x230) +/**< SLCR SMC reset control address register */ +#define XSLCR_SMC_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x234) +/**< SLCR OCM reset control address register */ +#define XSLCR_OCM_RST_CTRL_ADDR (XSLCR_BASEADDR + 0x238) + +/**< SMC mem controller clear config register */ +#define XSMC_MEMC_CLR_CONFIG_OFFSET 0x0C +/**< SMC idlecount configuration register */ +#define XSMC_REFRESH_PERIOD_0_OFFSET 0x20 +#define XSMC_REFRESH_PERIOD_1_OFFSET 0x24 +/**< SMC ECC configuration register */ +#define XSMC_ECC_MEMCFG1_OFFSET 0x404 +/**< SMC ECC command 1 register */ +#define XSMC_ECC_MEMCMD1_OFFSET 0x404 +/**< SMC ECC command 2 register */ +#define XSMC_ECC_MEMCMD2_OFFSET 0x404 + +/**< SLCR unlock code */ +#define XSLCR_UNLOCK_CODE 0x0000DF0D + +/**< SMC mem clear configuration mask */ +#define XSMC_MEMC_CLR_CONFIG_MASK 0x5F +/**< SMC ECC memconfig 1 reset value */ +#define XSMC_ECC_MEMCFG1_RESET_VAL 0x43 +/**< SMC ECC memcommand 1 reset value */ +#define XSMC_ECC_MEMCMD1_RESET_VAL 0x01300080 +/**< SMC ECC memcommand 2 reset value */ +#define XSMC_ECC_MEMCMD2_RESET_VAL 0x01E00585 + +/**< DDR controller reset bit mask */ +#define XDDRPS_CTRL_RESET_MASK 0x1 +/**< SLCR OCM configuration reset value*/ +#define XSLCR_OCM_CFG_RESETVAL 0x8 +/**< SLCR OCM bank selection mask*/ +#define XSLCR_OCM_CFG_HIADDR_MASK 0xF +/**< SLCR level shifter enable mask*/ +#define XSLCR_LVL_SHFTR_EN_MASK 0xF + +/**< SLCR PLL register reset values */ +#define XSLCR_ARM_PLL_CTRL_RESET_VAL 0x0001A008 +#define XSLCR_DDR_PLL_CTRL_RESET_VAL 0x0001A008 +#define XSLCR_IO_PLL_CTRL_RESET_VAL 0x0001A008 +#define XSLCR_ARM_PLL_CFG_RESET_VAL 0x00177EA0 +#define XSLCR_DDR_PLL_CFG_RESET_VAL 0x00177EA0 +#define XSLCR_IO_PLL_CFG_RESET_VAL 0x00177EA0 +#define XSLCR_ARM_CLK_CTRL_RESET_VAL 0x1F000400 +#define XSLCR_DDR_CLK_CTRL_RESET_VAL 0x18400003 + +/**< SLCR MIO register default values */ +#define XSLCR_MIO_PIN_00_RESET_VAL 0x00001601 +#define XSLCR_MIO_PIN_02_RESET_VAL 0x00000601 + +/**< SLCR Reset control registers default values */ +#define XSLCR_DMAC_RST_CTRL_VAL 0x1 +#define XSLCR_GEM_RST_CTRL_VAL 0xF3 +#define XSLCR_USB_RST_CTRL_VAL 0x3 +#define XSLCR_I2C_RST_CTRL_VAL 0x3 +#define XSLCR_SPI_RST_CTRL_VAL 0xF +#define XSLCR_UART_RST_CTRL_VAL 0xF +#define XSLCR_QSPI_RST_CTRL_VAL 0x3 +#define XSLCR_GPIO_RST_CTRL_VAL 0x1 +#define XSLCR_SMC_RST_CTRL_VAL 0x3 +#define XSLCR_OCM_RST_CTRL_VAL 0x1 +#define XSLCR_SDIO_RST_CTRL_VAL 0x33 +#define XSLCR_CAN_RST_CTRL_VAL 0x3 +/**************************** Type Definitions *******************************/ + +/* the following data type is used to hold a null terminated version string + * consisting of the following format, "X.YYX" + */ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ +/* + * Performs reset operation to the ddr interface + */ +void XDdr_ResetHw(); +/* + * Map the ocm region to post bootrom state + */ +void XOcm_Remap(); +/* + * Performs the smc interface reset + */ +void XSmc_ResetHw(u32 BaseAddress); +/* + * updates the MIO registers with reset values + */ +void XSlcr_MioWriteResetValues(); +/* + * updates the PLL and clock registers with reset values + */ +void XSlcr_PllWriteResetValues(); +/* + * Disables the level shifters + */ +void XSlcr_DisableLevelShifters(); +/* + * provides softreset to the GPIO interface + */ +void XSlcr_GpioPsReset(void); +/* + * provides softreset to the DMA interface + */ +void XSlcr_DmaPsReset(void); +/* + * provides softreset to the SMC interface + */ +void XSlcr_SmcPsReset(void); +/* + * provides softreset to the CAN interface + */ +void XSlcr_CanPsReset(void); +/* + * provides softreset to the Uart interface + */ +void XSlcr_UartPsReset(void); +/* + * provides softreset to the I2C interface + */ +void XSlcr_I2cPsReset(void); +/* + * provides softreset to the SPI interface + */ +void XSlcr_SpiPsReset(void); +/* + * provides softreset to the QSPI interface + */ +void XSlcr_QspiPsReset(void); +/* + * provides softreset to the USB interface + */ +void XSlcr_UsbPsReset(void); +/* + * provides softreset to the GEM interface + */ +void XSlcr_EmacPsReset(void); +/* + * provides softreset to the OCM interface + */ +void XSlcr_OcmReset(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* XIL_MISC_RESET_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_misc_psreset_api.o new file mode 100644 index 0000000000000000000000000000000000000000..ee2bffd02eb2d2a7ccd1710b106c4d92e4b02299 GIT binary patch literal 11796 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%0DTmnHtO@M{vEfcu~0@wp@Nc_TIowh*EF zpztoi6cM^RCB9eqS0&Cr^-<@$f`2FYZ-O5Xq5F~WUkhqHXVk@?aZG%Y@aaV8@p}xh zPH?keLhvynbo+(x6MUKo-Df3!RQR_g{(Zq83I0OxW5EJE_|%<9#Q0MMXA+@1N8<B^ zFOqnJV3S~4aIfGW5utlT__qX)5uy8{#7_$U8;Sp`;QNAnC$X+cf_D+2TOoX*;9??l zYbCx$_y&o$3+@m+Ab3>pFNx6of$+Z;e2oa*HzfY1@V6!YKZ0YB!#ZyhoG-YX2;J4f z*9mSS!XiY(e@}Q95juT>hXkJ&JSq5NBKrMI_|FCLAApVSdlJ7Y{MQm6hc6S<|AOEW z!8L+WB6Q=zI|LshLgP`1?-9OF;)8<61y2jUDR`L(-2m1MA}+7uA1=8MXFdEo8*u`$ zz}YvEmkY0yc)joj;jO~kg>(PT{=LEv2|q0S1>whqpB8>b_<7+MgkKfTeHH65f4_tN q1bI)F62bYsobhVmb;36b=YEUvZsFW_k?$40U$|K(pvV0e<Npr|oX~jy literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.c new file mode 100755 index 000000000..bd1b27df8 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.c @@ -0,0 +1,189 @@ +/****************************************************************************** +* +* (c) Copyright 2012 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil_mmu.c +* +* This file provides APIs for enabling/disabling MMU and setting the memory +* attributes for sections, in the MMU translation table. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 01/12/12 Initial version +* 3.05a asa 03/10/12 Modified the Xil_EnableMMU to invalidate the caches +* before enabling back. +* 3.05a asa 04/15/12 Modified the Xil_SetTlbAttributes routine so that +* translation table and branch predictor arrays are +* invalidated, D-cache flushed before the attribute +* change is applied. This is done so that the user +* need not call Xil_DisableMMU before calling +* Xil_SetTlbAttributes. +* 3.10a srt 04/18/13 Implemented ARM Erratas. Please refer to file +* 'xil_errata.h' for errata description +* 3.11a asa 09/23/13 Modified Xil_SetTlbAttributes to flush the complete +* D cache after the translation table update. Removed the +* redundant TLB invalidation in the same API at the beginning. +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_cache.h" +#include "xpseudo_asm.h" +#include "xil_types.h" +#include "xil_mmu.h" +#include "xil_errata.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/************************** Variable Definitions *****************************/ + +extern u32 MMUTable; + +/************************** Function Prototypes ******************************/ + +/***************************************************************************** +* +* Set the memory attributes for a section, in the translation table. Each +* section covers 1MB of memory. +* +* @param addr is the address for which attributes are to be set. +* @param attrib specifies the attributes for that memory region. +* +* @return None. +* +* @note The MMU and D-cache need not be disabled before changing an +* translation table attribute. +* +******************************************************************************/ +void Xil_SetTlbAttributes(u32 addr, u32 attrib) +{ + u32 *ptr; + u32 section; + + section = addr / 0x100000; + ptr = &MMUTable + section; + *ptr = (addr & 0xFFF00000) | attrib; + + Xil_DCacheFlush(); + + mtcp(XREG_CP15_INVAL_UTLB_UNLOCKED, 0); + /* Invalidate all branch predictors */ + mtcp(XREG_CP15_INVAL_BRANCH_ARRAY, 0); + + dsb(); /* ensure completion of the BP and TLB invalidation */ + isb(); /* synchronize context on this processor */ +} + +/***************************************************************************** +* +* Invalidate the caches, enable MMU and D Caches for Cortex A9 processor. +* +* @param None. +* @return None. +* +******************************************************************************/ +void Xil_EnableMMU(void) +{ + u32 Reg; + Xil_DCacheInvalidate(); + Xil_ICacheInvalidate(); + +#ifdef __GNUC__ + Reg = mfcp(XREG_CP15_SYS_CONTROL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_SYS_CONTROL, Reg); +#else + { volatile register unsigned int Cp15Reg __asm(XREG_CP15_SYS_CONTROL); + Reg = Cp15Reg; } +#endif + Reg |= 0x05; + mtcp(XREG_CP15_SYS_CONTROL, Reg); + + dsb(); + isb(); +} + +/***************************************************************************** +* +* Disable MMU for Cortex A9 processors. This function invalidates the TLBs, +* Branch Predictor Array and flushed the D Caches before disabling +* the MMU and D cache. +* +* @param None. +* +* @return None. +* +******************************************************************************/ +void Xil_DisableMMU(void) +{ + u32 Reg; + + mtcp(XREG_CP15_INVAL_UTLB_UNLOCKED, 0); + mtcp(XREG_CP15_INVAL_BRANCH_ARRAY, 0); + Xil_DCacheFlush(); + +#ifdef __GNUC__ + Reg = mfcp(XREG_CP15_SYS_CONTROL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_SYS_CONTROL, Reg); +#else + { volatile register unsigned int Cp15Reg __asm(XREG_CP15_SYS_CONTROL); + Reg = Cp15Reg; } +#endif + Reg &= ~0x05; +#ifdef CONFIG_ARM_ERRATA_794073 + /* Disable Branch Prediction */ + Reg &= ~0x800; +#endif + mtcp(XREG_CP15_SYS_CONTROL, Reg); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.h new file mode 100755 index 000000000..edbb7e523 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.h @@ -0,0 +1,87 @@ +/****************************************************************************** +* +* (c) Copyright 2012 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xil_mmu.h +* +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 01/12/12 Initial version +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef XIL_MMU_H +#define XIL_MMU_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/***************************** Include Files *********************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void Xil_SetTlbAttributes(u32 addr, u32 attrib); +void Xil_EnableMMU(void); +void Xil_DisableMMU(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XIL_MMU_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_mmu.o new file mode 100644 index 0000000000000000000000000000000000000000..f7ecc2247c5b3f50d369209810be5ab9f2203213 GIT binary patch literal 3892 zcma)9U2I!d9si$u?f5o!(j;x^)&*uz3PD}3?WR@NwKPeSZRwVD>&K=sb+WGQ+t|pl zGyA$MsAXYAOx47M_z*9k=3&x6ybK9mkkB6b!sA{L4<Job9sn^_3<O96QGUO3&#`Y> zB=}3`{QlqPe?IOx_N$LCKcSQoOG>6?Ac_1gqb=#98m48ROo%sk_>cMFtq-Iq+ftm{ zmIGh=K*n$U{@-`+{z-~k+xus|JHMXI+<E5Dul}u#=57A+4~(ImZESY@PP%wwdu&$S z=aY=LzRt<p+v(zM?ay3qp+HC1lTu4SRf6K@S|PG&&{5voU>zrO5>~f2b41+Br>RM0 zE)l%U6@v0Mn9fPp390ln!Arv=DK&*&HK7rS7Xad~Af&Hr!wmX7#SUCllj1zu(0bGn z)uLksEi*xDo7Qild6VdFLM6LW)TPt`+Fw^3;RUpJ(bPfchA)JxqHfYjUChn_7SWh3 zQ)S4Tbb22u@lK)p4kT|5%n!kEn)?AMbppM5TQTz{+FvMMgU680{$plm%4`$NIvVE^ z=YNO!521-iqpmqO3QoPKYf>ZXHAv2q0{3llI7%bx93q?*oGCS~4vy~0x}y(`j;jeZ zHU#~YWV5HC!j^nOT<@{$$?VxZDAQN7Id_!e=W=wO8~Xm4oPs5tmRNswkAnn5NBdC} zGZ1xDZ1rxwres`|5VvbLMq=vWM8q)WnMGL>im7vh;Mv@%oXChTgDR-dl;X_fx)8ZX z;5}_H9R(%N5@=4zU)8g>j7`H{^h(YXti$;o4h+p;@fQysnYv~3c+8_UI*I9MO>0-} z_z*;lO<?MwIHsSRx<}DiK9PqYSw7Fx5}J~W=rz&hG8#jOn=#LEHSvf<Xc_5B_TzsX z=#OO$iCjGC=0nx7>^A#ceB2z-AEo-|=!oDV;%P%u@=BvwUR&$=Rr*t?2Gx4#*R2?B ztcTrL#ER%q+z&+^DSo}UTr9Y`r;3Hru>!c=PnDi7l-yx|*-2r9X1leT*IlC($;!%e zmx4+&lwPabSZ#&1Jhd-ixQk(QsactiqE4gIi^8r}E;hRKMwC2x?z#Lz{-}T4pAnsI zM~1;DJJdm~)`=4>a5hggd)<0MKHIt)G#j-bO4L)W2OTLi+tr|1=v9MGR9I<LJMD$} z3zy2J<A+O+7GCZJwZd06D(&)>ZlzhSbk_^(-Q(qIyAy@41SiVHLbFlncB+ML6trpq zN(;+ZXUe5gIVeCa-LM)p+AUqj<1IVC{t^u~qFYDG{Ei86rOxWPBx>(q77{yiH3Pkd zq9-CxE-XBjpT5}cb*f=!BfrqDg=fN6wVq#YL}C6&u{7fsj~$*l@p-ef^FB5_2!l#P z)D+nC@x${nG@P0D)GlWtwO8#^``riBgSbRL<$Oj7Kiaz>CC;_c+=%Suc`?MV;moLa z!+BHn_0%!%y?TBI(+R!!-Ho*<r~so*jCIR(!lsX<j>N~-1>#q_UGb@`g_YiFxzW1P zhDq~5rP2wnS_!+FbPPH{YZWIg5!-CELhFs;#ILs3)<P_*KYwAxk5^Wo&P2?WPOuiD z^#7Y4h9|!}+^3qjCYv#<`;_5%%j`<%Cr1Q70Yq?>>UjF`o;YY^7fAY94E>&Ckq)8J z|9|<h9vcHz=lfAYVOiFatZy0hZNbR;_@LYR=D^z+uyPr<$89o(tnD0R%hU8Q3O$`r zSoWoR{9eL9c?KA=eqV%~tnWj-f@9FJKI(0Kyh&{gSh)^EM8=S{@lj6Z`xo+YJ((|y zX7gPG&ls)`=_44vYLh@F%l5iK>(|DCC_!h*`h5!uECtKdv<1I{6@WJNTM3@#_u$9x z$`b1%ZJ{OSk=i{tS7Wf*d5nX%X9cWG<G1Ng$r!TZ660qlHcVkL)}h=B(dHv^%w)dr z;_~=L9HM)hFQK|mpOTO6Chcy2_OaI8F#^X+>Ae}m>>S0_Cv{+T@z5s8)jK@UxI0#k z`ML80a%DttEcCo%EoVL;H({aH)!s?_ZsEF<_#IAQexKD++%a2n?<vos(RT`s{wqLB zv{$SEr2J(xd*9MO@%B#zGF8(r(|zx8|LNu%w0O^ZI(Wwh*2D|-U!N`QIe6gXZ|M*w z&o|`}-~+(PiTD@QBo5Ol%KJp>Mvvny4z`Q_4z_{oMudyT2Z=bCpEUSsB7Txi8#~vL z{__Tx3_fG<d4s%f=vOoNC4(;$k-ukfgNO^^hOzVC2W9<J9q~Uf@=pxDWBh($<ade4 z_ny)J#>l@l_&yQ&{%+)t4Z7Gu);B_geGd_NCJpMpSg`xX@0ih_F!%)`;?5g<-soR6 z$Ui^Kzh>-RqrYzSZy5ZZ!CMCP{-EQTV?9qB<h|hFt>FGr|A>)`MqV`Xl9B%dibn8M literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.c new file mode 100755 index 000000000..83b0c1469 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.c @@ -0,0 +1,256 @@ +/*---------------------------------------------------*/ +/* Modified from : */ +/* Public Domain version of printf */ +/* Rud Merriam, Compsult, Inc. Houston, Tx. */ +/* For Embedded Systems Programming, 1991 */ +/* */ +/*---------------------------------------------------*/ +#include "xil_printf.h" +#include <ctype.h> +#include <string.h> +#include <stdarg.h> + + +typedef struct params_s { + int len; + int num1; + int num2; + char pad_character; + int do_padding; + int left_flag; +} params_t; + + +/*---------------------------------------------------*/ +/* The purpose of this routine is to output data the */ +/* same as the standard printf function without the */ +/* overhead most run-time libraries involve. Usually */ +/* the printf brings in many kilobytes of code and */ +/* that is unacceptable in most embedded systems. */ +/*---------------------------------------------------*/ + + +/*---------------------------------------------------*/ +/* */ +/* This routine puts pad characters into the output */ +/* buffer. */ +/* */ +void padding( const int l_flag, params_t *par) +{ + int i; + + if (par->do_padding && l_flag && (par->len < par->num1)) + for (i=par->len; i<par->num1; i++) + outbyte( par->pad_character); +} + +/*---------------------------------------------------*/ +/* */ +/* This routine moves a string to the output buffer */ +/* as directed by the padding and positioning flags. */ +/* */ +void outs( charptr lp, params_t *par) +{ + /* pad on left if needed */ + par->len = strlen( lp); + padding( !(par->left_flag), par); + + /* Move string to the buffer */ + while (*lp && (par->num2)--) + outbyte( *lp++); + + /* Pad on right if needed */ + /* CR 439175 - elided next stmt. Seemed bogus. */ + /* par->len = strlen( lp); */ + padding( par->left_flag, par); +} + +/*---------------------------------------------------*/ +/* */ +/* This routine moves a number to the output buffer */ +/* as directed by the padding and positioning flags. */ +/* */ + +void outnum( const long n, const long base, params_t *par) +{ + charptr cp; + int negative; + char outbuf[32]; + const char digits[] = "0123456789ABCDEF"; + unsigned long num; + + /* Check if number is negative */ + if (base == 10 && n < 0L) { + negative = 1; + num = -(n); + } + else{ + num = (n); + negative = 0; + } + + /* Build number (backwards) in outbuf */ + cp = outbuf; + do { + *cp++ = digits[(int)(num % base)]; + } while ((num /= base) > 0); + if (negative) + *cp++ = '-'; + *cp-- = 0; + + /* Move the converted number to the buffer and */ + /* add in the padding where needed. */ + par->len = strlen(outbuf); + padding( !(par->left_flag), par); + while (cp >= outbuf) + outbyte( *cp--); + padding( par->left_flag, par); +} + +/*---------------------------------------------------*/ +/* */ +/* This routine gets a number from the format */ +/* string. */ +/* */ +int getnum( charptr* linep) +{ + int n; + charptr cp; + + n = 0; + cp = *linep; + while (isdigit(((int)*cp))) + n = n*10 + ((*cp++) - '0'); + *linep = cp; + return(n); +} + +/*---------------------------------------------------*/ +/* */ +/* This routine operates just like a printf/sprintf */ +/* routine. It outputs a set of data under the */ +/* control of a formatting string. Not all of the */ +/* standard C format control are supported. The ones */ +/* provided are primarily those needed for embedded */ +/* systems work. Primarily the floaing point */ +/* routines are omitted. Other formats could be */ +/* added easily by following the examples shown for */ +/* the supported formats. */ +/* */ + +/* void esp_printf( const func_ptr f_ptr, + const charptr ctrl1, ...) */ +void xil_printf( const char *ctrl1, ...) +{ + + int long_flag; + int dot_flag; + + params_t par; + + char ch; + va_list argp; + char *ctrl = (char *)ctrl1; + + va_start( argp, ctrl1); + + for ( ; *ctrl; ctrl++) { + + /* move format string chars to buffer until a */ + /* format control is found. */ + if (*ctrl != '%') { + outbyte(*ctrl); + continue; + } + + /* initialize all the flags for this format. */ + dot_flag = long_flag = par.left_flag = par.do_padding = 0; + par.pad_character = ' '; + par.num2=32767; + + try_next: + ch = *(++ctrl); + + if (isdigit((int)ch)) { + if (dot_flag) + par.num2 = getnum(&ctrl); + else { + if (ch == '0') + par.pad_character = '0'; + + par.num1 = getnum(&ctrl); + par.do_padding = 1; + } + ctrl--; + goto try_next; + } + + switch (tolower((int)ch)) { + case '%': + outbyte( '%'); + continue; + + case '-': + par.left_flag = 1; + break; + + case '.': + dot_flag = 1; + break; + + case 'l': + long_flag = 1; + break; + + case 'd': + if (long_flag || ch == 'D') { + outnum( va_arg(argp, long), 10L, &par); + continue; + } + else { + outnum( va_arg(argp, int), 10L, &par); + continue; + } + case 'x': + outnum((long)va_arg(argp, int), 16L, &par); + continue; + + case 's': + outs( va_arg( argp, char *), &par); + continue; + + case 'c': + outbyte( va_arg( argp, int)); + continue; + + case '\\': + switch (*ctrl) { + case 'a': + outbyte( 0x07); + break; + case 'h': + outbyte( 0x08); + break; + case 'r': + outbyte( 0x0D); + break; + case 'n': + outbyte( 0x0D); + outbyte( 0x0A); + break; + default: + outbyte( *ctrl); + break; + } + ctrl++; + break; + + default: + continue; + } + goto try_next; + } + va_end( argp); +} + +/*---------------------------------------------------*/ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.h new file mode 100755 index 000000000..89a051c23 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.h @@ -0,0 +1,47 @@ + #ifndef XIL_PRINTF_H + #define XIL_PRINTF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <ctype.h> +#include <string.h> +#include <stdarg.h> +#include "xparameters.h" +#include "xil_types.h" + +/*----------------------------------------------------*/ +/* Use the following parameter passing structure to */ +/* make xil_printf re-entrant. */ +/*----------------------------------------------------*/ + +struct params_s; + + +/*---------------------------------------------------*/ +/* The purpose of this routine is to output data the */ +/* same as the standard printf function without the */ +/* overhead most run-time libraries involve. Usually */ +/* the printf brings in many kilobytes of code and */ +/* that is unacceptable in most embedded systems. */ +/*---------------------------------------------------*/ + +typedef char* charptr; +typedef int (*func_ptr)(int c); + +/* */ +void padding( const int l_flag, struct params_s *par); +void outs( charptr lp, struct params_s *par); +void outnum( const long n, const long base, struct params_s *par); +int getnum( charptr* linep); +void xil_printf( const char *ctrl1, ...); +void print( const char *ptr); +void outbyte (char); +char inbyte(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_printf.o new file mode 100644 index 0000000000000000000000000000000000000000..0129b221aa20b4f0a5cf448f27fa37b34e60e883 GIT binary patch literal 10800 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 Y=koyVnuQMvZ}uhZ<HGL|{XXIU7h_k^6#xJL literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.c new file mode 100755 index 000000000..5eb3e1c30 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.c @@ -0,0 +1,224 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testcache.c +* +* Contains utility functions to test cache. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 07/28/09 Initial release +* +* </pre> +* +* @note +* +* This file contain functions that all operate on HAL. +* +******************************************************************************/ +#include "xil_cache.h" +#include "xil_testcache.h" + +extern void xil_printf(const char *ctrl1, ...); + +#define DATA_LENGTH 128 + +static u32 Data[DATA_LENGTH]; + +/** +* Perform DCache range related API test such as Xil_DCacheFlushRange and +* Xil_DCacheInvalidateRange. This test function writes a constant value +* to the Data array, flushes the range, writes a new value, then invalidates +* the corresponding range. +* +* @return +* +* - 0 is returned for a pass +* - -1 is returned for a failure +*/ +int Xil_TestDCacheRange(void) +{ + int Index; + int Status; + + u32 Value; + + xil_printf("-- Cache Range Test --\n\r"); + + + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = 0xA0A00505; + + xil_printf(" initialize Data done:\r\n"); + + Xil_DCacheFlushRange((u32)Data, DATA_LENGTH * sizeof(u32)); + + xil_printf(" flush range done\r\n"); + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = Index + 3; + + Xil_DCacheInvalidateRange((u32)Data, DATA_LENGTH * sizeof(u32)); + + xil_printf(" invalidate dcache range done\r\n"); + + Status = 0; + + for (Index = 0; Index < DATA_LENGTH; Index++) { + Value = Data[Index]; + if (Value != 0xA0A00505) { + Status = -1; + xil_printf("Data[%d] = %x\r\n", Index, Value); + break; + } + } + + if (!Status) { + xil_printf(" Invalidate worked\r\n"); + } + else { + xil_printf("Error: Invalidate dcache range not working\r\n"); + } + + xil_printf("-- Cache Range Test Complete --\r\n"); + + return Status; + +} + +/** +* Perform DCache all related API test such as Xil_DCacheFlush and +* Xil_DCacheInvalidate. This test function writes a constant value +* to the Data array, flushes the DCache, writes a new value, then invalidates +* the DCache. +* +* @return +* - 0 is returned for a pass +* - -1 is returned for a failure +*/ +int Xil_TestDCacheAll(void) +{ + int Index; + int Status; + u32 Value; + + xil_printf("-- Cache All Test --\n\r"); + + + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = 0x50500A0A; + + xil_printf(" initialize Data done:\r\n"); + + Xil_DCacheFlush(); + + xil_printf(" flush all done\r\n"); + + for (Index = 0; Index < DATA_LENGTH; Index++) + Data[Index] = Index + 3; + + Xil_DCacheInvalidate(); + + xil_printf(" invalidate all done\r\n"); + + Status = 0; + + for (Index = 0; Index < DATA_LENGTH; Index++) { + Value = Data[Index]; + if (Value != 0x50500A0A) { + Status = -1; + xil_printf("Data[%d] = %x\r\n", Index, Value); + break; + } + } + + if (!Status) { + xil_printf(" Invalidate all worked\r\n"); + } + else { + xil_printf("Error: Invalidate dcache all not working\r\n"); + } + + xil_printf("-- DCache all Test Complete --\n\r"); + + return Status; + +} + + +/** +* Perform Xil_ICacheInvalidateRange() on a few function pointers. +* +* @return +* +* - 0 is returned for a pass +* The function will hang if it fails. +*/ +int Xil_TestICacheRange(void) +{ + + Xil_ICacheInvalidateRange((u32)Xil_TestICacheRange, 1024); + Xil_ICacheInvalidateRange((u32)Xil_TestDCacheRange, 1024); + Xil_ICacheInvalidateRange((u32)Xil_TestDCacheAll, 1024); + + xil_printf("-- Invalidate icache range done --\r\n"); + + return 0; +} + +/** +* Perform Xil_ICacheInvalidate(). +* +* @return +* +* - 0 is returned for a pass +* The function will hang if it fails. +*/ +int Xil_TestICacheAll(void) +{ + Xil_ICacheInvalidate(); + xil_printf("-- Invalidate icache all done --\r\n"); + return 0; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.h new file mode 100755 index 000000000..db6d29652 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.h @@ -0,0 +1,71 @@ +/****************************************************************************** +* +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testcache.h +* +* This file contains utility functions to test cache. +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a hbm 07/29/09 First release +* +******************************************************************************/ + +#ifndef XIL_TESTCACHE_H /* prevent circular inclusions */ +#define XIL_TESTCACHE_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern int Xil_TestDCacheRange(void); +extern int Xil_TestDCacheAll(void); +extern int Xil_TestICacheRange(void); +extern int Xil_TestICacheAll(void); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testcache.o new file mode 100644 index 0000000000000000000000000000000000000000..0c0f49f116daed43e8e2903e60946381170c0802 GIT binary patch literal 7620 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 V#?hh2yTZtNpFqFa$oCrke*j90w5$LC literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.c new file mode 100755 index 000000000..5aa779058 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.c @@ -0,0 +1,304 @@ +/****************************************************************************** +* +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmemend.c +* +* Contains the memory test utility functions. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a hbm 08/25/09 First release +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ +#include "xil_testio.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions ****************************/ +/************************** Function Prototypes *****************************/ + + + +/** + * + * Endian swap a 16-bit word. + * @param Data is the 16-bit word to be swapped. + * @return The endian swapped valud. + * + */ +static u16 Swap16(u16 Data) +{ + return ((Data >> 8) & 0x00FF) | ((Data << 8) & 0xFF00); +} + +/** + * + * Endian swap a 32-bit word. + * @param Data is the 32-bit word to be swapped. + * @return The endian swapped valud. + * + */ +static u32 Swap32(u32 Data) +{ + u16 Lo16; + u16 Hi16; + + u16 Swap16Lo; + u16 Swap16Hi; + + Hi16 = (u16)((Data >> 16) & 0x0000FFFF); + Lo16 = (u16)(Data & 0x0000FFFF); + + Swap16Lo = Swap16(Lo16); + Swap16Hi = Swap16(Hi16); + + return (((u32)(Swap16Lo)) << 16) | ((u32)Swap16Hi); +} + +/*****************************************************************************/ +/** +* +* Perform a destructive 8-bit wide register IO test where the register is +* accessed using Xil_Out8 and Xil_In8, and comparing the reading and writing +* values. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Len is the length of the block. +* @param Value is the constant used for writting the memory. +* +* @return +* +* - -1 is returned for a failure +* - 0 is returned for a pass +* +*****************************************************************************/ + +int Xil_TestIO8(u8 *Addr, int Len, u8 Value) +{ + u8 ValueIn; + int Index; + + for (Index = 0; Index < Len; Index++) { + Xil_Out8((u32)Addr, Value); + + ValueIn = Xil_In8((u32)Addr); + + if (Value != ValueIn) { + return -1; + } + } + + return 0; + +} + +/*****************************************************************************/ +/** +* +* Perform a destructive 16-bit wide register IO test. Each location is tested +* by sequentially writing a 16-bit wide register, reading the register, and +* comparing value. This function tests three kinds of register IO functions, +* normal register IO, little-endian register IO, and big-endian register IO. +* When testing little/big-endian IO, the function performs the following +* sequence, Xil_Out16LE/Xil_Out16BE, Xil_In16, Compare In-Out values, +* Xil_Out16, Xil_In16LE/Xil_In16BE, Compare In-Out values. Whether to swap the +* read-in value before comparing is controlled by the 5th argument. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Len is the length of the block. +* @param Value is the constant used for writting the memory. +* @param Kind is the test kind. Acceptable values are: +* XIL_TESTIO_DEFAULT, XIL_TESTIO_LE, XIL_TESTIO_BE. +* @param Swap indicates whether to byte swap the read-in value. +* +* @return +* +* - -1 is returned for a failure +* - 0 is returned for a pass +* +*****************************************************************************/ + +int Xil_TestIO16(u16 *Addr, int Len, u16 Value, int Kind, int Swap) +{ + u16 ValueIn; + int Index; + + for (Index = 0; Index < Len; Index++) { + switch (Kind) { + case XIL_TESTIO_LE: + Xil_Out16LE((u32)Addr, Value); + break; + case XIL_TESTIO_BE: + Xil_Out16BE((u32)Addr, Value); + break; + default: + Xil_Out16((u32)Addr, Value); + break; + } + + ValueIn = Xil_In16((u32)Addr); + + if (Kind && Swap) + ValueIn = Swap16(ValueIn); + + if (Value != ValueIn) { + return -1; + } + + /* second round */ + Xil_Out16((u32)Addr, Value); + + switch (Kind) { + case XIL_TESTIO_LE: + ValueIn = Xil_In16LE((u32)Addr); + break; + case XIL_TESTIO_BE: + ValueIn = Xil_In16BE((u32)Addr); + break; + default: + ValueIn = Xil_In16((u32)Addr); + break; + } + + + if (Kind && Swap) + ValueIn = Swap16(ValueIn); + + if (Value != ValueIn) { + return -1; + } + Addr++; + } + + return 0; + +} + + +/*****************************************************************************/ +/** +* +* Perform a destructive 32-bit wide register IO test. Each location is tested +* by sequentially writing a 32-bit wide regsiter, reading the register, and +* comparing value. This function tests three kinds of register IO functions, +* normal register IO, little-endian register IO, and big-endian register IO. +* When testing little/big-endian IO, the function perform the following +* sequence, Xil_Out32LE/Xil_Out32BE, Xil_In32, Compare, +* Xil_Out32, Xil_In32LE/Xil_In32BE, Compare. Whether to swap the read-in value +* before comparing is controlled by the 5th argument. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Len is the length of the block. +* @param Value is the constant used for writting the memory. +* @param Kind is the test kind. Acceptable values are: +* XIL_TESTIO_DEFAULT, XIL_TESTIO_LE, XIL_TESTIO_BE. +* @param Swap indicates whether to byte swap the read-in value. +* +* @return +* +* - -1 is returned for a failure +* - 0 is returned for a pass +* +*****************************************************************************/ +int Xil_TestIO32(u32 *Addr, int Len, u32 Value, int Kind, int Swap) +{ + u32 ValueIn; + int Index; + + for (Index = 0; Index < Len; Index++) { + switch (Kind) { + case XIL_TESTIO_LE: + Xil_Out32LE((u32)Addr, Value); + break; + case XIL_TESTIO_BE: + Xil_Out32BE((u32)Addr, Value); + break; + default: + Xil_Out32((u32)Addr, Value); + break; + } + + ValueIn = Xil_In32((u32)Addr); + + if (Kind && Swap) + ValueIn = Swap32(ValueIn); + + if (Value != ValueIn) { + return -1; + } + + /* second round */ + Xil_Out32((u32)Addr, Value); + + + switch (Kind) { + case XIL_TESTIO_LE: + ValueIn = Xil_In32LE((u32)Addr); + break; + case XIL_TESTIO_BE: + ValueIn = Xil_In32BE((u32)Addr); + break; + default: + ValueIn = Xil_In32((u32)Addr); + break; + } + + if (Kind && Swap) + ValueIn = Swap32(ValueIn); + + if (Value != ValueIn) { + return -1; + } + Addr++; + } + return 0; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.h new file mode 100755 index 000000000..33a8286f1 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.h @@ -0,0 +1,101 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmemend.h +* +* This file contains utility functions to teach endian related memory +* IO functions. +* +* <b>Memory test description</b> +* +* A subset of the memory tests can be selected or all of the tests can be run +* in order. If there is an error detected by a subtest, the test stops and the +* failure code is returned. Further tests are not run even if all of the tests +* are selected. +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00 hbm 08/05/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XIL_TESTIO_H /* prevent circular inclusions */ +#define XIL_TESTIO_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + + +#define XIL_TESTIO_DEFAULT 0 +#define XIL_TESTIO_LE 1 +#define XIL_TESTIO_BE 2 + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +extern int Xil_TestIO8(u8 *Addr, int Len, u8 Value); +extern int Xil_TestIO16(u16 *Addr, int Len, u16 Value, int Kind, int Swap); +extern int Xil_TestIO32(u32 *Addr, int Len, u32 Value, int Kind, int Swap); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testio.o new file mode 100644 index 0000000000000000000000000000000000000000..154eb31ef4a15f20839905192dc8d1103ddbf751 GIT binary patch literal 7492 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 WB;p~3t;5K<?~tz+zFGKX!v7z}a1o9G literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.c new file mode 100755 index 000000000..27a1a1270 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.c @@ -0,0 +1,1004 @@ +/****************************************************************************** +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmem.c +* +* Contains the memory test utility functions. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a hbm 08/25/09 First release +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ +#include "xil_testmem.h" +#include "xil_io.h" +#include "xil_assert.h" + +/************************** Constant Definitions ****************************/ +/************************** Function Prototypes *****************************/ + +static u32 RotateLeft(u32 Input, u8 Width); + +/* define ROTATE_RIGHT to give access to this functionality */ +/* #define ROTATE_RIGHT */ +#ifdef ROTATE_RIGHT +static u32 RotateRight(u32 Input, u8 Width); +#endif /* ROTATE_RIGHT */ + + +/*****************************************************************************/ +/** +* +* Perform a destructive 32-bit wide memory test. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Words is the length of the block. +* @param Pattern is the constant used for the constant pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest is the test selected. See xil_testmem.h for possible +* values. +* +* @return +* +* - 0 is returned for a pass +* - -1 is returned for a failure +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** Width, +* the patterns used in XIL_TESTMEM_WALKONES and XIL_TESTMEM_WALKZEROS will +* repeat on a boundry of a power of two making it more difficult to detect +* addressing errors. The XIL_TESTMEM_INCREMENT and XIL_TESTMEM_INVERSEADDR +* tests suffer the same problem. Ideally, if large blocks of memory are to be +* tested, break them up into smaller regions of memory to allow the test +* patterns used not to repeat over the region tested. +* +*****************************************************************************/ +int Xil_TestMem32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest) +{ + u32 I; + u32 J; + u32 Val; + u32 FirtVal; + u32 Word; + + Xil_AssertNonvoid(Words != 0); + Xil_AssertNonvoid(Subtest <= XIL_TESTMEM_MAXTEST); + + /* + * variable initialization + */ + Val = XIL_TESTMEM_INIT_VALUE; + FirtVal = XIL_TESTMEM_INIT_VALUE; + + /* + * Select the proper Subtest + */ + switch (Subtest) { + + case XIL_TESTMEM_ALLMEMTESTS: + + /* this case executes all of the Subtests */ + + /* fall through case statement */ + + case XIL_TESTMEM_INCREMENT: + + /* + * Fill the memory with incrementing + * values starting from 'FirtVal' + */ + for (I = 0L; I < Words; I++) { + Addr[I] = Val; + Val++; + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = FirtVal; + + /* + * Check every word within the words + * of tested memory and compare it + * with the incrementing reference + * Val + */ + + for (I = 0L; I < Words; I++) { + Word = Addr[I]; + + if (Word != Val) { + return -1; + } + + Val++; + } + + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + + + /* end of case 1 */ + + /* fall through case statement */ + + case XIL_TESTMEM_WALKONES: + /* + * set up to cycle through all possible initial + * test Patterns for walking ones test + */ + + for (J = 0L; J < 32; J++) { + /* + * Generate an initial value for walking ones test + * to test for bad data bits + */ + + Val = 1 << J; + + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + + for (I = 0L; I < 32; I++) { + /* write memory location */ + Addr[I] = Val; + Val = (u32) RotateLeft(Val, 32); + } + + /* + * Restore the reference 'val' to the + * initial value + */ + Val = 1 << J; + + /* Read the values from each location that was + * written */ + for (I = 0L; I < 32; I++) { + /* read memory location */ + + Word = Addr[I]; + + if (Word != Val) { + return -1; + } + + Val = (u32)RotateLeft(Val, 32); + } + + } + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + + /* end of case 2 */ + /* fall through case statement */ + + case XIL_TESTMEM_WALKZEROS: + /* + * set up to cycle through all possible + * initial test Patterns for walking zeros test + */ + + for (J = 0L; J < 32; J++) { + + /* + * Generate an initial value for walking ones test + * to test for bad data bits + */ + + Val = ~(1 << J); + + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + + for (I = 0L; I < 32; I++) { + /* write memory location */ + Addr[I] = Val; + Val = ~((u32)RotateLeft(~Val, 32)); + } + + /* + * Restore the reference 'Val' to the + * initial value + */ + + Val = ~(1 << J); + + /* Read the values from each location that was + * written */ + for (I = 0L; I < 32; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + Val = ~((u32)RotateLeft(~Val, 32)); + } + + } + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + + /* end of case 3 */ + + /* fall through case statement */ + + case XIL_TESTMEM_INVERSEADDR: + /* Fill the memory with inverse of address */ + for (I = 0L; I < Words; I++) { + /* write memory location */ + Val = (u32) (~((u32) (&Addr[I]))); + Addr[I] = Val; + } + + /* + * Check every word within the words + * of tested memory + */ + + for (I = 0L; I < Words; I++) { + /* Read the location */ + Word = Addr[I]; + Val = (u32) (~((u32) (&Addr[I]))); + + if ((Word ^ Val) != 0x00000000) { + return -1; + } + } + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 4 */ + + /* fall through case statement */ + + case XIL_TESTMEM_FIXEDPATTERN: + /* + * Generate an initial value for + * memory testing + */ + + if (Pattern == 0) { + Val = 0xDEADBEEF; + } + else { + Val = Pattern; + } + + /* + * Fill the memory with fixed Pattern + */ + + for (I = 0L; I < Words; I++) { + /* write memory location */ + Addr[I] = Val; + } + + /* + * Check every word within the words + * of tested memory and compare it + * with the fixed Pattern + */ + + for (I = 0L; I < Words; I++) { + + /* read memory location */ + + Word = Addr[I]; + if (Word != Val) { + return -1; + } + } + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 5 */ + + /* this break is for the prior fall through case statements */ + + break; + + default: + return -1; + + } /* end of switch */ + + /* Successfully passed memory test ! */ + + return 0; +} + +/*****************************************************************************/ +/** +* +* Perform a destructive 16-bit wide memory test. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Words is the length of the block. +* @param Pattern is the constant used for the constant Pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest is the test selected. See xil_testmem.h for possible +* values. +* +* @return +* +* - -1 is returned for a failure +* - 0 is returned for a pass +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** Width, +* the patterns used in XIL_TESTMEM_WALKONES and XIL_TESTMEM_WALKZEROS will +* repeat on a boundry of a power of two making it more difficult to detect +* addressing errors. The XIL_TESTMEM_INCREMENT and XIL_TESTMEM_INVERSEADDR +* tests suffer the same problem. Ideally, if large blocks of memory are to be +* tested, break them up into smaller regions of memory to allow the test +* patterns used not to repeat over the region tested. +* +*****************************************************************************/ +int Xil_TestMem16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest) +{ + u32 I; + u32 J; + u16 Val; + u16 FirtVal; + u16 Word; + + Xil_AssertNonvoid(Words != 0); + Xil_AssertNonvoid(Subtest <= XIL_TESTMEM_MAXTEST); + + /* + * variable initialization + */ + Val = XIL_TESTMEM_INIT_VALUE; + FirtVal = XIL_TESTMEM_INIT_VALUE; + + /* + * selectthe proper Subtest(s) + */ + + switch (Subtest) { + + case XIL_TESTMEM_ALLMEMTESTS: + + /* this case executes all of the Subtests */ + + /* fall through case statement */ + + case XIL_TESTMEM_INCREMENT: + /* + * Fill the memory with incrementing + * values starting from 'FirtVal' + */ + for (I = 0L; I < Words; I++) { + /* write memory location */ + Addr[I] = Val; + Val++; + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = FirtVal; + + /* + * Check every word within the words + * of tested memory and compare it + * with the incrementing reference val + */ + + for (I = 0L; I < Words; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + Val++; + } + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + + /* end of case 1 */ + /* fall through case statement */ + + case XIL_TESTMEM_WALKONES: + /* + * set up to cycle through all possible initial test + * Patterns for walking ones test + */ + + for (J = 0L; J < 16; J++) { + /* + * Generate an initial value for walking ones test + * to test for bad data bits + */ + + Val = 1 << J; + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + + for (I = 0L; I < 16; I++) { + /* write memory location */ + Addr[I] = Val; + Val = (u16)RotateLeft(Val, 16); + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = 1 << J; + /* Read the values from each location that was written */ + for (I = 0L; I < 16; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + Val = (u16)RotateLeft(Val, 16); + } + + } + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 2 */ + /* fall through case statement */ + + case XIL_TESTMEM_WALKZEROS: + /* + * set up to cycle through all possible initial + * test Patterns for walking zeros test + */ + + for (J = 0L; J < 16; J++) { + /* + * Generate an initial value for walking ones + * test to test for bad + * data bits + */ + + Val = ~(1 << J); + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + + for (I = 0L; I < 16; I++) { + /* write memory location */ + Addr[I] = Val; + Val = ~((u16)RotateLeft(~Val, 16)); + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = ~(1 << J); + /* Read the values from each location that was written */ + for (I = 0L; I < 16; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + Val = ~((u16)RotateLeft(~Val, 16)); + } + + } + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 3 */ + /* fall through case statement */ + + case XIL_TESTMEM_INVERSEADDR: + /* Fill the memory with inverse of address */ + for (I = 0L; I < Words; I++) { + /* write memory location */ + Val = (u16) (~((u32) (&Addr[I]))); + Addr[I] = Val; + } + /* + * Check every word within the words + * of tested memory + */ + + for (I = 0L; I < Words; I++) { + /* read memory location */ + Word = Addr[I]; + Val = (u16) (~((u32) (&Addr[I]))); + if ((Word ^ Val) != 0x0000) { + return -1; + } + } + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 4 */ + /* fall through case statement */ + + case XIL_TESTMEM_FIXEDPATTERN: + /* + * Generate an initial value for + * memory testing + */ + if (Pattern == 0) { + Val = 0xDEAD; + } + else { + Val = Pattern; + } + + /* + * Fill the memory with fixed pattern + */ + + for (I = 0L; I < Words; I++) { + /* write memory location */ + Addr[I] = Val; + } + + /* + * Check every word within the words + * of tested memory and compare it + * with the fixed pattern + */ + + for (I = 0L; I < Words; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + } + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 5 */ + /* this break is for the prior fall through case statements */ + + break; + + default: + return -1; + + } /* end of switch */ + + /* Successfully passed memory test ! */ + + return 0; +} + + +/*****************************************************************************/ +/** +* +* Perform a destructive 8-bit wide memory test. +* +* @param Addr is a pointer to the region of memory to be tested. +* @param Words is the length of the block. +* @param Pattern is the constant used for the constant pattern test, if 0, +* 0xDEADBEEF is used. +* @param Subtest is the test selected. See xil_testmem.h for possible +* values. +* +* @return +* +* - -1 is returned for a failure +* - 0 is returned for a pass +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** Width, +* the patterns used in XIL_TESTMEM_WALKONES and XIL_TESTMEM_WALKZEROS will +* repeat on a boundry of a power of two making it more difficult to detect +* addressing errors. The XIL_TESTMEM_INCREMENT and XIL_TESTMEM_INVERSEADDR +* tests suffer the same problem. Ideally, if large blocks of memory are to be +* tested, break them up into smaller regions of memory to allow the test +* patterns used not to repeat over the region tested. +* +*****************************************************************************/ +int Xil_TestMem8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest) +{ + u32 I; + u32 J; + u8 Val; + u8 FirtVal; + u8 Word; + + Xil_AssertNonvoid(Words != 0); + Xil_AssertNonvoid(Subtest <= XIL_TESTMEM_MAXTEST); + + /* + * variable initialization + */ + Val = XIL_TESTMEM_INIT_VALUE; + FirtVal = XIL_TESTMEM_INIT_VALUE; + + /* + * select the proper Subtest(s) + */ + + switch (Subtest) { + + case XIL_TESTMEM_ALLMEMTESTS: + /* this case executes all of the Subtests */ + /* fall through case statement */ + + case XIL_TESTMEM_INCREMENT: + /* + * Fill the memory with incrementing + * values starting from 'FirtVal' + */ + for (I = 0L; I < Words; I++) { + /* write memory location */ + Addr[I] = Val; + Val++; + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = FirtVal; + /* + * Check every word within the words + * of tested memory and compare it + * with the incrementing reference + * Val + */ + + for (I = 0L; I < Words; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + Val++; + } + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 1 */ + + /* fall through case statement */ + + case XIL_TESTMEM_WALKONES: + /* + * set up to cycle through all possible initial + * test Patterns for walking ones test + */ + + for (J = 0L; J < 8; J++) { + /* + * Generate an initial value for walking ones test + * to test for bad data bits + */ + Val = 1 << J; + /* + * START walking ones test + * Write a one to each data bit indifferent locations + */ + for (I = 0L; I < 8; I++) { + /* write memory location */ + Addr[I] = Val; + Val = (u8)RotateLeft(Val, 8); + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = 1 << J; + /* Read the values from each location that was written */ + for (I = 0L; I < 8; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + Val = (u8)RotateLeft(Val, 8); + } + } + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 2 */ + /* fall through case statement */ + + case XIL_TESTMEM_WALKZEROS: + /* + * set up to cycle through all possible initial test + * Patterns for walking zeros test + */ + + for (J = 0L; J < 8; J++) { + /* + * Generate an initial value for walking ones test to test + * for bad data bits + */ + Val = ~(1 << J); + /* + * START walking zeros test + * Write a one to each data bit indifferent locations + */ + for (I = 0L; I < 8; I++) { + /* write memory location */ + Addr[I] = Val; + Val = ~((u8)RotateLeft(~Val, 8)); + } + /* + * Restore the reference 'Val' to the + * initial value + */ + Val = ~(1 << J); + /* Read the values from each location that was written */ + for (I = 0L; I < 8; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + + Val = ~((u8)RotateLeft(~Val, 8)); + } + } + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 3 */ + /* fall through case statement */ + + case XIL_TESTMEM_INVERSEADDR: + /* Fill the memory with inverse of address */ + for (I = 0L; I < Words; I++) { + /* write memory location */ + Val = (u8) (~((u32) (&Addr[I]))); + Addr[I] = Val; + } + + /* + * Check every word within the words + * of tested memory + */ + + for (I = 0L; I < Words; I++) { + /* read memory location */ + Word = Addr[I]; + Val = (u8) (~((u32) (&Addr[I]))); + if ((Word ^ Val) != 0x00) { + return -1; + } + } + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + /* end of case 4 */ + /* fall through case statement */ + + case XIL_TESTMEM_FIXEDPATTERN: + /* + * Generate an initial value for + * memory testing + */ + + if (Pattern == 0) { + Val = 0xA5; + } + else { + Val = Pattern; + } + /* + * Fill the memory with fixed Pattern + */ + for (I = 0L; I < Words; I++) { + /* write memory location */ + Addr[I] = Val; + } + /* + * Check every word within the words + * of tested memory and compare it + * with the fixed Pattern + */ + + for (I = 0L; I < Words; I++) { + /* read memory location */ + Word = Addr[I]; + if (Word != Val) { + return -1; + } + } + + if (Subtest != XIL_TESTMEM_ALLMEMTESTS) { + return 0; + } + + /* end of case 5 */ + + /* this break is for the prior fall through case statements */ + + break; + + default: + return -1; + + } /* end of switch */ + + /* Successfully passed memory test ! */ + + return 0; +} + + +/*****************************************************************************/ +/** +* +* Rotates the provided value to the left one bit position +* +* @param Input is value to be rotated to the left +* @param Width is the number of bits in the input data +* +* @return +* +* The resulting unsigned long value of the rotate left +* +* @note +* +* None. +* +*****************************************************************************/ +static u32 RotateLeft(u32 Input, u8 Width) +{ + u32 Msb; + u32 ReturnVal; + u32 WidthMask; + u32 MsbMask; + + /* + * set up the WidthMask and the MsbMask + */ + + MsbMask = 1 << (Width - 1); + + WidthMask = (MsbMask << 1) - 1; + + /* + * set the Width of the Input to the correct width + */ + + Input = Input & WidthMask; + + Msb = Input & MsbMask; + + ReturnVal = Input << 1; + + if (Msb != 0x00000000) { + ReturnVal = ReturnVal | 0x00000001; + } + + ReturnVal = ReturnVal & WidthMask; + + return ReturnVal; + +} + +#ifdef ROTATE_RIGHT +/*****************************************************************************/ +/** +* +* Rotates the provided value to the right one bit position +* +* @param Input is value to be rotated to the right +* @param Width is the number of bits in the input data +* +* @return +* +* The resulting u32 value of the rotate right +* +* @note +* +* None. +* +*****************************************************************************/ +static u32 RotateRight(u32 Input, u8 Width) +{ + u32 Lsb; + u32 ReturnVal; + u32 WidthMask; + u32 MsbMask; + + /* + * set up the WidthMask and the MsbMask + */ + + MsbMask = 1 << (Width - 1); + + WidthMask = (MsbMask << 1) - 1; + + /* + * set the width of the input to the correct width + */ + + Input = Input & WidthMask; + + ReturnVal = Input >> 1; + + Lsb = Input & 0x00000001; + + if (Lsb != 0x00000000) { + ReturnVal = ReturnVal | MsbMask; + } + + ReturnVal = ReturnVal & WidthMask; + + return ReturnVal; + +} +#endif /* ROTATE_RIGHT */ + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.h new file mode 100755 index 000000000..74e131d5b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.h @@ -0,0 +1,173 @@ +/****************************************************************************** +* +* +* (c) Copyright 2009 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_testmem.h +* +* This file contains utility functions to test memory. +* +* <b>Memory test description</b> +* +* A subset of the memory tests can be selected or all of the tests can be run +* in order. If there is an error detected by a subtest, the test stops and the +* failure code is returned. Further tests are not run even if all of the tests +* are selected. +* +* Subtest descriptions: +* <pre> +* XIL_TESTMEM_ALLMEMTESTS: +* Runs all of the following tests +* +* XIL_TESTMEM_INCREMENT: +* Incrementing Value Test. +* This test starts at 'XIL_TESTMEM_INIT_VALUE' and uses the +* incrementing value as the test value for memory. +* +* XIL_TESTMEM_WALKONES: +* Walking Ones Test. +* This test uses a walking '1' as the test value for memory. +* location 1 = 0x00000001 +* location 2 = 0x00000002 +* ... +* +* XIL_TESTMEM_WALKZEROS: +* Walking Zero's Test. +* This test uses the inverse value of the walking ones test +* as the test value for memory. +* location 1 = 0xFFFFFFFE +* location 2 = 0xFFFFFFFD +* ... +* +* XIL_TESTMEM_INVERSEADDR: +* Inverse Address Test. +* This test uses the inverse of the address of the location under test +* as the test value for memory. +* +* XIL_TESTMEM_FIXEDPATTERN: +* Fixed Pattern Test. +* This test uses the provided patters as the test value for memory. +* If zero is provided as the pattern the test uses '0xDEADBEEF". +* </pre> +* +* <i>WARNING</i> +* +* The tests are <b>DESTRUCTIVE</b>. Run before any initialized memory spaces +* have been set up. +* +* The address provided to the memory tests is not checked for +* validity except for the NULL case. It is possible to provide a code-space +* pointer for this test to start with and ultimately destroy executable code +* causing random failures. +* +* @note +* +* Used for spaces where the address range of the region is smaller than +* the data width. If the memory range is greater than 2 ** width, +* the patterns used in XIL_TESTMEM_WALKONES and XIL_TESTMEM_WALKZEROS will +* repeat on a boundry of a power of two making it more difficult to detect +* addressing errors. The XIL_TESTMEM_INCREMENT and XIL_TESTMEM_INVERSEADDR +* tests suffer the same problem. Ideally, if large blocks of memory are to be +* tested, break them up into smaller regions of memory to allow the test +* patterns used not to repeat over the region tested. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a hbm 08/25/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XIL_TESTMEM_H /* prevent circular inclusions */ +#define XIL_TESTMEM_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + +/* xutil_memtest defines */ + +#define XIL_TESTMEM_INIT_VALUE 1 + +/** @name Memory subtests + * @{ + */ +/** + * See the detailed description of the subtests in the file description. + */ +#define XIL_TESTMEM_ALLMEMTESTS 0 +#define XIL_TESTMEM_INCREMENT 1 +#define XIL_TESTMEM_WALKONES 2 +#define XIL_TESTMEM_WALKZEROS 3 +#define XIL_TESTMEM_INVERSEADDR 4 +#define XIL_TESTMEM_FIXEDPATTERN 5 +#define XIL_TESTMEM_MAXTEST XIL_TESTMEM_FIXEDPATTERN +/* @} */ + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/* xutil_testmem prototypes */ + +extern int Xil_TestMem32(u32 *Addr, u32 Words, u32 Pattern, u8 Subtest); +extern int Xil_TestMem16(u16 *Addr, u32 Words, u16 Pattern, u8 Subtest); +extern int Xil_TestMem8(u8 *Addr, u32 Words, u8 Pattern, u8 Subtest); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_testmem.o new file mode 100644 index 0000000000000000000000000000000000000000..c7e3c4767bad70de63d7b4676047a3c6cca4cbdc GIT binary patch literal 16608 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 NpJVts)4$yC{}0yIpaTE^ literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_types.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_types.h new file mode 100755 index 000000000..f86329e8b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xil_types.h @@ -0,0 +1,160 @@ +/****************************************************************************** +* +* (c) Copyright 2009-2011 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xil_types.h +* +* This file contains basic types for Xilinx software IP. + +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ------------------------------------------------------- +* 1.00a hbm 07/14/09 First release +* 3.03a sdm 05/30/11 Added Xuint64 typedef and XUINT64_MSW/XUINT64_LSW macros +* </pre> +* +******************************************************************************/ + +#ifndef XIL_TYPES_H /* prevent circular inclusions */ +#define XIL_TYPES_H /* by using protection macros */ + + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +# define TRUE 1 +#endif + +#ifndef FALSE +# define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#define XIL_COMPONENT_IS_READY 0x11111111 /**< component has been initialized */ +#define XIL_COMPONENT_IS_STARTED 0x22222222 /**< component has been started */ + +/** @name New types + * New simple types. + * @{ + */ +#ifndef __KERNEL__ +#ifndef XBASIC_TYPES_H +/** + * guarded against xbasic_types.h. + */ +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; + +#define __XUINT64__ +typedef struct +{ + u32 Upper; + u32 Lower; +} Xuint64; + +/*****************************************************************************/ +/** +* Return the most significant half of the 64 bit data type. +* +* @param x is the 64 bit word. +* +* @return The upper 32 bits of the 64 bit word. +* +* @note None. +* +******************************************************************************/ +#define XUINT64_MSW(x) ((x).Upper) + +/*****************************************************************************/ +/** +* Return the least significant half of the 64 bit data type. +* +* @param x is the 64 bit word. +* +* @return The lower 32 bits of the 64 bit word. +* +* @note None. +* +******************************************************************************/ +#define XUINT64_LSW(x) ((x).Lower) + +#endif /* XBASIC_TYPES_H */ + +/** + * xbasic_types.h does not typedef s* or u64 + */ +typedef unsigned long long u64; + +typedef char s8; +typedef short s16; +typedef long s32; +typedef long long s64; +#else +#include <linux/types.h> +#endif + + +/*@}*/ + + +/************************** Constant Definitions *****************************/ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc.h new file mode 100755 index 000000000..d7b4cfc94 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc.h @@ -0,0 +1,180 @@ +/****************************************************************************** +* +* (c) Copyright 2011-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xl2cc.h +* +* This file contains the address definitions for the PL310 Level-2 Cache +* Controller. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- --------------------------------------------------- +* 1.00a sdm 02/01/10 Initial version +* 3.10a srt 04/18/13 Implemented ARM Erratas. Please refer to file +* 'xil_errata.h' for errata description +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _XL2CC_H_ +#define _XL2CC_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ +/* L2CC Register Offsets */ +#define XPS_L2CC_ID_OFFSET 0x0000 +#define XPS_L2CC_TYPE_OFFSET 0x0004 +#define XPS_L2CC_CNTRL_OFFSET 0x0100 +#define XPS_L2CC_AUX_CNTRL_OFFSET 0x0104 +#define XPS_L2CC_TAG_RAM_CNTRL_OFFSET 0x0108 +#define XPS_L2CC_DATA_RAM_CNTRL_OFFSET 0x010C + +#define XPS_L2CC_EVNT_CNTRL_OFFSET 0x0200 +#define XPS_L2CC_EVNT_CNT1_CTRL_OFFSET 0x0204 +#define XPS_L2CC_EVNT_CNT0_CTRL_OFFSET 0x0208 +#define XPS_L2CC_EVNT_CNT1_VAL_OFFSET 0x020C +#define XPS_L2CC_EVNT_CNT0_VAL_OFFSET 0x0210 + +#define XPS_L2CC_IER_OFFSET 0x0214 /* Interrupt Mask */ +#define XPS_L2CC_IPR_OFFSET 0x0218 /* Masked interrupt status */ +#define XPS_L2CC_ISR_OFFSET 0x021C /* Raw Interrupt Status */ +#define XPS_L2CC_IAR_OFFSET 0x0220 /* Interrupt Clear */ + +#define XPS_L2CC_CACHE_SYNC_OFFSET 0x0730 /* Cache Sync */ +#define XPS_L2CC_DUMMY_CACHE_SYNC_OFFSET 0x0740 /* Dummy Register for Cache Sync */ +#define XPS_L2CC_CACHE_INVLD_PA_OFFSET 0x0770 /* Cache Invalid by PA */ +#define XPS_L2CC_CACHE_INVLD_WAY_OFFSET 0x077C /* Cache Invalid by Way */ +#define XPS_L2CC_CACHE_CLEAN_PA_OFFSET 0x07B0 /* Cache Clean by PA */ +#define XPS_L2CC_CACHE_CLEAN_INDX_OFFSET 0x07B8 /* Cache Clean by Index */ +#define XPS_L2CC_CACHE_CLEAN_WAY_OFFSET 0x07BC /* Cache Clean by Way */ +#define XPS_L2CC_CACHE_INV_CLN_PA_OFFSET 0x07F0 /* Cache Invalidate and Clean by PA */ +#define XPS_L2CC_CACHE_INV_CLN_INDX_OFFSET 0x07F8 /* Cache Invalidate and Clean by Index */ +#define XPS_L2CC_CACHE_INV_CLN_WAY_OFFSET 0x07FC /* Cache Invalidate and Clean by Way */ + +#define XPS_L2CC_CACHE_DLCKDWN_0_WAY_OFFSET 0x0900 /* Cache Data Lockdown 0 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_0_WAY_OFFSET 0x0904 /* Cache Instruction Lockdown 0 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_1_WAY_OFFSET 0x0908 /* Cache Data Lockdown 1 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_1_WAY_OFFSET 0x090C /* Cache Instruction Lockdown 1 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_2_WAY_OFFSET 0x0910 /* Cache Data Lockdown 2 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_2_WAY_OFFSET 0x0914 /* Cache Instruction Lockdown 2 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_3_WAY_OFFSET 0x0918 /* Cache Data Lockdown 3 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_3_WAY_OFFSET 0x091C /* Cache Instruction Lockdown 3 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_4_WAY_OFFSET 0x0920 /* Cache Data Lockdown 4 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_4_WAY_OFFSET 0x0924 /* Cache Instruction Lockdown 4 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_5_WAY_OFFSET 0x0928 /* Cache Data Lockdown 5 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_5_WAY_OFFSET 0x092C /* Cache Instruction Lockdown 5 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_6_WAY_OFFSET 0x0930 /* Cache Data Lockdown 6 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_6_WAY_OFFSET 0x0934 /* Cache Instruction Lockdown 6 by Way */ +#define XPS_L2CC_CACHE_DLCKDWN_7_WAY_OFFSET 0x0938 /* Cache Data Lockdown 7 by Way */ +#define XPS_L2CC_CACHE_ILCKDWN_7_WAY_OFFSET 0x093C /* Cache Instruction Lockdown 7 by Way */ + +#define XPS_L2CC_CACHE_LCKDWN_LINE_ENABLE_OFFSET 0x0950 /* Cache Lockdown Line Enable */ +#define XPS_L2CC_CACHE_UUNLOCK_ALL_WAY_OFFSET 0x0954 /* Cache Unlock All Lines by Way */ + +#define XPS_L2CC_ADDR_FILTER_START_OFFSET 0x0C00 /* Start of address filtering */ +#define XPS_L2CC_ADDR_FILTER_END_OFFSET 0x0C04 /* Start of address filtering */ + +#define XPS_L2CC_DEBUG_CTRL_OFFSET 0x0F40 /* Debug Control Register */ + +/* XPS_L2CC_CNTRL_OFFSET bit masks */ +#define XPS_L2CC_ENABLE_MASK 0x00000001 /* enables the L2CC */ + +/* XPS_L2CC_AUX_CNTRL_OFFSET bit masks */ +#define XPS_L2CC_AUX_EBRESPE_MASK 0x40000000 /* Early BRESP Enable */ +#define XPS_L2CC_AUX_IPFE_MASK 0x20000000 /* Instruction Prefetch Enable */ +#define XPS_L2CC_AUX_DPFE_MASK 0x10000000 /* Data Prefetch Enable */ +#define XPS_L2CC_AUX_NSIC_MASK 0x08000000 /* Non-secure interrupt access control */ +#define XPS_L2CC_AUX_NSLE_MASK 0x04000000 /* Non-secure lockdown enable */ +#define XPS_L2CC_AUX_CRP_MASK 0x02000000 /* Cache replacement policy */ +#define XPS_L2CC_AUX_FWE_MASK 0x01800000 /* Force write allocate */ +#define XPS_L2CC_AUX_SAOE_MASK 0x00400000 /* Shared attribute override enable */ +#define XPS_L2CC_AUX_PE_MASK 0x00200000 /* Parity enable */ +#define XPS_L2CC_AUX_EMBE_MASK 0x00100000 /* Event monitor bus enable */ +#define XPS_L2CC_AUX_WAY_SIZE_MASK 0x000E0000 /* Way-size */ +#define XPS_L2CC_AUX_ASSOC_MASK 0x00010000 /* Associativity */ +#define XPS_L2CC_AUX_SAIE_MASK 0x00002000 /* Shared attribute invalidate enable */ +#define XPS_L2CC_AUX_EXCL_CACHE_MASK 0x00001000 /* Exclusive cache configuration */ +#define XPS_L2CC_AUX_SBDLE_MASK 0x00000800 /* Store buffer device limitation Enable */ +#define XPS_L2CC_AUX_HPSODRE_MASK 0x00000400 /* High Priority for SO and Dev Reads Enable */ +#define XPS_L2CC_AUX_FLZE_MASK 0x00000001 /* Full line of zero enable */ + +#define XPS_L2CC_AUX_REG_DEFAULT_MASK 0x72360000 /* Enable all prefetching, */ + /* Cache replacement policy, Parity enable, */ + /* Event monitor bus enable and Way Size (64 KB) */ +#define XPS_L2CC_AUX_REG_ZERO_MASK 0xFFF1FFFF /* */ + +#define XPS_L2CC_TAG_RAM_DEFAULT_MASK 0x00000111 /* latency for TAG RAM */ +#define XPS_L2CC_DATA_RAM_DEFAULT_MASK 0x00000121 /* latency for DATA RAM */ + +/* Interrupt bit masks */ +#define XPS_L2CC_IXR_DECERR_MASK 0x00000100 /* DECERR from L3 */ +#define XPS_L2CC_IXR_SLVERR_MASK 0x00000080 /* SLVERR from L3 */ +#define XPS_L2CC_IXR_ERRRD_MASK 0x00000040 /* Error on L2 data RAM (Read) */ +#define XPS_L2CC_IXR_ERRRT_MASK 0x00000020 /* Error on L2 tag RAM (Read) */ +#define XPS_L2CC_IXR_ERRWD_MASK 0x00000010 /* Error on L2 data RAM (Write) */ +#define XPS_L2CC_IXR_ERRWT_MASK 0x00000008 /* Error on L2 tag RAM (Write) */ +#define XPS_L2CC_IXR_PARRD_MASK 0x00000004 /* Parity Error on L2 data RAM (Read) */ +#define XPS_L2CC_IXR_PARRT_MASK 0x00000002 /* Parity Error on L2 tag RAM (Read) */ +#define XPS_L2CC_IXR_ECNTR_MASK 0x00000001 /* Event Counter1/0 Overflow Increment */ + +/* Address filtering mask and enable bit */ +#define XPS_L2CC_ADDR_FILTER_VALID_MASK 0xFFF00000 /* Address filtering valid bits*/ +#define XPS_L2CC_ADDR_FILTER_ENABLE_MASK 0x00000001 /* Address filtering enable bit*/ + +/* Debug control bits */ +#define XPS_L2CC_DEBUG_SPIDEN_MASK 0x00000004 /* Debug SPIDEN bit */ +#define XPS_L2CC_DEBUG_DWB_MASK 0x00000002 /* Debug DWB bit, forces write through */ +#define XPS_L2CC_DEBUG_DCL_MASK 0x00000002 /* Debug DCL bit, disables cache line fill */ + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.c new file mode 100755 index 000000000..b17d21734 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.c @@ -0,0 +1,174 @@ +/****************************************************************************** +* +* (c) Copyright 2011-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xl2cc_counter.c +* +* This file contains APIs for configuring and controlling the event counters +* in PL310 L2 cache controller. For more information about the event counters, +* see xl2cc_counter.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sdm 07/11/11 First release +* 3.07a asa 08/30/12 Updated for CR 675636 to provide the L2 Base Address +* inside the APIs +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include <stdint.h> +#include "xparameters_ps.h" +#include "xl2cc_counter.h" +#include "xl2cc.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void XL2cc_EventCtrReset(void); + +/******************************************************************************/ + +/****************************************************************************/ +/** +* +* This function initializes the event counters in L2 Cache controller with a +* set of event codes specified by the user. +* +* @param Event0 is the event code for counter 0. +* @param Event1 is the event code for counter 1. +* Use the event codes defined by XL2CC_* in xl2cc_counter.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XL2cc_EventCtrInit(int Event0, int Event1) +{ + + /* Write event code into cnt1 cfg reg */ + *((volatile u32*)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNT1_CTRL_OFFSET)) = (Event1 << 2); + + /* Write event code into cnt0 cfg reg */ + *((volatile u32*)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNT0_CTRL_OFFSET)) = (Event0 << 2); + + /* Reset counters */ + XL2cc_EventCtrReset(); +} + +/****************************************************************************/ +/** +* +* This function starts the event counters in L2 Cache controller. +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XL2cc_EventCtrStart(void) +{ + XL2cc_EventCtrReset(); + + /* Enable counter */ + *((volatile u32*)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNTRL_OFFSET)) = 1; +} + +/****************************************************************************/ +/** +* +* This function disables the event counters in L2 Cache controller, saves the +* counter values and resets the counters. +* +* @param EveCtr0 is an output parameter which is used to return the value +* in event counter 0. +* EveCtr1 is an output parameter which is used to return the value +* in event counter 1. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XL2cc_EventCtrStop(u32 *EveCtr0, u32 *EveCtr1) +{ + /* Disable counter */ + *((volatile u32*) (XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNTRL_OFFSET)) = 0; + + /* Save counter values */ + *EveCtr1 = *((volatile u32*)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNT1_VAL_OFFSET)); + *EveCtr0 = *((volatile u32*)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNT0_VAL_OFFSET)); + + XL2cc_EventCtrReset(); +} + +/****************************************************************************/ +/** +* +* This function resets the event counters in L2 Cache controller. +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XL2cc_EventCtrReset(void) +{ + *((volatile u32*)(XPS_L2CC_BASEADDR + XPS_L2CC_EVNT_CNTRL_OFFSET)) = 0x6; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.h new file mode 100755 index 000000000..30952b1dc --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.h @@ -0,0 +1,117 @@ +/****************************************************************************** +* +* (c) Copyright 2011-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xl2cc_counter.h +* +* This header file contains APIs for configuring and controlling the event +* counters in PL310 L2 cache controller. +* PL310 has 2 event counters which can be used to count a variety of events +* like DRHIT, DRREQ, DWHIT, DWREQ, etc. This file defines configurations, +* where value configures the event counters to count a set of events. +* +* XL2cc_EventCtrInit API can be used to select a set of events and +* XL2cc_EventCtrStart configures the event counters and starts the counters. +* XL2cc_EventCtrStop diables the event counters and returns the counter values. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sdm 07/11/11 First release +* 3.07a asa 08/30/12 Updated for CR 675636 to provide the L2 Base Address +* inside the APIs +* </pre> +* +******************************************************************************/ + +#ifndef L2CCCOUNTER_H /* prevent circular inclusions */ +#define L2CCCOUNTER_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include "xpseudo_asm.h" +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/************************** Constant Definitions ****************************/ + +/* + * The following constants define the event codes for the event counters. + */ +#define XL2CC_CO 0x1 +#define XL2CC_DRHIT 0x2 +#define XL2CC_DRREQ 0x3 +#define XL2CC_DWHIT 0x4 +#define XL2CC_DWREQ 0x5 +#define XL2CC_DWTREQ 0x6 +#define XL2CC_IRHIT 0x7 +#define XL2CC_IRREQ 0x8 +#define XL2CC_WA 0x9 +#define XL2CC_IPFALLOC 0xa +#define XL2CC_EPFHIT 0xb +#define XL2CC_EPFALLOC 0xc +#define XL2CC_SRRCVD 0xd +#define XL2CC_SRCONF 0xe +#define XL2CC_EPFRCVD 0xf + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +void XL2cc_EventCtrInit(int Event0, int Event1); +void XL2cc_EventCtrStart(void); +void XL2cc_EventCtrStop(u32 *EveCtr0, u32 *EveCtr1); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* L2CCCOUNTER_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xl2cc_counter.o new file mode 100644 index 0000000000000000000000000000000000000000..656e0f0908cda84a820bf1c23e447fb8eda3ce04 GIT binary patch literal 3364 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 literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xparameters_ps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xparameters_ps.h new file mode 100755 index 000000000..766e1705b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xparameters_ps.h @@ -0,0 +1,334 @@ +/****************************************************************************** +* +* (c) Copyright 2010-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xparameters_ps.h +* +* This file contains the address definitions for the hard peripherals +* attached to the ARM Cortex A9 core. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------- -------- --------------------------------------------------- +* 1.00a ecm/sdm 02/01/10 Initial version +* 3.04a sdm 02/02/12 Removed some of the defines as they are being generated through +* driver tcl +* </pre> +* +* @note +* +* None. +* +******************************************************************************/ + +#ifndef _XPARAMETERS_PS_H_ +#define _XPARAMETERS_PS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/************************** Constant Definitions *****************************/ + +/* + * This block contains constant declarations for the peripherals + * within the hardblock + */ + +/* Canonical definitions for DDR MEMORY */ +#define XPAR_DDR_MEM_BASEADDR 0x00000000 +#define XPAR_DDR_MEM_HIGHADDR 0x3FFFFFFF + +/* Canonical definitions for Interrupts */ +#define XPAR_XUARTPS_0_INTR XPS_UART0_INT_ID +#define XPAR_XUARTPS_1_INTR XPS_UART1_INT_ID +#define XPAR_XUSBPS_0_INTR XPS_USB0_INT_ID +#define XPAR_XUSBPS_1_INTR XPS_USB1_INT_ID +#define XPAR_XIICPS_0_INTR XPS_I2C0_INT_ID +#define XPAR_XIICPS_1_INTR XPS_I2C1_INT_ID +#define XPAR_XSPIPS_0_INTR XPS_SPI0_INT_ID +#define XPAR_XSPIPS_1_INTR XPS_SPI1_INT_ID +#define XPAR_XCANPS_0_INTR XPS_CAN0_INT_ID +#define XPAR_XCANPS_1_INTR XPS_CAN1_INT_ID +#define XPAR_XGPIOPS_0_INTR XPS_GPIO_INT_ID +#define XPAR_XEMACPS_0_INTR XPS_GEM0_INT_ID +#define XPAR_XEMACPS_0_WAKE_INTR XPS_GEM0_WAKE_INT_ID +#define XPAR_XEMACPS_1_INTR XPS_GEM1_INT_ID +#define XPAR_XEMACPS_1_WAKE_INTR XPS_GEM1_WAKE_INT_ID +#define XPAR_XSDIOPS_0_INTR XPS_SDIO0_INT_ID +#define XPAR_XQSPIPS_0_INTR XPS_QSPI_INT_ID +#define XPAR_XSDIOPS_1_INTR XPS_SDIO1_INT_ID +#define XPAR_XWDTPS_0_INTR XPS_WDT_INT_ID +#define XPAR_XDCFG_0_INTR XPS_DVC_INT_ID +#define XPAR_SCUTIMER_INTR XPS_SCU_TMR_INT_ID +#define XPAR_SCUWDT_INTR XPS_SCU_WDT_INT_ID +#define XPAR_XTTCPS_0_INTR XPS_TTC0_0_INT_ID +#define XPAR_XTTCPS_1_INTR XPS_TTC0_1_INT_ID +#define XPAR_XTTCPS_2_INTR XPS_TTC0_2_INT_ID +#define XPAR_XTTCPS_3_INTR XPS_TTC1_0_INT_ID +#define XPAR_XTTCPS_4_INTR XPS_TTC1_1_INT_ID +#define XPAR_XTTCPS_5_INTR XPS_TTC1_2_INT_ID +#define XPAR_XDMAPS_0_FAULT_INTR XPS_DMA0_ABORT_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_0 XPS_DMA0_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_1 XPS_DMA1_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_2 XPS_DMA2_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_3 XPS_DMA3_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_4 XPS_DMA4_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_5 XPS_DMA5_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_6 XPS_DMA6_INT_ID +#define XPAR_XDMAPS_0_DONE_INTR_7 XPS_DMA7_INT_ID + + +#define XPAR_XQSPIPS_0_LINEAR_BASEADDR XPS_QSPI_LINEAR_BASEADDR +#define XPAR_XPARPORTPS_CTRL_BASEADDR XPS_PARPORT_CRTL_BASEADDR + + + +/* Canonical definitions for DMAC */ + + +/* Canonical definitions for WDT */ + +/* Canonical definitions for SLCR */ +#define XPAR_XSLCR_NUM_INSTANCES 1 +#define XPAR_XSLCR_0_DEVICE_ID 0 +#define XPAR_XSLCR_0_BASEADDR XPS_SYS_CTRL_BASEADDR + +/* Canonical definitions for SCU GIC */ +#define XPAR_SCUGIC_NUM_INSTANCES 1 +#define XPAR_SCUGIC_SINGLE_DEVICE_ID 0 +#define XPAR_SCUGIC_CPU_BASEADDR (XPS_SCU_PERIPH_BASE + 0x0100) +#define XPAR_SCUGIC_DIST_BASEADDR (XPS_SCU_PERIPH_BASE + 0x1000) +#define XPAR_SCUGIC_ACK_BEFORE 0 + +/* Canonical definitions for Global Timer */ +#define XPAR_GLOBAL_TMR_NUM_INSTANCES 1 +#define XPAR_GLOBAL_TMR_DEVICE_ID 0 +#define XPAR_GLOBAL_TMR_BASEADDR (XPS_SCU_PERIPH_BASE + 0x200) +#define XPAR_GLOBAL_TMR_INTR XPS_GLOBAL_TMR_INT_ID + + +/* Xilinx Parallel Flash Library (XilFlash) User Settings */ +#define XPAR_AXI_EMC + + +#define XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ + + +/* + * This block contains constant declarations for the peripherals + * within the hardblock. These have been put for bacwards compatibilty + */ + +#define XPS_PERIPHERAL_BASEADDR 0xE0000000 +#define XPS_UART0_BASEADDR 0xE0000000 +#define XPS_UART1_BASEADDR 0xE0001000 +#define XPS_USB0_BASEADDR 0xE0002000 +#define XPS_USB1_BASEADDR 0xE0003000 +#define XPS_I2C0_BASEADDR 0xE0004000 +#define XPS_I2C1_BASEADDR 0xE0005000 +#define XPS_SPI0_BASEADDR 0xE0006000 +#define XPS_SPI1_BASEADDR 0xE0007000 +#define XPS_CAN0_BASEADDR 0xE0008000 +#define XPS_CAN1_BASEADDR 0xE0009000 +#define XPS_GPIO_BASEADDR 0xE000A000 +#define XPS_GEM0_BASEADDR 0xE000B000 +#define XPS_GEM1_BASEADDR 0xE000C000 +#define XPS_QSPI_BASEADDR 0xE000D000 +#define XPS_PARPORT_CRTL_BASEADDR 0xE000E000 +#define XPS_SDIO0_BASEADDR 0xE0100000 +#define XPS_SDIO1_BASEADDR 0xE0101000 +#define XPS_IOU_BUS_CFG_BASEADDR 0xE0200000 +#define XPS_NAND_BASEADDR 0xE1000000 +#define XPS_PARPORT0_BASEADDR 0xE2000000 +#define XPS_PARPORT1_BASEADDR 0xE4000000 +#define XPS_QSPI_LINEAR_BASEADDR 0xFC000000 +#define XPS_SYS_CTRL_BASEADDR 0xF8000000 /* AKA SLCR */ +#define XPS_TTC0_BASEADDR 0xF8001000 +#define XPS_TTC1_BASEADDR 0xF8002000 +#define XPS_DMAC0_SEC_BASEADDR 0xF8003000 +#define XPS_DMAC0_NON_SEC_BASEADDR 0xF8004000 +#define XPS_WDT_BASEADDR 0xF8005000 +#define XPS_DDR_CTRL_BASEADDR 0xF8006000 +#define XPS_DEV_CFG_APB_BASEADDR 0xF8007000 +#define XPS_AFI0_BASEADDR 0xF8008000 +#define XPS_AFI1_BASEADDR 0xF8009000 +#define XPS_AFI2_BASEADDR 0xF800A000 +#define XPS_AFI3_BASEADDR 0xF800B000 +#define XPS_OCM_BASEADDR 0xF800C000 +#define XPS_EFUSE_BASEADDR 0xF800D000 +#define XPS_CORESIGHT_BASEADDR 0xF8800000 +#define XPS_TOP_BUS_CFG_BASEADDR 0xF8900000 +#define XPS_SCU_PERIPH_BASE 0xF8F00000 +#define XPS_L2CC_BASEADDR 0xF8F02000 +#define XPS_SAM_RAM_BASEADDR 0xFFFC0000 +#define XPS_FPGA_AXI_S0_BASEADDR 0x40000000 +#define XPS_FPGA_AXI_S1_BASEADDR 0x80000000 +#define XPS_IOU_S_SWITCH_BASEADDR 0xE0000000 +#define XPS_PERIPH_APB_BASEADDR 0xF8000000 + +/* Shared Peripheral Interrupts (SPI) */ +#define XPS_CORE_PARITY0_INT_ID 32 +#define XPS_CORE_PARITY1_INT_ID 33 +#define XPS_L2CC_INT_ID 34 +#define XPS_OCMINTR_INT_ID 35 +#define XPS_ECC_INT_ID 36 +#define XPS_PMU0_INT_ID 37 +#define XPS_PMU1_INT_ID 38 +#define XPS_SYSMON_INT_ID 39 +#define XPS_DVC_INT_ID 40 +#define XPS_WDT_INT_ID 41 +#define XPS_TTC0_0_INT_ID 42 +#define XPS_TTC0_1_INT_ID 43 +#define XPS_TTC0_2_INT_ID 44 +#define XPS_DMA0_ABORT_INT_ID 45 +#define XPS_DMA0_INT_ID 46 +#define XPS_DMA1_INT_ID 47 +#define XPS_DMA2_INT_ID 48 +#define XPS_DMA3_INT_ID 49 +#define XPS_SMC_INT_ID 50 +#define XPS_QSPI_INT_ID 51 +#define XPS_GPIO_INT_ID 52 +#define XPS_USB0_INT_ID 53 +#define XPS_GEM0_INT_ID 54 +#define XPS_GEM0_WAKE_INT_ID 55 +#define XPS_SDIO0_INT_ID 56 +#define XPS_I2C0_INT_ID 57 +#define XPS_SPI0_INT_ID 58 +#define XPS_UART0_INT_ID 59 +#define XPS_CAN0_INT_ID 60 +#define XPS_FPGA0_INT_ID 61 +#define XPS_FPGA1_INT_ID 62 +#define XPS_FPGA2_INT_ID 63 +#define XPS_FPGA3_INT_ID 64 +#define XPS_FPGA4_INT_ID 65 +#define XPS_FPGA5_INT_ID 66 +#define XPS_FPGA6_INT_ID 67 +#define XPS_FPGA7_INT_ID 68 +#define XPS_TTC1_0_INT_ID 69 +#define XPS_TTC1_1_INT_ID 70 +#define XPS_TTC1_2_INT_ID 71 +#define XPS_DMA4_INT_ID 72 +#define XPS_DMA5_INT_ID 73 +#define XPS_DMA6_INT_ID 74 +#define XPS_DMA7_INT_ID 75 +#define XPS_USB1_INT_ID 76 +#define XPS_GEM1_INT_ID 77 +#define XPS_GEM1_WAKE_INT_ID 78 +#define XPS_SDIO1_INT_ID 79 +#define XPS_I2C1_INT_ID 80 +#define XPS_SPI1_INT_ID 81 +#define XPS_UART1_INT_ID 82 +#define XPS_CAN1_INT_ID 83 +#define XPS_FPGA8_INT_ID 84 +#define XPS_FPGA9_INT_ID 85 +#define XPS_FPGA10_INT_ID 86 +#define XPS_FPGA11_INT_ID 87 +#define XPS_FPGA12_INT_ID 88 +#define XPS_FPGA13_INT_ID 89 +#define XPS_FPGA14_INT_ID 90 +#define XPS_FPGA15_INT_ID 91 + +/* Private Peripheral Interrupts (PPI) */ +#define XPS_GLOBAL_TMR_INT_ID 27 /* SCU Global Timer interrupt */ +#define XPS_FIQ_INT_ID 28 /* FIQ from FPGA fabric */ +#define XPS_SCU_TMR_INT_ID 29 /* SCU Private Timer interrupt */ +#define XPS_SCU_WDT_INT_ID 30 /* SCU Private WDT interrupt */ +#define XPS_IRQ_INT_ID 31 /* IRQ from FPGA fabric */ + + +/* REDEFINES for TEST APP */ +/* Definitions for UART */ +#define XPAR_PS7_UART_0_INTR XPS_UART0_INT_ID +#define XPAR_PS7_UART_1_INTR XPS_UART1_INT_ID +#define XPAR_PS7_USB_0_INTR XPS_USB0_INT_ID +#define XPAR_PS7_USB_1_INTR XPS_USB1_INT_ID +#define XPAR_PS7_I2C_0_INTR XPS_I2C0_INT_ID +#define XPAR_PS7_I2C_1_INTR XPS_I2C1_INT_ID +#define XPAR_PS7_SPI_0_INTR XPS_SPI0_INT_ID +#define XPAR_PS7_SPI_1_INTR XPS_SPI1_INT_ID +#define XPAR_PS7_CAN_0_INTR XPS_CAN0_INT_ID +#define XPAR_PS7_CAN_1_INTR XPS_CAN1_INT_ID +#define XPAR_PS7_GPIO_0_INTR XPS_GPIO_INT_ID +#define XPAR_PS7_ETHERNET_0_INTR XPS_GEM0_INT_ID +#define XPAR_PS7_ETHERNET_0_WAKE_INTR XPS_GEM0_WAKE_INT_ID +#define XPAR_PS7_ETHERNET_1_INTR XPS_GEM1_INT_ID +#define XPAR_PS7_ETHERNET_1_WAKE_INTR XPS_GEM1_WAKE_INT_ID +#define XPAR_PS7_QSPI_0_INTR XPS_QSPI_INT_ID +#define XPAR_PS7_WDT_0_INTR XPS_WDT_INT_ID +#define XPAR_PS7_SCUWDT_0_INTR XPS_SCU_WDT_INT_ID +#define XPAR_PS7_SCUTIMER_0_INTR XPS_SCU_TMR_INT_ID +#define XPAR_PS7_XADC_0_INTR XPS_SYSMON_INT_ID + +#define XPAR_XADCPS_INT_ID XPS_SYSMON_INT_ID + +/* For backwards compatibilty */ +#define XPAR_XUARTPS_0_CLOCK_HZ XPAR_XUARTPS_0_UART_CLK_FREQ_HZ +#define XPAR_XUARTPS_1_CLOCK_HZ XPAR_XUARTPS_1_UART_CLK_FREQ_HZ +#define XPAR_XTTCPS_0_CLOCK_HZ XPAR_XTTCPS_0_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_1_CLOCK_HZ XPAR_XTTCPS_1_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_2_CLOCK_HZ XPAR_XTTCPS_2_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_3_CLOCK_HZ XPAR_XTTCPS_3_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_4_CLOCK_HZ XPAR_XTTCPS_4_TTC_CLK_FREQ_HZ +#define XPAR_XTTCPS_5_CLOCK_HZ XPAR_XTTCPS_5_TTC_CLK_FREQ_HZ +#define XPAR_XIICPS_0_CLOCK_HZ XPAR_XIICPS_0_I2C_CLK_FREQ_HZ +#define XPAR_XIICPS_1_CLOCK_HZ XPAR_XIICPS_1_I2C_CLK_FREQ_HZ + +#define XPAR_XQSPIPS_0_CLOCK_HZ XPAR_XQSPIPS_0_QSPI_CLK_FREQ_HZ + +#ifdef XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ +#define XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ XPAR_CPU_CORTEXA9_0_CPU_CLK_FREQ_HZ +#endif + +#ifdef XPAR_CPU_CORTEXA9_1_CPU_CLK_FREQ_HZ +#define XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ XPAR_CPU_CORTEXA9_1_CPU_CLK_FREQ_HZ +#endif + +#define XPAR_SCUTIMER_DEVICE_ID 0 +#define XPAR_SCUWDT_DEVICE_ID 0 + + +#ifdef __cplusplus +} +#endif + +#endif /* protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.c new file mode 100755 index 000000000..93304b989 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.c @@ -0,0 +1,304 @@ +/****************************************************************************** +* +* (c) Copyright 2011-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpm_counter.c +* +* This file contains APIs for configuring and controlling the Cortex-A9 +* Performance Monitor Events. For more information about the event counters, +* see xpm_counter.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sdm 07/11/11 First release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xpm_counter.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +typedef const u32 PmcrEventCfg[XPM_CTRCOUNT]; + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions *****************************/ + +static PmcrEventCfg PmcrEvents[] = { + { + XPM_EVENT_SOFTINCR, + XPM_EVENT_INSRFETCH_CACHEREFILL, + XPM_EVENT_INSTRFECT_TLBREFILL, + XPM_EVENT_DATA_CACHEREFILL, + XPM_EVENT_DATA_CACHEACCESS, + XPM_EVENT_DATA_TLBREFILL + }, + { + XPM_EVENT_DATA_READS, + XPM_EVENT_DATA_WRITE, + XPM_EVENT_EXCEPTION, + XPM_EVENT_EXCEPRETURN, + XPM_EVENT_CHANGECONTEXT, + XPM_EVENT_SW_CHANGEPC + }, + { + XPM_EVENT_IMMEDBRANCH, + XPM_EVENT_UNALIGNEDACCESS, + XPM_EVENT_BRANCHMISS, + XPM_EVENT_CLOCKCYCLES, + XPM_EVENT_BRANCHPREDICT, + XPM_EVENT_JAVABYTECODE + }, + { + XPM_EVENT_SWJAVABYTECODE, + XPM_EVENT_JAVABACKBRANCH, + XPM_EVENT_COHERLINEMISS, + XPM_EVENT_COHERLINEHIT, + XPM_EVENT_INSTRSTALL, + XPM_EVENT_DATASTALL + }, + { + XPM_EVENT_MAINTLBSTALL, + XPM_EVENT_STREXPASS, + XPM_EVENT_STREXFAIL, + XPM_EVENT_DATAEVICT, + XPM_EVENT_NODISPATCH, + XPM_EVENT_ISSUEEMPTY + }, + { + XPM_EVENT_INSTRRENAME, + XPM_EVENT_PREDICTFUNCRET, + XPM_EVENT_MAINEXEC, + XPM_EVENT_SECEXEC, + XPM_EVENT_LDRSTR, + XPM_EVENT_FLOATRENAME + }, + { + XPM_EVENT_NEONRENAME, + XPM_EVENT_PLDSTALL, + XPM_EVENT_WRITESTALL, + XPM_EVENT_INSTRTLBSTALL, + XPM_EVENT_DATATLBSTALL, + XPM_EVENT_INSTR_uTLBSTALL + }, + { + XPM_EVENT_DATA_uTLBSTALL, + XPM_EVENT_DMB_STALL, + XPM_EVENT_INT_CLKEN, + XPM_EVENT_DE_CLKEN, + XPM_EVENT_INSTRISB, + XPM_EVENT_INSTRDSB + }, + { + XPM_EVENT_INSTRDMB, + XPM_EVENT_EXTINT, + XPM_EVENT_PLE_LRC, + XPM_EVENT_PLE_LRS, + XPM_EVENT_PLE_FLUSH, + XPM_EVENT_PLE_CMPL + }, + { + XPM_EVENT_PLE_OVFL, + XPM_EVENT_PLE_PROG, + XPM_EVENT_PLE_LRC, + XPM_EVENT_PLE_LRS, + XPM_EVENT_PLE_FLUSH, + XPM_EVENT_PLE_CMPL + }, + { + XPM_EVENT_DATASTALL, + XPM_EVENT_INSRFETCH_CACHEREFILL, + XPM_EVENT_INSTRFECT_TLBREFILL, + XPM_EVENT_DATA_CACHEREFILL, + XPM_EVENT_DATA_CACHEACCESS, + XPM_EVENT_DATA_TLBREFILL + }, +}; + +/************************** Function Prototypes ******************************/ + +void Xpm_DisableEventCounters(void); +void Xpm_EnableEventCounters (void); +void Xpm_ResetEventCounters (void); + +/******************************************************************************/ + +/****************************************************************************/ +/** +* +* This function disables the Cortex A9 event counters. +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void Xpm_DisableEventCounters(void) +{ + /* Disable the event counters */ + mtcp(XREG_CP15_COUNT_ENABLE_CLR, 0x3f); +} + +/****************************************************************************/ +/** +* +* This function enables the Cortex A9 event counters. +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void Xpm_EnableEventCounters(void) +{ + /* Enable the event counters */ + mtcp(XREG_CP15_COUNT_ENABLE_SET, 0x3f); +} + +/****************************************************************************/ +/** +* +* This function resets the Cortex A9 event counters. +* +* @param None. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void Xpm_ResetEventCounters(void) +{ + u32 Reg; + +#ifdef __GNUC__ + Reg = mfcp(XREG_CP15_PERF_MONITOR_CTRL); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_PERF_MONITOR_CTRL, Reg); +#else + { register unsigned int C15Reg __asm(XREG_CP15_PERF_MONITOR_CTRL); + Reg = C15Reg; } +#endif + Reg |= (1 << 2); /* reset event counters */ + mtcp(XREG_CP15_PERF_MONITOR_CTRL, Reg); +} + +/****************************************************************************/ +/** +* +* This function configures the Cortex A9 event counters controller, with the +* event codes, in a configuration selected by the user and enables the counters. +* +* @param PmcrCfg is configuration value based on which the event counters +* are configured. +* Use XPM_CNTRCFG* values defined in xpm_counter.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void Xpm_SetEvents(int PmcrCfg) +{ + u32 Counter; + const u32 *Ptr = PmcrEvents[PmcrCfg]; + + Xpm_DisableEventCounters(); + + for(Counter = 0; Counter < XPM_CTRCOUNT; Counter++) { + + /* Selecet event counter */ + mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter); + + /* Set the event */ + mtcp(XREG_CP15_EVENT_TYPE_SEL, Ptr[Counter]); + } + + Xpm_ResetEventCounters(); + Xpm_EnableEventCounters(); +} + +/****************************************************************************/ +/** +* +* This function disables the event counters and returns the counter values. +* +* @param PmCtrValue is a pointer to an array of type u32 PmCtrValue[6]. +* It is an output parameter which is used to return the PM +* counter values. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void Xpm_GetEventCounters(u32 *PmCtrValue) +{ + u32 Counter; + + Xpm_DisableEventCounters(); + + for(Counter = 0; Counter < XPM_CTRCOUNT; Counter++) { + + mtcp(XREG_CP15_EVENT_CNTR_SEL, Counter); +#ifdef __GNUC__ + PmCtrValue[Counter] = mfcp(XREG_CP15_PERF_MONITOR_COUNT); +#elif defined (__ICCARM__) + mfcp(XREG_CP15_PERF_MONITOR_COUNT, PmCtrValue[Counter]); +#else + { register unsigned int Cp15Reg __asm(XREG_CP15_PERF_MONITOR_COUNT); + PmCtrValue[Counter] = Cp15Reg; } +#endif + } +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.h new file mode 100755 index 000000000..2ef3f9fab --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.h @@ -0,0 +1,580 @@ +/****************************************************************************** +* +* (c) Copyright 2011-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpm_counter.h +* +* This header file contains APIs for configuring and controlling the Cortex-A9 +* Performance Monitor Events. +* Cortex-A9 Performance Monitor has 6 event counters which can be used to +* count a variety of events described in Coretx-A9 TRM. This file defines +* configurations, where value configures the event counters to count a +* set of events. +* +* Xpm_SetEvents can be used to set the event counters to count a set of events +* and Xpm_GetEventCounters can be used to read the counter values. +* +* @note +* +* This file doesn't handle the Cortex-A9 cycle counter, as the cycle counter is +* being used for time keeping. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a sdm 07/11/11 First release +* </pre> +* +******************************************************************************/ + +#ifndef XPMCOUNTER_H /* prevent circular inclusions */ +#define XPMCOUNTER_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#include <stdint.h> +#include "xpseudo_asm.h" +#include "xil_types.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/************************** Constant Definitions ****************************/ + +/* Number of performance counters */ +#define XPM_CTRCOUNT 6 + +/* The following constants define the Cortex-A9 Performance Monitor Events */ + +/* + * Software increment. The register is incremented only on writes to the + * Software Increment Register + */ +#define XPM_EVENT_SOFTINCR 0x00 + +/* + * Instruction fetch that causes a refill at (at least) the lowest level(s) of + * instruction or unified cache. Includes the speculative linefills in the + * count + */ +#define XPM_EVENT_INSRFETCH_CACHEREFILL 0x01 + +/* + * Instruction fetch that causes a TLB refill at (at least) the lowest level of + * TLB. Includes the speculative requests in the count + */ +#define XPM_EVENT_INSTRFECT_TLBREFILL 0x02 + +/* + * Data read or write operation that causes a refill at (at least) the lowest + * level(s)of data or unified cache. Counts the number of allocations performed + * in the Data Cache due to a read or a write + */ +#define XPM_EVENT_DATA_CACHEREFILL 0x03 + +/* + * Data read or write operation that causes a cache access at (at least) the + * lowest level(s) of data or unified cache. This includes speculative reads + */ +#define XPM_EVENT_DATA_CACHEACCESS 0x04 + +/* + * Data read or write operation that causes a TLB refill at (at least) the + * lowest level of TLB. This does not include micro TLB misses due to PLD, PLI, + * CP15 Cache operation by MVA and CP15 VA to PA operations + */ +#define XPM_EVENT_DATA_TLBREFILL 0x05 + +/* + * Data read architecturally executed. Counts the number of data read + * instructions accepted by the Load Store Unit. This includes counting the + * speculative and aborted LDR/LDM, as well as the reads due to the SWP + * instructions + */ +#define XPM_EVENT_DATA_READS 0x06 + +/* + * Data write architecturally executed. Counts the number of data write + * instructions accepted by the Load Store Unit. This includes counting the + * speculative and aborted STR/STM, as well as the writes due to the SWP + * instructions + */ +#define XPM_EVENT_DATA_WRITE 0x07 + +/* Exception taken. Counts the number of exceptions architecturally taken.*/ +#define XPM_EVENT_EXCEPTION 0x09 + +/* Exception return architecturally executed.*/ +#define XPM_EVENT_EXCEPRETURN 0x0A + +/* + * Change to ContextID retired. Counts the number of instructions + * architecturally executed writing into the ContextID Register + */ +#define XPM_EVENT_CHANGECONTEXT 0x0B + +/* + * Software change of PC, except by an exception, architecturally executed. + * Count the number of PC changes architecturally executed, excluding the PC + * changes due to taken exceptions + */ +#define XPM_EVENT_SW_CHANGEPC 0x0C + +/* + * Immediate branch architecturally executed (taken or not taken). This includes + * the branches which are flushed due to a previous load/store which aborts + * late + */ +#define XPM_EVENT_IMMEDBRANCH 0x0D + +/* + * Unaligned access architecturally executed. Counts the number of aborted + * unaligned accessed architecturally executed, and the number of not-aborted + * unaligned accesses, including the speculative ones + */ +#define XPM_EVENT_UNALIGNEDACCESS 0x0F + +/* + * Branch mispredicted/not predicted. Counts the number of mispredicted or + * not-predicted branches executed. This includes the branches which are flushed + * due to a previous load/store which aborts late + */ +#define XPM_EVENT_BRANCHMISS 0x10 + +/* + * Counts clock cycles when the Cortex-A9 processor is not in WFE/WFI. This + * event is not exported on the PMUEVENT bus + */ +#define XPM_EVENT_CLOCKCYCLES 0x11 + +/* + * Branches or other change in program flow that could have been predicted by + * the branch prediction resources of the processor. This includes the branches + * which are flushed due to a previous load/store which aborts late + */ +#define XPM_EVENT_BRANCHPREDICT 0x12 + +/* + * Java bytecode execute. Counts the number of Java bytecodes being decoded, + * including speculative ones + */ +#define XPM_EVENT_JAVABYTECODE 0x40 + +/* + * Software Java bytecode executed. Counts the number of software java bytecodes + * being decoded, including speculative ones + */ +#define XPM_EVENT_SWJAVABYTECODE 0x41 + +/* + * Jazelle backward branches executed. Counts the number of Jazelle taken + * branches being executed. This includes the branches which are flushed due + * to a previous load/store which aborts late + */ +#define XPM_EVENT_JAVABACKBRANCH 0x42 + +/* + * Coherent linefill miss Counts the number of coherent linefill requests + * performed by the Cortex-A9 processor which also miss in all the other + * Cortex-A9 processors, meaning that the request is sent to the external + * memory + */ +#define XPM_EVENT_COHERLINEMISS 0x50 + +/* + * Coherent linefill hit. Counts the number of coherent linefill requests + * performed by the Cortex-A9 processor which hit in another Cortex-A9 + * processor, meaning that the linefill data is fetched directly from the + * relevant Cortex-A9 cache + */ +#define XPM_EVENT_COHERLINEHIT 0x51 + +/* + * Instruction cache dependent stall cycles. Counts the number of cycles where + * the processor is ready to accept new instructions, but does not receive any + * due to the instruction side not being able to provide any and the + * instruction cache is currently performing at least one linefill + */ +#define XPM_EVENT_INSTRSTALL 0x60 + +/* + * Data cache dependent stall cycles. Counts the number of cycles where the core + * has some instructions that it cannot issue to any pipeline, and the Load + * Store unit has at least one pending linefill request, and no pending + */ +#define XPM_EVENT_DATASTALL 0x61 + +/* + * Main TLB miss stall cycles. Counts the number of cycles where the processor + * is stalled waiting for the completion of translation table walks from the + * main TLB. The processor stalls can be due to the instruction side not being + * able to provide the instructions, or to the data side not being able to + * provide the necessary data, due to them waiting for the main TLB translation + * table walk to complete + */ +#define XPM_EVENT_MAINTLBSTALL 0x62 + +/* + * Counts the number of STREX instructions architecturally executed and + * passed + */ +#define XPM_EVENT_STREXPASS 0x63 + +/* + * Counts the number of STREX instructions architecturally executed and + * failed + */ +#define XPM_EVENT_STREXFAIL 0x64 + +/* + * Data eviction. Counts the number of eviction requests due to a linefill in + * the data cache + */ +#define XPM_EVENT_DATAEVICT 0x65 + +/* + * Counts the number of cycles where the issue stage does not dispatch any + * instruction because it is empty or cannot dispatch any instructions + */ +#define XPM_EVENT_NODISPATCH 0x66 + +/* + * Counts the number of cycles where the issue stage is empty + */ +#define XPM_EVENT_ISSUEEMPTY 0x67 + +/* + * Counts the number of instructions going through the Register Renaming stage. + * This number is an approximate number of the total number of instructions + * speculatively executed, and even more approximate of the total number of + * instructions architecturally executed. The approximation depends mainly on + * the branch misprediction rate. + * The renaming stage can handle two instructions in the same cycle so the event + * is two bits long: + * - b00 no instructions renamed + * - b01 one instruction renamed + * - b10 two instructions renamed + */ +#define XPM_EVENT_INSTRRENAME 0x68 + +/* + * Counts the number of procedure returns whose condition codes do not fail, + * excluding all returns from exception. This count includes procedure returns + * which are flushed due to a previous load/store which aborts late. + * Only the following instructions are reported: + * - BX R14 + * - MOV PC LR + * - POP {..,pc} + * - LDR pc,[sp],#offset + * The following instructions are not reported: + * - LDMIA R9!,{..,PC} (ThumbEE state only) + * - LDR PC,[R9],#offset (ThumbEE state only) + * - BX R0 (Rm != R14) + * - MOV PC,R0 (Rm != R14) + * - LDM SP,{...,PC} (writeback not specified) + * - LDR PC,[SP,#offset] (wrong addressing mode) + */ +#define XPM_EVENT_PREDICTFUNCRET 0x6E + +/* + * Counts the number of instructions being executed in the main execution + * pipeline of the processor, the multiply pipeline and arithmetic logic unit + * pipeline. The counted instructions are still speculative + */ +#define XPM_EVENT_MAINEXEC 0x70 + +/* + * Counts the number of instructions being executed in the processor second + * execution pipeline (ALU). The counted instructions are still speculative + */ +#define XPM_EVENT_SECEXEC 0x71 + +/* + * Counts the number of instructions being executed in the Load/Store unit. The + * counted instructions are still speculative + */ +#define XPM_EVENT_LDRSTR 0x72 + +/* + * Counts the number of Floating-point instructions going through the Register + * Rename stage. Instructions are still speculative in this stage. + *Two floating-point instructions can be renamed in the same cycle so the event + * is two bitslong: + *0b00 no floating-point instruction renamed + *0b01 one floating-point instruction renamed + *0b10 two floating-point instructions renamed + */ +#define XPM_EVENT_FLOATRENAME 0x73 + +/* + * Counts the number of Neon instructions going through the Register Rename + * stage.Instructions are still speculative in this stage. + * Two NEON instructions can be renamed in the same cycle so the event is two + * bits long: + *0b00 no NEON instruction renamed + *0b01 one NEON instruction renamed + *0b10 two NEON instructions renamed + */ +#define XPM_EVENT_NEONRENAME 0x74 + +/* + * Counts the number of cycles where the processor is stalled because PLD slots + * are all full + */ +#define XPM_EVENT_PLDSTALL 0x80 + +/* + * Counts the number of cycles when the processor is stalled and the data side + * is stalled too because it is full and executing writes to the external + * memory + */ +#define XPM_EVENT_WRITESTALL 0x81 + +/* + * Counts the number of stall cycles due to main TLB misses on requests issued + * by the instruction side + */ +#define XPM_EVENT_INSTRTLBSTALL 0x82 + +/* + * Counts the number of stall cycles due to main TLB misses on requests issued + * by the data side + */ +#define XPM_EVENT_DATATLBSTALL 0x83 + +/* + * Counts the number of stall cycles due to micro TLB misses on the instruction + * side. This event does not include main TLB miss stall cycles that are already + * counted in the corresponding main TLB event + */ +#define XPM_EVENT_INSTR_uTLBSTALL 0x84 + +/* + * Counts the number of stall cycles due to micro TLB misses on the data side. + * This event does not include main TLB miss stall cycles that are already + * counted in the corresponding main TLB event + */ +#define XPM_EVENT_DATA_uTLBSTALL 0x85 + +/* + * Counts the number of stall cycles because of the execution of a DMB memory + * barrier. This includes all DMB instructions being executed, even + * speculatively + */ +#define XPM_EVENT_DMB_STALL 0x86 + +/* + * Counts the number of cycles during which the integer core clock is enabled + */ +#define XPM_EVENT_INT_CLKEN 0x8A + +/* + * Counts the number of cycles during which the Data Engine clock is enabled + */ +#define XPM_EVENT_DE_CLKEN 0x8B + +/* + * Counts the number of ISB instructions architecturally executed + */ +#define XPM_EVENT_INSTRISB 0x90 + +/* + * Counts the number of DSB instructions architecturally executed + */ +#define XPM_EVENT_INSTRDSB 0x91 + +/* + * Counts the number of DMB instructions speculatively executed + */ +#define XPM_EVENT_INSTRDMB 0x92 + +/* + * Counts the number of external interrupts executed by the processor + */ +#define XPM_EVENT_EXTINT 0x93 + +/* + * PLE cache line request completed + */ +#define XPM_EVENT_PLE_LRC 0xA0 + +/* + * PLE cache line request skipped + */ +#define XPM_EVENT_PLE_LRS 0xA1 + +/* + * PLE FIFO flush + */ +#define XPM_EVENT_PLE_FLUSH 0xA2 + +/* + * PLE request complete + */ +#define XPM_EVENT_PLE_CMPL 0xA3 + +/* + * PLE FIFO overflow + */ +#define XPM_EVENT_PLE_OVFL 0xA4 + +/* + * PLE request programmed + */ +#define XPM_EVENT_PLE_PROG 0xA5 + +/* + * The following constants define the configurations for Cortex-A9 Performance + * Monitor Events. Each configuration configures the event counters for a set + * of events. + * ----------------------------------------------- + * Config PmCtr0... PmCtr5 + * ----------------------------------------------- + * XPM_CNTRCFG1 { XPM_EVENT_SOFTINCR, + * XPM_EVENT_INSRFETCH_CACHEREFILL, + * XPM_EVENT_INSTRFECT_TLBREFILL, + * XPM_EVENT_DATA_CACHEREFILL, + * XPM_EVENT_DATA_CACHEACCESS, + * XPM_EVENT_DATA_TLBREFILL } + * + * XPM_CNTRCFG2 { XPM_EVENT_DATA_READS, + * XPM_EVENT_DATA_WRITE, + * XPM_EVENT_EXCEPTION, + * XPM_EVENT_EXCEPRETURN, + * XPM_EVENT_CHANGECONTEXT, + * XPM_EVENT_SW_CHANGEPC } + * + * XPM_CNTRCFG3 { XPM_EVENT_IMMEDBRANCH, + * XPM_EVENT_UNALIGNEDACCESS, + * XPM_EVENT_BRANCHMISS, + * XPM_EVENT_CLOCKCYCLES, + * XPM_EVENT_BRANCHPREDICT, + * XPM_EVENT_JAVABYTECODE } + * + * XPM_CNTRCFG4 { XPM_EVENT_SWJAVABYTECODE, + * XPM_EVENT_JAVABACKBRANCH, + * XPM_EVENT_COHERLINEMISS, + * XPM_EVENT_COHERLINEHIT, + * XPM_EVENT_INSTRSTALL, + * XPM_EVENT_DATASTALL } + * + * XPM_CNTRCFG5 { XPM_EVENT_MAINTLBSTALL, + * XPM_EVENT_STREXPASS, + * XPM_EVENT_STREXFAIL, + * XPM_EVENT_DATAEVICT, + * XPM_EVENT_NODISPATCH, + * XPM_EVENT_ISSUEEMPTY } + * + * XPM_CNTRCFG6 { XPM_EVENT_INSTRRENAME, + * XPM_EVENT_PREDICTFUNCRET, + * XPM_EVENT_MAINEXEC, + * XPM_EVENT_SECEXEC, + * XPM_EVENT_LDRSTR, + * XPM_EVENT_FLOATRENAME } + * + * XPM_CNTRCFG7 { XPM_EVENT_NEONRENAME, + * XPM_EVENT_PLDSTALL, + * XPM_EVENT_WRITESTALL, + * XPM_EVENT_INSTRTLBSTALL, + * XPM_EVENT_DATATLBSTALL, + * XPM_EVENT_INSTR_uTLBSTALL } + * + * XPM_CNTRCFG8 { XPM_EVENT_DATA_uTLBSTALL, + * XPM_EVENT_DMB_STALL, + * XPM_EVENT_INT_CLKEN, + * XPM_EVENT_DE_CLKEN, + * XPM_EVENT_INSTRISB, + * XPM_EVENT_INSTRDSB } + * + * XPM_CNTRCFG9 { XPM_EVENT_INSTRDMB, + * XPM_EVENT_EXTINT, + * XPM_EVENT_PLE_LRC, + * XPM_EVENT_PLE_LRS, + * XPM_EVENT_PLE_FLUSH, + * XPM_EVENT_PLE_CMPL } + * + * XPM_CNTRCFG10 { XPM_EVENT_PLE_OVFL, + * XPM_EVENT_PLE_PROG, + * XPM_EVENT_PLE_LRC, + * XPM_EVENT_PLE_LRS, + * XPM_EVENT_PLE_FLUSH, + * XPM_EVENT_PLE_CMPL } + * + * XPM_CNTRCFG11 { XPM_EVENT_DATASTALL, + * XPM_EVENT_INSRFETCH_CACHEREFILL, + * XPM_EVENT_INSTRFECT_TLBREFILL, + * XPM_EVENT_DATA_CACHEREFILL, + * XPM_EVENT_DATA_CACHEACCESS, + * XPM_EVENT_DATA_TLBREFILL } + */ +#define XPM_CNTRCFG1 0 +#define XPM_CNTRCFG2 1 +#define XPM_CNTRCFG3 2 +#define XPM_CNTRCFG4 3 +#define XPM_CNTRCFG5 4 +#define XPM_CNTRCFG6 5 +#define XPM_CNTRCFG7 6 +#define XPM_CNTRCFG8 7 +#define XPM_CNTRCFG9 8 +#define XPM_CNTRCFG10 9 +#define XPM_CNTRCFG11 10 + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +/* Interface fuctions to access perfromance counters from abstraction layer */ +void Xpm_SetEvents(int PmcrCfg); +void Xpm_GetEventCounters(u32 *PmCtrValue); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpm_counter.o new file mode 100644 index 0000000000000000000000000000000000000000..82b3cae7b391ff8f1eb14120bbdf0494036d6cbb GIT binary patch literal 4936 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 literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpseudo_asm.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpseudo_asm.h new file mode 100755 index 000000000..e44a79954 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpseudo_asm.h @@ -0,0 +1,64 @@ +/******************************************************************************* +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpseudo_asm.h +* +* This header file contains macros for using inline assembler code. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 10/18/09 First release +* 3.04a sdm 01/02/12 Remove redundant dsb in mcr instruction. +* </pre> +* +******************************************************************************/ +#include "xreg_cortexa9.h" +#ifdef __GNUC__ + #include "xpseudo_asm_gcc.h" +#elif defined (__ICCARM__) + #include "xpseudo_asm_iccarm.h" +#else + #include "xpseudo_asm_rvct.h" +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpseudo_asm_gcc.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpseudo_asm_gcc.h new file mode 100755 index 000000000..52fac3b34 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xpseudo_asm_gcc.h @@ -0,0 +1,183 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xpseudo_asm_gcc.h +* +* This header file contains macros for using inline assembler code. It is +* written specifically for the GNU compiler. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 10/28/09 First release +* </pre> +* +******************************************************************************/ + +#ifndef XPSEUDO_ASM_GCC_H /* prevent circular inclusions */ +#define XPSEUDO_ASM_GCC_H /* by using protection macros */ + +/***************************** Include Files ********************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/* necessary for pre-processor */ +#define stringify(s) tostring(s) +#define tostring(s) #s + +/* pseudo assembler instructions */ +#define mfcpsr() ({unsigned int rval; \ + __asm__ __volatile__(\ + "mrs %0, cpsr\n"\ + : "=r" (rval)\ + );\ + rval;\ + }) + +#define mtcpsr(v) __asm__ __volatile__(\ + "msr cpsr,%0\n"\ + : : "r" (v)\ + ) + +#define cpsiei() __asm__ __volatile__("cpsie i\n") +#define cpsidi() __asm__ __volatile__("cpsid i\n") + +#define cpsief() __asm__ __volatile__("cpsie f\n") +#define cpsidf() __asm__ __volatile__("cpsid f\n") + + + +#define mtgpr(rn, v) __asm__ __volatile__(\ + "mov r" stringify(rn) ", %0 \n"\ + : : "r" (v)\ + ) + +#define mfgpr(rn) ({unsigned int rval; \ + __asm__ __volatile__(\ + "mov %0,r" stringify(rn) "\n"\ + : "=r" (rval)\ + );\ + rval;\ + }) + +/* memory synchronization operations */ + +/* Instruction Synchronization Barrier */ +#define isb() __asm__ __volatile__ ("isb" : : : "memory") + +/* Data Synchronization Barrier */ +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") + +/* Data Memory Barrier */ +#define dmb() __asm__ __volatile__ ("dmb" : : : "memory") + + +/* Memory Operations */ +#define ldr(adr) ({unsigned long rval; \ + __asm__ __volatile__(\ + "ldr %0,[%1]"\ + : "=r" (rval) : "r" (adr)\ + );\ + rval;\ + }) + +#define ldrb(adr) ({unsigned char rval; \ + __asm__ __volatile__(\ + "ldrb %0,[%1]"\ + : "=r" (rval) : "r" (adr)\ + );\ + rval;\ + }) + +#define str(adr, val) __asm__ __volatile__(\ + "str %0,[%1]\n"\ + : : "r" (val), "r" (adr)\ + ) + +#define strb(adr, val) __asm__ __volatile__(\ + "strb %0,[%1]\n"\ + : : "r" (val), "r" (adr)\ + ) + +/* Count leading zeroes (clz) */ +#define clz(arg) ({unsigned char rval; \ + __asm__ __volatile__(\ + "clz %0,%1"\ + : "=r" (rval) : "r" (arg)\ + );\ + rval;\ + }) + +/* CP15 operations */ +#define mtcp(rn, v) __asm__ __volatile__(\ + "mcr " rn "\n"\ + : : "r" (v)\ + ); + +#define mfcp(rn) ({unsigned int rval; \ + __asm__ __volatile__(\ + "mrc " rn "\n"\ + : "=r" (rval)\ + );\ + rval;\ + }) + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XPSEUDO_ASM_GCC_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xreg_cortexa9.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xreg_cortexa9.h new file mode 100755 index 000000000..65e648f54 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xreg_cortexa9.h @@ -0,0 +1,599 @@ +/******************************************************************************* +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +*******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xreg_cortexa9.h +* +* This header file contains definitions for using inline assembler code. It is +* written specifically for the GNU, IAR, ARMCC compiler. +* +* All of the ARM Cortex A9 GPRs, SPRs, and Debug Registers are defined along +* with the positions of the bits within the registers. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- -------- -------- ----------------------------------------------- +* 1.00a ecm/sdm 10/20/09 First release +* </pre> +* +******************************************************************************/ +#ifndef XREG_CORTEXA9_H +#define XREG_CORTEXA9_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* GPRs */ +#define XREG_GPR0 r0 +#define XREG_GPR1 r1 +#define XREG_GPR2 r2 +#define XREG_GPR3 r3 +#define XREG_GPR4 r4 +#define XREG_GPR5 r5 +#define XREG_GPR6 r6 +#define XREG_GPR7 r7 +#define XREG_GPR8 r8 +#define XREG_GPR9 r9 +#define XREG_GPR10 r10 +#define XREG_GPR11 r11 +#define XREG_GPR12 r12 +#define XREG_GPR13 r13 +#define XREG_GPR14 r14 +#define XREG_GPR15 r15 +#define XREG_CPSR cpsr + +/* Coprocessor number defines */ +#define XREG_CP0 0 +#define XREG_CP1 1 +#define XREG_CP2 2 +#define XREG_CP3 3 +#define XREG_CP4 4 +#define XREG_CP5 5 +#define XREG_CP6 6 +#define XREG_CP7 7 +#define XREG_CP8 8 +#define XREG_CP9 9 +#define XREG_CP10 10 +#define XREG_CP11 11 +#define XREG_CP12 12 +#define XREG_CP13 13 +#define XREG_CP14 14 +#define XREG_CP15 15 + +/* Coprocessor control register defines */ +#define XREG_CR0 cr0 +#define XREG_CR1 cr1 +#define XREG_CR2 cr2 +#define XREG_CR3 cr3 +#define XREG_CR4 cr4 +#define XREG_CR5 cr5 +#define XREG_CR6 cr6 +#define XREG_CR7 cr7 +#define XREG_CR8 cr8 +#define XREG_CR9 cr9 +#define XREG_CR10 cr10 +#define XREG_CR11 cr11 +#define XREG_CR12 cr12 +#define XREG_CR13 cr13 +#define XREG_CR14 cr14 +#define XREG_CR15 cr15 + +/* Current Processor Status Register (CPSR) Bits */ +#define XREG_CPSR_THUMB_MODE 0x20 +#define XREG_CPSR_MODE_BITS 0x1F +#define XREG_CPSR_SYSTEM_MODE 0x1F +#define XREG_CPSR_UNDEFINED_MODE 0x1B +#define XREG_CPSR_DATA_ABORT_MODE 0x17 +#define XREG_CPSR_SVC_MODE 0x13 +#define XREG_CPSR_IRQ_MODE 0x12 +#define XREG_CPSR_FIQ_MODE 0x11 +#define XREG_CPSR_USER_MODE 0x10 + +#define XREG_CPSR_IRQ_ENABLE 0x80 +#define XREG_CPSR_FIQ_ENABLE 0x40 + +#define XREG_CPSR_N_BIT 0x80000000 +#define XREG_CPSR_Z_BIT 0x40000000 +#define XREG_CPSR_C_BIT 0x20000000 +#define XREG_CPSR_V_BIT 0x10000000 + + +/* CP15 defines */ +#if defined (__GNUC__) || defined (__ICCARM__) +/* C0 Register defines */ +#define XREG_CP15_MAIN_ID "p15, 0, %0, c0, c0, 0" +#define XREG_CP15_CACHE_TYPE "p15, 0, %0, c0, c0, 1" +#define XREG_CP15_TCM_TYPE "p15, 0, %0, c0, c0, 2" +#define XREG_CP15_TLB_TYPE "p15, 0, %0, c0, c0, 3" +#define XREG_CP15_MULTI_PROC_AFFINITY "p15, 0, %0, c0, c0, 5" + +#define XREG_CP15_PROC_FEATURE_0 "p15, 0, %0, c0, c1, 0" +#define XREG_CP15_PROC_FEATURE_1 "p15, 0, %0, c0, c1, 1" +#define XREG_CP15_DEBUG_FEATURE_0 "p15, 0, %0, c0, c1, 2" +#define XREG_CP15_MEMORY_FEATURE_0 "p15, 0, %0, c0, c1, 4" +#define XREG_CP15_MEMORY_FEATURE_1 "p15, 0, %0, c0, c1, 5" +#define XREG_CP15_MEMORY_FEATURE_2 "p15, 0, %0, c0, c1, 6" +#define XREG_CP15_MEMORY_FEATURE_3 "p15, 0, %0, c0, c1, 7" + +#define XREG_CP15_INST_FEATURE_0 "p15, 0, %0, c0, c2, 0" +#define XREG_CP15_INST_FEATURE_1 "p15, 0, %0, c0, c2, 1" +#define XREG_CP15_INST_FEATURE_2 "p15, 0, %0, c0, c2, 2" +#define XREG_CP15_INST_FEATURE_3 "p15, 0, %0, c0, c2, 3" +#define XREG_CP15_INST_FEATURE_4 "p15, 0, %0, c0, c2, 4" + +#define XREG_CP15_CACHE_SIZE_ID "p15, 1, %0, c0, c0, 0" +#define XREG_CP15_CACHE_LEVEL_ID "p15, 1, %0, c0, c0, 1" +#define XREG_CP15_AUXILARY_ID "p15, 1, %0, c0, c0, 7" + +#define XREG_CP15_CACHE_SIZE_SEL "p15, 2, %0, c0, c0, 0" + +/* C1 Register Defines */ +#define XREG_CP15_SYS_CONTROL "p15, 0, %0, c1, c0, 0" +#define XREG_CP15_AUX_CONTROL "p15, 0, %0, c1, c0, 1" +#define XREG_CP15_CP_ACCESS_CONTROL "p15, 0, %0, c1, c0, 2" + +#define XREG_CP15_SECURE_CONFIG "p15, 0, %0, c1, c1, 0" +#define XREG_CP15_SECURE_DEBUG_ENABLE "p15, 0, %0, c1, c1, 1" +#define XREG_CP15_NS_ACCESS_CONTROL "p15, 0, %0, c1, c1, 2" +#define XREG_CP15_VIRTUAL_CONTROL "p15, 0, %0, c1, c1, 3" + +#else /* RVCT */ +/* C0 Register defines */ +#define XREG_CP15_MAIN_ID "cp15:0:c0:c0:0" +#define XREG_CP15_CACHE_TYPE "cp15:0:c0:c0:1" +#define XREG_CP15_TCM_TYPE "cp15:0:c0:c0:2" +#define XREG_CP15_TLB_TYPE "cp15:0:c0:c0:3" +#define XREG_CP15_MULTI_PROC_AFFINITY "cp15:0:c0:c0:5" + +#define XREG_CP15_PROC_FEATURE_0 "cp15:0:c0:c1:0" +#define XREG_CP15_PROC_FEATURE_1 "cp15:0:c0:c1:1" +#define XREG_CP15_DEBUG_FEATURE_0 "cp15:0:c0:c1:2" +#define XREG_CP15_MEMORY_FEATURE_0 "cp15:0:c0:c1:4" +#define XREG_CP15_MEMORY_FEATURE_1 "cp15:0:c0:c1:5" +#define XREG_CP15_MEMORY_FEATURE_2 "cp15:0:c0:c1:6" +#define XREG_CP15_MEMORY_FEATURE_3 "cp15:0:c0:c1:7" + +#define XREG_CP15_INST_FEATURE_0 "cp15:0:c0:c2:0" +#define XREG_CP15_INST_FEATURE_1 "cp15:0:c0:c2:1" +#define XREG_CP15_INST_FEATURE_2 "cp15:0:c0:c2:2" +#define XREG_CP15_INST_FEATURE_3 "cp15:0:c0:c2:3" +#define XREG_CP15_INST_FEATURE_4 "cp15:0:c0:c2:4" + +#define XREG_CP15_CACHE_SIZE_ID "cp15:1:c0:c0:0" +#define XREG_CP15_CACHE_LEVEL_ID "cp15:1:c0:c0:1" +#define XREG_CP15_AUXILARY_ID "cp15:1:c0:c0:7" + +#define XREG_CP15_CACHE_SIZE_SEL "cp15:2:c0:c0:0" + +/* C1 Register Defines */ +#define XREG_CP15_SYS_CONTROL "cp15:0:c1:c0:0" +#define XREG_CP15_AUX_CONTROL "cp15:0:c1:c0:1" +#define XREG_CP15_CP_ACCESS_CONTROL "cp15:0:c1:c0:2" + +#define XREG_CP15_SECURE_CONFIG "cp15:0:c1:c1:0" +#define XREG_CP15_SECURE_DEBUG_ENABLE "cp15:0:c1:c1:1" +#define XREG_CP15_NS_ACCESS_CONTROL "cp15:0:c1:c1:2" +#define XREG_CP15_VIRTUAL_CONTROL "cp15:0:c1:c1:3" +#endif + +/* XREG_CP15_CONTROL bit defines */ +#define XREG_CP15_CONTROL_TE_BIT 0x40000000 +#define XREG_CP15_CONTROL_AFE_BIT 0x20000000 +#define XREG_CP15_CONTROL_TRE_BIT 0x10000000 +#define XREG_CP15_CONTROL_NMFI_BIT 0x08000000 +#define XREG_CP15_CONTROL_EE_BIT 0x02000000 +#define XREG_CP15_CONTROL_HA_BIT 0x00020000 +#define XREG_CP15_CONTROL_RR_BIT 0x00004000 +#define XREG_CP15_CONTROL_V_BIT 0x00002000 +#define XREG_CP15_CONTROL_I_BIT 0x00001000 +#define XREG_CP15_CONTROL_Z_BIT 0x00000800 +#define XREG_CP15_CONTROL_SW_BIT 0x00000400 +#define XREG_CP15_CONTROL_B_BIT 0x00000080 +#define XREG_CP15_CONTROL_C_BIT 0x00000004 +#define XREG_CP15_CONTROL_A_BIT 0x00000002 +#define XREG_CP15_CONTROL_M_BIT 0x00000001 + +#if defined (__GNUC__) || defined (__ICCARM__) +/* C2 Register Defines */ +#define XREG_CP15_TTBR0 "p15, 0, %0, c2, c0, 0" +#define XREG_CP15_TTBR1 "p15, 0, %0, c2, c0, 1" +#define XREG_CP15_TTB_CONTROL "p15, 0, %0, c2, c0, 2" + +/* C3 Register Defines */ +#define XREG_CP15_DOMAIN_ACCESS_CTRL "p15, 0, %0, c3, c0, 0" + +/* C4 Register Defines */ +/* Not Used */ + +/* C5 Register Defines */ +#define XREG_CP15_DATA_FAULT_STATUS "p15, 0, %0, c5, c0, 0" +#define XREG_CP15_INST_FAULT_STATUS "p15, 0, %0, c5, c0, 1" + +#define XREG_CP15_AUX_DATA_FAULT_STATUS "p15, 0, %0, c5, c1, 0" +#define XREG_CP15_AUX_INST_FAULT_STATUS "p15, 0, %0, c5, c1, 1" + +/* C6 Register Defines */ +#define XREG_CP15_DATA_FAULT_ADDRESS "p15, 0, %0, c6, c0, 0" +#define XREG_CP15_INST_FAULT_ADDRESS "p15, 0, %0, c6, c0, 2" + +/* C7 Register Defines */ +#define XREG_CP15_NOP "p15, 0, %0, c7, c0, 4" + +#define XREG_CP15_INVAL_IC_POU_IS "p15, 0, %0, c7, c1, 0" +#define XREG_CP15_INVAL_BRANCH_ARRAY_IS "p15, 0, %0, c7, c1, 6" + +#define XREG_CP15_PHYS_ADDR "p15, 0, %0, c7, c4, 0" + +#define XREG_CP15_INVAL_IC_POU "p15, 0, %0, c7, c5, 0" +#define XREG_CP15_INVAL_IC_LINE_MVA_POU "p15, 0, %0, c7, c5, 1" + +/* The CP15 register access below has been deprecated in favor of the new + * isb instruction in Cortex A9. + */ +#define XREG_CP15_INST_SYNC_BARRIER "p15, 0, %0, c7, c5, 4" +#define XREG_CP15_INVAL_BRANCH_ARRAY "p15, 0, %0, c7, c5, 6" + +#define XREG_CP15_INVAL_DC_LINE_MVA_POC "p15, 0, %0, c7, c6, 1" +#define XREG_CP15_INVAL_DC_LINE_SW "p15, 0, %0, c7, c6, 2" + +#define XREG_CP15_VA_TO_PA_CURRENT_0 "p15, 0, %0, c7, c8, 0" +#define XREG_CP15_VA_TO_PA_CURRENT_1 "p15, 0, %0, c7, c8, 1" +#define XREG_CP15_VA_TO_PA_CURRENT_2 "p15, 0, %0, c7, c8, 2" +#define XREG_CP15_VA_TO_PA_CURRENT_3 "p15, 0, %0, c7, c8, 3" + +#define XREG_CP15_VA_TO_PA_OTHER_0 "p15, 0, %0, c7, c8, 4" +#define XREG_CP15_VA_TO_PA_OTHER_1 "p15, 0, %0, c7, c8, 5" +#define XREG_CP15_VA_TO_PA_OTHER_2 "p15, 0, %0, c7, c8, 6" +#define XREG_CP15_VA_TO_PA_OTHER_3 "p15, 0, %0, c7, c8, 7" + +#define XREG_CP15_CLEAN_DC_LINE_MVA_POC "p15, 0, %0, c7, c10, 1" +#define XREG_CP15_CLEAN_DC_LINE_SW "p15, 0, %0, c7, c10, 2" + +/* The next two CP15 register accesses below have been deprecated in favor + * of the new dsb and dmb instructions in Cortex A9. + */ +#define XREG_CP15_DATA_SYNC_BARRIER "p15, 0, %0, c7, c10, 4" +#define XREG_CP15_DATA_MEMORY_BARRIER "p15, 0, %0, c7, c10, 5" + +#define XREG_CP15_CLEAN_DC_LINE_MVA_POU "p15, 0, %0, c7, c11, 1" + +#define XREG_CP15_NOP2 "p15, 0, %0, c7, c13, 1" + +#define XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC "p15, 0, %0, c7, c14, 1" +#define XREG_CP15_CLEAN_INVAL_DC_LINE_SW "p15, 0, %0, c7, c14, 2" + +/* C8 Register Defines */ +#define XREG_CP15_INVAL_TLB_IS "p15, 0, %0, c8, c3, 0" +#define XREG_CP15_INVAL_TLB_MVA_IS "p15, 0, %0, c8, c3, 1" +#define XREG_CP15_INVAL_TLB_ASID_IS "p15, 0, %0, c8, c3, 2" +#define XREG_CP15_INVAL_TLB_MVA_ASID_IS "p15, 0, %0, c8, c3, 3" + +#define XREG_CP15_INVAL_ITLB_UNLOCKED "p15, 0, %0, c8, c5, 0" +#define XREG_CP15_INVAL_ITLB_MVA "p15, 0, %0, c8, c5, 1" +#define XREG_CP15_INVAL_ITLB_ASID "p15, 0, %0, c8, c5, 2" + +#define XREG_CP15_INVAL_DTLB_UNLOCKED "p15, 0, %0, c8, c6, 0" +#define XREG_CP15_INVAL_DTLB_MVA "p15, 0, %0, c8, c6, 1" +#define XREG_CP15_INVAL_DTLB_ASID "p15, 0, %0, c8, c6, 2" + +#define XREG_CP15_INVAL_UTLB_UNLOCKED "p15, 0, %0, c8, c7, 0" +#define XREG_CP15_INVAL_UTLB_MVA "p15, 0, %0, c8, c7, 1" +#define XREG_CP15_INVAL_UTLB_ASID "p15, 0, %0, c8, c7, 2" +#define XREG_CP15_INVAL_UTLB_MVA_ASID "p15, 0, %0, c8, c7, 3" + +/* C9 Register Defines */ +#define XREG_CP15_PERF_MONITOR_CTRL "p15, 0, %0, c9, c12, 0" +#define XREG_CP15_COUNT_ENABLE_SET "p15, 0, %0, c9, c12, 1" +#define XREG_CP15_COUNT_ENABLE_CLR "p15, 0, %0, c9, c12, 2" +#define XREG_CP15_V_FLAG_STATUS "p15, 0, %0, c9, c12, 3" +#define XREG_CP15_SW_INC "p15, 0, %0, c9, c12, 4" +#define XREG_CP15_EVENT_CNTR_SEL "p15, 0, %0, c9, c12, 5" + +#define XREG_CP15_PERF_CYCLE_COUNTER "p15, 0, %0, c9, c13, 0" +#define XREG_CP15_EVENT_TYPE_SEL "p15, 0, %0, c9, c13, 1" +#define XREG_CP15_PERF_MONITOR_COUNT "p15, 0, %0, c9, c13, 2" + +#define XREG_CP15_USER_ENABLE "p15, 0, %0, c9, c14, 0" +#define XREG_CP15_INTR_ENABLE_SET "p15, 0, %0, c9, c14, 1" +#define XREG_CP15_INTR_ENABLE_CLR "p15, 0, %0, c9, c14, 2" + +/* C10 Register Defines */ +#define XREG_CP15_TLB_LOCKDWN "p15, 0, %0, c10, c0, 0" + +#define XREG_CP15_PRI_MEM_REMAP "p15, 0, %0, c10, c2, 0" +#define XREG_CP15_NORM_MEM_REMAP "p15, 0, %0, c10, c2, 1" + +/* C11 Register Defines */ +/* Not used */ + +/* C12 Register Defines */ +#define XREG_CP15_VEC_BASE_ADDR "p15, 0, %0, c12, c0, 0" +#define XREG_CP15_MONITOR_VEC_BASE_ADDR "p15, 0, %0, c12, c0, 1" + +#define XREG_CP15_INTERRUPT_STATUS "p15, 0, %0, c12, c1, 0" +#define XREG_CP15_VIRTUALIZATION_INTR "p15, 0, %0, c12, c1, 1" + +/* C13 Register Defines */ +#define XREG_CP15_CONTEXT_ID "p15, 0, %0, c13, c0, 1" +#define USER_RW_THREAD_PID "p15, 0, %0, c13, c0, 2" +#define USER_RO_THREAD_PID "p15, 0, %0, c13, c0, 3" +#define USER_PRIV_THREAD_PID "p15, 0, %0, c13, c0, 4" + +/* C14 Register Defines */ +/* not used */ + +/* C15 Register Defines */ +#define XREG_CP15_POWER_CTRL "p15, 0, %0, c15, c0, 0" +#define XREG_CP15_CONFIG_BASE_ADDR "p15, 4, %0, c15, c0, 0" + +#define XREG_CP15_READ_TLB_ENTRY "p15, 5, %0, c15, c4, 2" +#define XREG_CP15_WRITE_TLB_ENTRY "p15, 5, %0, c15, c4, 4" + +#define XREG_CP15_MAIN_TLB_VA "p15, 5, %0, c15, c5, 2" + +#define XREG_CP15_MAIN_TLB_PA "p15, 5, %0, c15, c6, 2" + +#define XREG_CP15_MAIN_TLB_ATTR "p15, 5, %0, c15, c7, 2" + +#else +/* C2 Register Defines */ +#define XREG_CP15_TTBR0 "cp15:0:c2:c0:0" +#define XREG_CP15_TTBR1 "cp15:0:c2:c0:1" +#define XREG_CP15_TTB_CONTROL "cp15:0:c2:c0:2" + +/* C3 Register Defines */ +#define XREG_CP15_DOMAIN_ACCESS_CTRL "cp15:0:c3:c0:0" + +/* C4 Register Defines */ +/* Not Used */ + +/* C5 Register Defines */ +#define XREG_CP15_DATA_FAULT_STATUS "cp15:0:c5:c0:0" +#define XREG_CP15_INST_FAULT_STATUS "cp15:0:c5:c0:1" + +#define XREG_CP15_AUX_DATA_FAULT_STATUS "cp15:0:c5:c1:0" +#define XREG_CP15_AUX_INST_FAULT_STATUS "cp15:0:c5:c1:1" + +/* C6 Register Defines */ +#define XREG_CP15_DATA_FAULT_ADDRESS "cp15:0:c6:c0:0" +#define XREG_CP15_INST_FAULT_ADDRESS "cp15:0:c6:c0:2" + +/* C7 Register Defines */ +#define XREG_CP15_NOP "cp15:0:c7:c0:4" + +#define XREG_CP15_INVAL_IC_POU_IS "cp15:0:c7:c1:0" +#define XREG_CP15_INVAL_BRANCH_ARRAY_IS "cp15:0:c7:c1:6" + +#define XREG_CP15_PHYS_ADDR "cp15:0:c7:c4:0" + +#define XREG_CP15_INVAL_IC_POU "cp15:0:c7:c5:0" +#define XREG_CP15_INVAL_IC_LINE_MVA_POU "cp15:0:c7:c5:1" + +/* The CP15 register access below has been deprecated in favor of the new + * isb instruction in Cortex A9. + */ +#define XREG_CP15_INST_SYNC_BARRIER "cp15:0:c7:c5:4" +#define XREG_CP15_INVAL_BRANCH_ARRAY "cp15:0:c7:c5:6" + +#define XREG_CP15_INVAL_DC_LINE_MVA_POC "cp15:0:c7:c6:1" +#define XREG_CP15_INVAL_DC_LINE_SW "cp15:0:c7:c6:2" + +#define XREG_CP15_VA_TO_PA_CURRENT_0 "cp15:0:c7:c8:0" +#define XREG_CP15_VA_TO_PA_CURRENT_1 "cp15:0:c7:c8:1" +#define XREG_CP15_VA_TO_PA_CURRENT_2 "cp15:0:c7:c8:2" +#define XREG_CP15_VA_TO_PA_CURRENT_3 "cp15:0:c7:c8:3" + +#define XREG_CP15_VA_TO_PA_OTHER_0 "cp15:0:c7:c8:4" +#define XREG_CP15_VA_TO_PA_OTHER_1 "cp15:0:c7:c8:5" +#define XREG_CP15_VA_TO_PA_OTHER_2 "cp15:0:c7:c8:6" +#define XREG_CP15_VA_TO_PA_OTHER_3 "cp15:0:c7:c8:7" + +#define XREG_CP15_CLEAN_DC_LINE_MVA_POC "cp15:0:c7:c10:1" +#define XREG_CP15_CLEAN_DC_LINE_SW "cp15:0:c7:c10:2" + +/* The next two CP15 register accesses below have been deprecated in favor + * of the new dsb and dmb instructions in Cortex A9. + */ +#define XREG_CP15_DATA_SYNC_BARRIER "cp15:0:c7:c10:4" +#define XREG_CP15_DATA_MEMORY_BARRIER "cp15:0:c7:c10:5" + +#define XREG_CP15_CLEAN_DC_LINE_MVA_POU "cp15:0:c7:c11:1" + +#define XREG_CP15_NOP2 "cp15:0:c7:c13:1" + +#define XREG_CP15_CLEAN_INVAL_DC_LINE_MVA_POC "cp15:0:c7:c14:1" +#define XREG_CP15_CLEAN_INVAL_DC_LINE_SW "cp15:0:c7:c14:2" + +/* C8 Register Defines */ +#define XREG_CP15_INVAL_TLB_IS "cp15:0:c8:c3:0" +#define XREG_CP15_INVAL_TLB_MVA_IS "cp15:0:c8:c3:1" +#define XREG_CP15_INVAL_TLB_ASID_IS "cp15:0:c8:c3:2" +#define XREG_CP15_INVAL_TLB_MVA_ASID_IS "cp15:0:c8:c3:3" + +#define XREG_CP15_INVAL_ITLB_UNLOCKED "cp15:0:c8:c5:0" +#define XREG_CP15_INVAL_ITLB_MVA "cp15:0:c8:c5:1" +#define XREG_CP15_INVAL_ITLB_ASID "cp15:0:c8:c5:2" + +#define XREG_CP15_INVAL_DTLB_UNLOCKED "cp15:0:c8:c6:0" +#define XREG_CP15_INVAL_DTLB_MVA "cp15:0:c8:c6:1" +#define XREG_CP15_INVAL_DTLB_ASID "cp15:0:c8:c6:2" + +#define XREG_CP15_INVAL_UTLB_UNLOCKED "cp15:0:c8:c7:0" +#define XREG_CP15_INVAL_UTLB_MVA "cp15:0:c8:c7:1" +#define XREG_CP15_INVAL_UTLB_ASID "cp15:0:c8:c7:2" +#define XREG_CP15_INVAL_UTLB_MVA_ASID "cp15:0:c8:c7:3" + +/* C9 Register Defines */ +#define XREG_CP15_PERF_MONITOR_CTRL "cp15:0:c9:c12:0" +#define XREG_CP15_COUNT_ENABLE_SET "cp15:0:c9:c12:1" +#define XREG_CP15_COUNT_ENABLE_CLR "cp15:0:c9:c12:2" +#define XREG_CP15_V_FLAG_STATUS "cp15:0:c9:c12:3" +#define XREG_CP15_SW_INC "cp15:0:c9:c12:4" +#define XREG_CP15_EVENT_CNTR_SEL "cp15:0:c9:c12:5" + +#define XREG_CP15_PERF_CYCLE_COUNTER "cp15:0:c9:c13:0" +#define XREG_CP15_EVENT_TYPE_SEL "cp15:0:c9:c13:1" +#define XREG_CP15_PERF_MONITOR_COUNT "cp15:0:c9:c13:2" + +#define XREG_CP15_USER_ENABLE "cp15:0:c9:c14:0" +#define XREG_CP15_INTR_ENABLE_SET "cp15:0:c9:c14:1" +#define XREG_CP15_INTR_ENABLE_CLR "cp15:0:c9:c14:2" + +/* C10 Register Defines */ +#define XREG_CP15_TLB_LOCKDWN "cp15:0:c10:c0:0" + +#define XREG_CP15_PRI_MEM_REMAP "cp15:0:c10:c2:0" +#define XREG_CP15_NORM_MEM_REMAP "cp15:0:c10:c2:1" + +/* C11 Register Defines */ +/* Not used */ + +/* C12 Register Defines */ +#define XREG_CP15_VEC_BASE_ADDR "cp15:0:c12:c0:0" +#define XREG_CP15_MONITOR_VEC_BASE_ADDR "cp15:0:c12:c0:1" + +#define XREG_CP15_INTERRUPT_STATUS "cp15:0:c12:c1:0" +#define XREG_CP15_VIRTUALIZATION_INTR "cp15:0:c12:c1:1" + +/* C13 Register Defines */ +#define XREG_CP15_CONTEXT_ID "cp15:0:c13:c0:1" +#define USER_RW_THREAD_PID "cp15:0:c13:c0:2" +#define USER_RO_THREAD_PID "cp15:0:c13:c0:3" +#define USER_PRIV_THREAD_PID "cp15:0:c13:c0:4" + +/* C14 Register Defines */ +/* not used */ + +/* C15 Register Defines */ +#define XREG_CP15_POWER_CTRL "cp15:0:c15:c0:0" +#define XREG_CP15_CONFIG_BASE_ADDR "cp15:4:c15:c0:0" + +#define XREG_CP15_READ_TLB_ENTRY "cp15:5:c15:c4:2" +#define XREG_CP15_WRITE_TLB_ENTRY "cp15:5:c15:c4:4" + +#define XREG_CP15_MAIN_TLB_VA "cp15:5:c15:c5:2" + +#define XREG_CP15_MAIN_TLB_PA "cp15:5:c15:c6:2" + +#define XREG_CP15_MAIN_TLB_ATTR "cp15:5:c15:c7:2" +#endif + + +/* MPE register definitions */ +#define XREG_FPSID c0 +#define XREG_FPSCR c1 +#define XREG_MVFR1 c6 +#define XREG_MVFR0 c7 +#define XREG_FPEXC c8 +#define XREG_FPINST c9 +#define XREG_FPINST2 c10 + +/* FPSID bits */ +#define XREG_FPSID_IMPLEMENTER_BIT (24) +#define XREG_FPSID_IMPLEMENTER_MASK (0xFF << FPSID_IMPLEMENTER_BIT) +#define XREG_FPSID_SOFTWARE (1<<23) +#define XREG_FPSID_ARCH_BIT (16) +#define XREG_FPSID_ARCH_MASK (0xF << FPSID_ARCH_BIT) +#define XREG_FPSID_PART_BIT (8) +#define XREG_FPSID_PART_MASK (0xFF << FPSID_PART_BIT) +#define XREG_FPSID_VARIANT_BIT (4) +#define XREG_FPSID_VARIANT_MASK (0xF << FPSID_VARIANT_BIT) +#define XREG_FPSID_REV_BIT (0) +#define XREG_FPSID_REV_MASK (0xF << FPSID_REV_BIT) + +/* FPSCR bits */ +#define XREG_FPSCR_N_BIT (1 << 31) +#define XREG_FPSCR_Z_BIT (1 << 30) +#define XREG_FPSCR_C_BIT (1 << 29) +#define XREG_FPSCR_V_BIT (1 << 28) +#define XREG_FPSCR_QC (1 << 27) +#define XREG_FPSCR_AHP (1 << 26) +#define XREG_FPSCR_DEFAULT_NAN (1 << 25) +#define XREG_FPSCR_FLUSHTOZERO (1 << 24) +#define XREG_FPSCR_ROUND_NEAREST (0 << 22) +#define XREG_FPSCR_ROUND_PLUSINF (1 << 22) +#define XREG_FPSCR_ROUND_MINUSINF (2 << 22) +#define XREG_FPSCR_ROUND_TOZERO (3 << 22) +#define XREG_FPSCR_RMODE_BIT (22) +#define XREG_FPSCR_RMODE_MASK (3 << FPSCR_RMODE_BIT) +#define XREG_FPSCR_STRIDE_BIT (20) +#define XREG_FPSCR_STRIDE_MASK (3 << FPSCR_STRIDE_BIT) +#define XREG_FPSCR_LENGTH_BIT (16) +#define XREG_FPSCR_LENGTH_MASK (7 << FPSCR_LENGTH_BIT) +#define XREG_FPSCR_IDC (1 << 7) +#define XREG_FPSCR_IXC (1 << 4) +#define XREG_FPSCR_UFC (1 << 3) +#define XREG_FPSCR_OFC (1 << 2) +#define XREG_FPSCR_DZC (1 << 1) +#define XREG_FPSCR_IOC (1 << 0) + +/* MVFR0 bits */ +#define XREG_MVFR0_RMODE_BIT (28) +#define XREG_MVFR0_RMODE_MASK (0xF << XREG_MVFR0_RMODE_BIT) +#define XREG_MVFR0_SHORT_VEC_BIT (24) +#define XREG_MVFR0_SHORT_VEC_MASK (0xF << XREG_MVFR0_SHORT_VEC_BIT) +#define XREG_MVFR0_SQRT_BIT (20) +#define XREG_MVFR0_SQRT_MASK (0xF << XREG_MVFR0_SQRT_BIT) +#define XREG_MVFR0_DIVIDE_BIT (16) +#define XREG_MVFR0_DIVIDE_MASK (0xF << XREG_MVFR0_DIVIDE_BIT) +#define XREG_MVFR0_EXEC_TRAP_BIT (12) +#define XREG_MVFR0_EXEC_TRAP_MASK (0xF << XREG_MVFR0_EXEC_TRAP_BIT) +#define XREG_MVFR0_DP_BIT (8) +#define XREG_MVFR0_DP_MASK (0xF << XREG_MVFR0_DP_BIT) +#define XREG_MVFR0_SP_BIT (4) +#define XREG_MVFR0_SP_MASK (0xF << XREG_MVFR0_SP_BIT) +#define XREG_MVFR0_A_SIMD_BIT (0) +#define XREG_MVFR0_A_SIMD_MASK (0xF << MVFR0_A_SIMD_BIT) + +/* FPEXC bits */ +#define XREG_FPEXC_EX (1 << 31) +#define XREG_FPEXC_EN (1 << 30) +#define XREG_FPEXC_DEX (1 << 29) + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XREG_CORTEXA9_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xstatus.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xstatus.h new file mode 100755 index 000000000..76d2a94c7 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xstatus.h @@ -0,0 +1,439 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xstatus.h +* +* This file contains Xilinx software status codes. Status codes have their +* own data type called int. These codes are used throughout the Xilinx +* device drivers. +* +******************************************************************************/ + +#ifndef XSTATUS_H /* prevent circular inclusions */ +#define XSTATUS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" + +/************************** Constant Definitions *****************************/ + +/*********************** Common statuses 0 - 500 *****************************/ + +#define XST_SUCCESS 0L +#define XST_FAILURE 1L +#define XST_DEVICE_NOT_FOUND 2L +#define XST_DEVICE_BLOCK_NOT_FOUND 3L +#define XST_INVALID_VERSION 4L +#define XST_DEVICE_IS_STARTED 5L +#define XST_DEVICE_IS_STOPPED 6L +#define XST_FIFO_ERROR 7L /* an error occurred during an + operation with a FIFO such as + an underrun or overrun, this + error requires the device to + be reset */ +#define XST_RESET_ERROR 8L /* an error occurred which requires + the device to be reset */ +#define XST_DMA_ERROR 9L /* a DMA error occurred, this error + typically requires the device + using the DMA to be reset */ +#define XST_NOT_POLLED 10L /* the device is not configured for + polled mode operation */ +#define XST_FIFO_NO_ROOM 11L /* a FIFO did not have room to put + the specified data into */ +#define XST_BUFFER_TOO_SMALL 12L /* the buffer is not large enough + to hold the expected data */ +#define XST_NO_DATA 13L /* there was no data available */ +#define XST_REGISTER_ERROR 14L /* a register did not contain the + expected value */ +#define XST_INVALID_PARAM 15L /* an invalid parameter was passed + into the function */ +#define XST_NOT_SGDMA 16L /* the device is not configured for + scatter-gather DMA operation */ +#define XST_LOOPBACK_ERROR 17L /* a loopback test failed */ +#define XST_NO_CALLBACK 18L /* a callback has not yet been + registered */ +#define XST_NO_FEATURE 19L /* device is not configured with + the requested feature */ +#define XST_NOT_INTERRUPT 20L /* device is not configured for + interrupt mode operation */ +#define XST_DEVICE_BUSY 21L /* device is busy */ +#define XST_ERROR_COUNT_MAX 22L /* the error counters of a device + have maxed out */ +#define XST_IS_STARTED 23L /* used when part of device is + already started i.e. + sub channel */ +#define XST_IS_STOPPED 24L /* used when part of device is + already stopped i.e. + sub channel */ +#define XST_DATA_LOST 26L /* driver defined error */ +#define XST_RECV_ERROR 27L /* generic receive error */ +#define XST_SEND_ERROR 28L /* generic transmit error */ +#define XST_NOT_ENABLED 29L /* a requested service is not + available because it has not + been enabled */ + +/***************** Utility Component statuses 401 - 500 *********************/ + +#define XST_MEMTEST_FAILED 401L /* memory test failed */ + + +/***************** Common Components statuses 501 - 1000 *********************/ + +/********************* Packet Fifo statuses 501 - 510 ************************/ + +#define XST_PFIFO_LACK_OF_DATA 501L /* not enough data in FIFO */ +#define XST_PFIFO_NO_ROOM 502L /* not enough room in FIFO */ +#define XST_PFIFO_BAD_REG_VALUE 503L /* self test, a register value + was invalid after reset */ +#define XST_PFIFO_ERROR 504L /* generic packet FIFO error */ +#define XST_PFIFO_DEADLOCK 505L /* packet FIFO is reporting + * empty and full simultaneously + */ + +/************************** DMA statuses 511 - 530 ***************************/ + +#define XST_DMA_TRANSFER_ERROR 511L /* self test, DMA transfer + failed */ +#define XST_DMA_RESET_REGISTER_ERROR 512L /* self test, a register value + was invalid after reset */ +#define XST_DMA_SG_LIST_EMPTY 513L /* scatter gather list contains + no buffer descriptors ready + to be processed */ +#define XST_DMA_SG_IS_STARTED 514L /* scatter gather not stopped */ +#define XST_DMA_SG_IS_STOPPED 515L /* scatter gather not running */ +#define XST_DMA_SG_LIST_FULL 517L /* all the buffer desciptors of + the scatter gather list are + being used */ +#define XST_DMA_SG_BD_LOCKED 518L /* the scatter gather buffer + descriptor which is to be + copied over in the scatter + list is locked */ +#define XST_DMA_SG_NOTHING_TO_COMMIT 519L /* no buffer descriptors have been + put into the scatter gather + list to be commited */ +#define XST_DMA_SG_COUNT_EXCEEDED 521L /* the packet count threshold + specified was larger than the + total # of buffer descriptors + in the scatter gather list */ +#define XST_DMA_SG_LIST_EXISTS 522L /* the scatter gather list has + already been created */ +#define XST_DMA_SG_NO_LIST 523L /* no scatter gather list has + been created */ +#define XST_DMA_SG_BD_NOT_COMMITTED 524L /* the buffer descriptor which was + being started was not committed + to the list */ +#define XST_DMA_SG_NO_DATA 525L /* the buffer descriptor to start + has already been used by the + hardware so it can't be reused + */ +#define XST_DMA_SG_LIST_ERROR 526L /* general purpose list access + error */ +#define XST_DMA_BD_ERROR 527L /* general buffer descriptor + error */ + +/************************** IPIF statuses 531 - 550 ***************************/ + +#define XST_IPIF_REG_WIDTH_ERROR 531L /* an invalid register width + was passed into the function */ +#define XST_IPIF_RESET_REGISTER_ERROR 532L /* the value of a register at + reset was not valid */ +#define XST_IPIF_DEVICE_STATUS_ERROR 533L /* a write to the device interrupt + status register did not read + back correctly */ +#define XST_IPIF_DEVICE_ACK_ERROR 534L /* the device interrupt status + register did not reset when + acked */ +#define XST_IPIF_DEVICE_ENABLE_ERROR 535L /* the device interrupt enable + register was not updated when + other registers changed */ +#define XST_IPIF_IP_STATUS_ERROR 536L /* a write to the IP interrupt + status register did not read + back correctly */ +#define XST_IPIF_IP_ACK_ERROR 537L /* the IP interrupt status register + did not reset when acked */ +#define XST_IPIF_IP_ENABLE_ERROR 538L /* IP interrupt enable register was + not updated correctly when other + registers changed */ +#define XST_IPIF_DEVICE_PENDING_ERROR 539L /* The device interrupt pending + register did not indicate the + expected value */ +#define XST_IPIF_DEVICE_ID_ERROR 540L /* The device interrupt ID register + did not indicate the expected + value */ +#define XST_IPIF_ERROR 541L /* generic ipif error */ + +/****************** Device specific statuses 1001 - 4095 *********************/ + +/********************* Ethernet statuses 1001 - 1050 *************************/ + +#define XST_EMAC_MEMORY_SIZE_ERROR 1001L /* Memory space is not big enough + * to hold the minimum number of + * buffers or descriptors */ +#define XST_EMAC_MEMORY_ALLOC_ERROR 1002L /* Memory allocation failed */ +#define XST_EMAC_MII_READ_ERROR 1003L /* MII read error */ +#define XST_EMAC_MII_BUSY 1004L /* An MII operation is in progress */ +#define XST_EMAC_OUT_OF_BUFFERS 1005L /* Driver is out of buffers */ +#define XST_EMAC_PARSE_ERROR 1006L /* Invalid driver init string */ +#define XST_EMAC_COLLISION_ERROR 1007L /* Excess deferral or late + * collision on polled send */ + +/*********************** UART statuses 1051 - 1075 ***************************/ +#define XST_UART + +#define XST_UART_INIT_ERROR 1051L +#define XST_UART_START_ERROR 1052L +#define XST_UART_CONFIG_ERROR 1053L +#define XST_UART_TEST_FAIL 1054L +#define XST_UART_BAUD_ERROR 1055L +#define XST_UART_BAUD_RANGE 1056L + + +/************************ IIC statuses 1076 - 1100 ***************************/ + +#define XST_IIC_SELFTEST_FAILED 1076 /* self test failed */ +#define XST_IIC_BUS_BUSY 1077 /* bus found busy */ +#define XST_IIC_GENERAL_CALL_ADDRESS 1078 /* mastersend attempted with */ + /* general call address */ +#define XST_IIC_STAND_REG_RESET_ERROR 1079 /* A non parameterizable reg */ + /* value after reset not valid */ +#define XST_IIC_TX_FIFO_REG_RESET_ERROR 1080 /* Tx fifo included in design */ + /* value after reset not valid */ +#define XST_IIC_RX_FIFO_REG_RESET_ERROR 1081 /* Rx fifo included in design */ + /* value after reset not valid */ +#define XST_IIC_TBA_REG_RESET_ERROR 1082 /* 10 bit addr incl in design */ + /* value after reset not valid */ +#define XST_IIC_CR_READBACK_ERROR 1083 /* Read of the control register */ + /* didn't return value written */ +#define XST_IIC_DTR_READBACK_ERROR 1084 /* Read of the data Tx reg */ + /* didn't return value written */ +#define XST_IIC_DRR_READBACK_ERROR 1085 /* Read of the data Receive reg */ + /* didn't return value written */ +#define XST_IIC_ADR_READBACK_ERROR 1086 /* Read of the data Tx reg */ + /* didn't return value written */ +#define XST_IIC_TBA_READBACK_ERROR 1087 /* Read of the 10 bit addr reg */ + /* didn't return written value */ +#define XST_IIC_NOT_SLAVE 1088 /* The device isn't a slave */ + +/*********************** ATMC statuses 1101 - 1125 ***************************/ + +#define XST_ATMC_ERROR_COUNT_MAX 1101L /* the error counters in the ATM + controller hit the max value + which requires the statistics + to be cleared */ + +/*********************** Flash statuses 1126 - 1150 **************************/ + +#define XST_FLASH_BUSY 1126L /* Flash is erasing or programming + */ +#define XST_FLASH_READY 1127L /* Flash is ready for commands */ +#define XST_FLASH_ERROR 1128L /* Flash had detected an internal + error. Use XFlash_DeviceControl + to retrieve device specific codes + */ +#define XST_FLASH_ERASE_SUSPENDED 1129L /* Flash is in suspended erase state + */ +#define XST_FLASH_WRITE_SUSPENDED 1130L /* Flash is in suspended write state + */ +#define XST_FLASH_PART_NOT_SUPPORTED 1131L /* Flash type not supported by + driver */ +#define XST_FLASH_NOT_SUPPORTED 1132L /* Operation not supported */ +#define XST_FLASH_TOO_MANY_REGIONS 1133L /* Too many erase regions */ +#define XST_FLASH_TIMEOUT_ERROR 1134L /* Programming or erase operation + aborted due to a timeout */ +#define XST_FLASH_ADDRESS_ERROR 1135L /* Accessed flash outside its + addressible range */ +#define XST_FLASH_ALIGNMENT_ERROR 1136L /* Write alignment error */ +#define XST_FLASH_BLOCKING_CALL_ERROR 1137L /* Couldn't return immediately from + write/erase function with + XFL_NON_BLOCKING_WRITE/ERASE + option cleared */ +#define XST_FLASH_CFI_QUERY_ERROR 1138L /* Failed to query the device */ + +/*********************** SPI statuses 1151 - 1175 ****************************/ + +#define XST_SPI_MODE_FAULT 1151 /* master was selected as slave */ +#define XST_SPI_TRANSFER_DONE 1152 /* data transfer is complete */ +#define XST_SPI_TRANSMIT_UNDERRUN 1153 /* slave underruns transmit register */ +#define XST_SPI_RECEIVE_OVERRUN 1154 /* device overruns receive register */ +#define XST_SPI_NO_SLAVE 1155 /* no slave has been selected yet */ +#define XST_SPI_TOO_MANY_SLAVES 1156 /* more than one slave is being + * selected */ +#define XST_SPI_NOT_MASTER 1157 /* operation is valid only as master */ +#define XST_SPI_SLAVE_ONLY 1158 /* device is configured as slave-only + */ +#define XST_SPI_SLAVE_MODE_FAULT 1159 /* slave was selected while disabled */ +#define XST_SPI_SLAVE_MODE 1160 /* device has been addressed as slave */ +#define XST_SPI_RECEIVE_NOT_EMPTY 1161 /* device received data in slave mode */ + +#define XST_SPI_COMMAND_ERROR 1162 /* unrecognised command - qspi only */ + +/********************** OPB Arbiter statuses 1176 - 1200 *********************/ + +#define XST_OPBARB_INVALID_PRIORITY 1176 /* the priority registers have either + * one master assigned to two or more + * priorities, or one master not + * assigned to any priority + */ +#define XST_OPBARB_NOT_SUSPENDED 1177 /* an attempt was made to modify the + * priority levels without first + * suspending the use of priority + * levels + */ +#define XST_OPBARB_PARK_NOT_ENABLED 1178 /* bus parking by id was enabled but + * bus parking was not enabled + */ +#define XST_OPBARB_NOT_FIXED_PRIORITY 1179 /* the arbiter must be in fixed + * priority mode to allow the + * priorities to be changed + */ + +/************************ Intc statuses 1201 - 1225 **************************/ + +#define XST_INTC_FAIL_SELFTEST 1201 /* self test failed */ +#define XST_INTC_CONNECT_ERROR 1202 /* interrupt already in use */ + +/********************** TmrCtr statuses 1226 - 1250 **************************/ + +#define XST_TMRCTR_TIMER_FAILED 1226 /* self test failed */ + +/********************** WdtTb statuses 1251 - 1275 ***************************/ + +#define XST_WDTTB_TIMER_FAILED 1251L + +/********************** PlbArb statuses 1276 - 1300 **************************/ + +#define XST_PLBARB_FAIL_SELFTEST 1276L + +/********************** Plb2Opb statuses 1301 - 1325 *************************/ + +#define XST_PLB2OPB_FAIL_SELFTEST 1301L + +/********************** Opb2Plb statuses 1326 - 1350 *************************/ + +#define XST_OPB2PLB_FAIL_SELFTEST 1326L + +/********************** SysAce statuses 1351 - 1360 **************************/ + +#define XST_SYSACE_NO_LOCK 1351L /* No MPU lock has been granted */ + +/********************** PCI Bridge statuses 1361 - 1375 **********************/ + +#define XST_PCI_INVALID_ADDRESS 1361L + +/********************** FlexRay constants 1400 - 1409 *************************/ + +#define XST_FR_TX_ERROR 1400 +#define XST_FR_TX_BUSY 1401 +#define XST_FR_BUF_LOCKED 1402 +#define XST_FR_NO_BUF 1403 + +/****************** USB constants 1410 - 1420 *******************************/ + +#define XST_USB_ALREADY_CONFIGURED 1410 +#define XST_USB_BUF_ALIGN_ERROR 1411 +#define XST_USB_NO_DESC_AVAILABLE 1412 +#define XST_USB_BUF_TOO_BIG 1413 +#define XST_USB_NO_BUF 1414 + +/****************** HWICAP constants 1421 - 1429 *****************************/ + +#define XST_HWICAP_WRITE_DONE 1421 + + +/****************** AXI VDMA constants 1430 - 1440 *****************************/ + +#define XST_VDMA_MISMATCH_ERROR 1430 + +/*********************** NAND Flash statuses 1441 - 1459 *********************/ + +#define XST_NAND_BUSY 1441L /* Flash is erasing or + * programming + */ +#define XST_NAND_READY 1442L /* Flash is ready for commands + */ +#define XST_NAND_ERROR 1443L /* Flash had detected an + * internal error. + */ +#define XST_NAND_PART_NOT_SUPPORTED 1444L /* Flash type not supported by + * driver + */ +#define XST_NAND_OPT_NOT_SUPPORTED 1445L /* Operation not supported + */ +#define XST_NAND_TIMEOUT_ERROR 1446L /* Programming or erase + * operation aborted due to a + * timeout + */ +#define XST_NAND_ADDRESS_ERROR 1447L /* Accessed flash outside its + * addressible range + */ +#define XST_NAND_ALIGNMENT_ERROR 1448L /* Write alignment error + */ +#define XST_NAND_PARAM_PAGE_ERROR 1449L /* Failed to read parameter + * page of the device + */ +#define XST_NAND_CACHE_ERROR 1450L /* Flash page buffer error + */ + +#define XST_NAND_WRITE_PROTECTED 1451L /* Flash is write protected + */ + +/**************************** Type Definitions *******************************/ + +typedef int XStatus; + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.c new file mode 100755 index 000000000..723d19acf --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.c @@ -0,0 +1,129 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xtime_l.c +* +* This file contains low level functions to get/set time from the Global Timer +* register in the ARM Cortex A9 MP core. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- --------------------------------------------------- +* 1.00a rp/sdm 11/03/09 Initial release. +* 3.07a sgd 07/05/12 Upadted get/set time functions to make use Global Timer +* </pre> +* +* @note None. +* +******************************************************************************/ +/***************************** Include Files *********************************/ + +#include "xtime_l.h" +#include "xpseudo_asm.h" +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +/**************************************************************************** +* +* Set the time in the Global Timer Counter Register. +* +* @param Value to be written to the Global Timer Counter Register. +* +* @return None. +* +* @note In multiprocessor environment reference time will reset/lost for +* all processors, when this function called by any one processor. +* +****************************************************************************/ +void XTime_SetTime(XTime Xtime) +{ + /* Disable Global Timer */ + Xil_Out32(GLOBAL_TMR_BASEADDR + GTIMER_CONTROL_OFFSET, 0x0); + + /* Updating Global Timer Counter Register */ + Xil_Out32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_LOWER_OFFSET, (u32)Xtime); + Xil_Out32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_UPPER_OFFSET, + (u32)(Xtime>>32)); + + /* Enable Global Timer */ + Xil_Out32(GLOBAL_TMR_BASEADDR + GTIMER_CONTROL_OFFSET, 0x1); +} + +/**************************************************************************** +* +* Get the time from the Global Timer Counter Register. +* +* @param Pointer to the location to be updated with the time. +* +* @return None. +* +* @note None. +* +****************************************************************************/ +void XTime_GetTime(XTime *Xtime) +{ + u32 low; + u32 high; + + /* Reading Global Timer Counter Register */ + do + { + high = Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_UPPER_OFFSET); + low = Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_LOWER_OFFSET); + } while(Xil_In32(GLOBAL_TMR_BASEADDR + GTIMER_COUNTER_UPPER_OFFSET) != high); + + *Xtime = (((XTime) high) << 32) | (XTime) low; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.h new file mode 100755 index 000000000..e6550d3ce --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.h @@ -0,0 +1,96 @@ +/****************************************************************************** +* +* (c) Copyright 2009-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* @file xtime_l.h +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- --------------------------------------------------- +* 1.00a rp/sdm 11/03/09 Initial release. +* 3.06a sgd 05/15/12 Upadted get/set time functions to make use Global Timer +* 3.06a asa 06/17/12 Reverted back the changes to make use Global Timer. +* 3.07a sgd 07/05/12 Upadted get/set time functions to make use Global Timer +* </pre> +* +* @note None. +* +******************************************************************************/ + +#ifndef XTIME_H /* prevent circular inclusions */ +#define XTIME_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ +#include "xparameters.h" + +/***************** Macros (Inline Functions) Definitions *********************/ + +/**************************** Type Definitions *******************************/ + +typedef unsigned long long XTime; + +/************************** Constant Definitions *****************************/ +#define GLOBAL_TMR_BASEADDR XPAR_GLOBAL_TMR_BASEADDR +#define GTIMER_COUNTER_LOWER_OFFSET 0x00 +#define GTIMER_COUNTER_UPPER_OFFSET 0x04 +#define GTIMER_CONTROL_OFFSET 0x08 + + +/* Global Timer is always clocked at half of the CPU frequency */ +#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ /2) +/************************** Variable Definitions *****************************/ + +/************************** Function Prototypes ******************************/ + +void XTime_SetTime(XTime Xtime); +void XTime_GetTime(XTime *Xtime); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* XTIME_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.o b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/standalone_v3_11_a/src/xtime_l.o new file mode 100644 index 0000000000000000000000000000000000000000..2eb2efdd7700f1cf0b15d9f073644a640d386751 GIT binary patch literal 3544 zcmb7GO>7%Q6rNeHW2bQ(CvBlEe=ek=sLk4LiUOsA{HU~rmb!naR3LZlY-0=8PVIGR zDi9D#5g?%!gy2xYB9#jg5=b22z?D0Q1L77%pz?DlAP!K8@O`s0&ZZZ{lV-m6-uLFs zo0*;6eSX)zhozLlh!mT}vL!?@p_uq~1)IfMF(hWkM}C?=5G-EXb6`=N2o_{9SP+?D z(H6nNKTAu$^kjksD+NAzV3Bql_KO3{Hsd7XXUD(13jSy2W1eV?7+;w~V2&tni{irX zOG_I>Hdqw-U?HBJU$~b2YGL+;FRy-p1z4(HTkZ$S2hqK!96|&dtz_b9sIl7-9D8IF zR7)l=60AfTV0T8h3H!++J$B-Wke^q4e3%p1@$0mbar7c?$7>BADSCz!m)J<oPV9u$ zBW?8ZI6CYnJBZA{Ox#E9_*V2;v?RM{;Qt!fD-X(iuPj<Vh`c6#2np*9eB;{pm-cmp zSjFs;892J2N234-F4>l(1GGI1I}Kl0K$~h6zP@_%86i8nNFPn9s53M!p!H9qyNJMk z6cj4wwIb3smoOk5^wu>g8J6Kd)rmp*3W;B(N*wxx9F&{VtNUW<ThfDaNM?EvF)aG} z9)t@ga+8Rqcl15bw|6y;0!GppaUGPz#yaw$R2X)5ib=+M-kD5Ej7Y@0!!0CEzB(^4 zUtu-5-q+@(uvT4~T!jq_iMJ<H1u%WvyYpBeQ!sT6Owx~7EQNvT0Tjy02BH=0R8wc- zg3Mr)*}HmY3Ohit(Jb+tLLLY74E;uKh0-I6Z`lXmvZ*tsNBj}{Q*3(Q#L#yHjd_Sc zsCV;_KZYhnkq{{Lar8=f&~-Ghgg~iGql9znyQ4i}h%x3A&qu?O*VFw1?+zR`Ul~%I z^=qfRQr)RA_-w6Ssx=+X)+Is%gg-aywL=bfN6i=eUda5OeYKY^JUS8^aBz9#L3S^x zF2I3ES#LIGvZ~`{Ygd~sKig@vYcmaRI!o6I;}|A7(D8ANkFl_B6%|pf%~Zwi$Bt&F zvfG_8XH=-1D+Vu5wZdJgx-G%PdmG5xrIb5YZ&uuTu2XSaer|uQ(rQjk96C}ejExlT z%bo7H)46kV<!0$*yIe1o+q1dZ_E@QcC3t7u`%C#;y;g3wD!I1rHl|%n@0HGsmI{TE zn}a*7kV`yvgqwWW^NB*QJuEBqs9jl(+}({l=W*MG*gZA1BfI%<v(u`0t-0(}bK0Bq z8kK5xU(NTj+wz4`Cx7qA=>7NT&6(h}c0IRT6LJ`8d~9Sw^sGuuBxSEPWUrBH<;}5m za=qLjZ@2EmlfY+v34&|(Y&z91*1<NyXLB;0Id8ulyI{Q`yBz&Da>8lPo$}o>&~JrU zHCoH7JJ>m2IMc503a8v|3y02WuiTj_)fy+8pp@>G%PsGWv2aMyK)2;KX1o<+>$Qew zqA{ItD$P@;JZ!x)acIBe`hKfc?)WRmoNT!`jsGEcAeI*gFBT=+(FdWbdcG$px1jYZ zE$r4|bNSW4D@KiHToP@Qwqrobw;^<U&PCaR#`yn=V?AaJRF&_;h{LFPaMAjTsILf; z^~KRledEy07^q?nm;MhbS`7CXY@?H^qtGilhG4j-B0BvUOq8Xf#l-Q$9j!0uM=X4- zkA73%EOavls>p+Qj*1q;@s%0P_X+ZGKbfx&&E$I)I>&H-C?A8^Ws<<A%Em8aH12n7 zS^+*IChj5}*b0`Z<SsloIb#4BN4bJ#blOJ{w}*-r)<+4@qU-n^>&U{#b!5=YItHPe zX9cRbjC`L`(PHKzhTn~lco!egaX8n&H2H{}Gn(%^Y}z<{Mod0q8;tsG@!OK|6Jsk@ zOglOQZCjnq@|b8g@_bU4B__h3UgL?W6E+s(qdP~NC%-H)(J$~1qt+dIx$<R+MHqTx zDmuy!2<|(jh&F`v@qJ;0+3rCjXZSHg0?9|dcEhe1p1$F`5&1T%?}_<JbU$tU54aUY zY}L3^<38YR@SmWKhh<jd3mW-8v#@=54G0U{!gUbWYFtmmgL0e3jYK>vn>9b8afikU zjfXWJ*XU}jYHVuco#lMzHNLL#lE!z5nE$fIfQSqH5fS4))Akoc#C@ajM~#1LRKNL% zUynygtw-ZVBJyn^g1=YWyS05#+m92GzofCMagK;_Z)#NgiH>K=_@f$muPoeIep~6! KYn$(F+W!JcuhFUi literal 0 HcmV?d00001 diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/Makefile new file mode 100755 index 000000000..20fb57c34 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/Makefile @@ -0,0 +1,28 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES=*.c +INCLUDEFILES=*.h + +libs: + echo "Compiling tmrctr" + $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES) + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS} + make clean + +include: + ${CP} $(INCLUDEFILES) $(INCLUDEDIR) + +clean: + rm -rf ${OUTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr.c new file mode 100755 index 000000000..6ca63f6ec --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr.c @@ -0,0 +1,531 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr.c +* +* Contains required functions for the XTmrCtr driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 08/16/01 First release +* 1.00b jhl 02/21/02 Repartitioned the driver for smaller files +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 Updated to use HAL API's. _m is removed from all the macro +* definitions. +* 2.05a adk 15/05/13 Fixed the CR:693066 +* Added the IsStartedTmrCtr0/IsStartedTmrCtr1 members to the +* XTmrCtr instance structure. +* The IsStartedTmrCtrX will be assigned XIL_COMPONENT_IS_STARTED in +* the XTmrCtr_Start function. +* The IsStartedTmrCtrX will be cleared in the XTmrCtr_Stop function. +* There will be no Initialization done in the +* XTmrCtr_Initialize if both the timers have already started and +* the XST_DEVICE_IS_STARTED Status is returned. +* Removed the logic in the XTmrCtr_Initialize function +* which was checking the Register Value to know whether +* a timer has started or not. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xparameters.h" +#include "xtmrctr.h" +#include "xtmrctr_i.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Initializes a specific timer/counter instance/driver. Initialize fields of +* the XTmrCtr structure, then reset the timer/counter.If a timer is already +* running then it is not initialized. +* +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param DeviceId is the unique id of the device controlled by this +* XTmrCtr component. Passing in a device id associates the +* generic XTmrCtr component to a specific device, as chosen by +* the caller or application developer. +* +* @return +* - XST_SUCCESS if initialization was successful +* - XST_DEVICE_IS_STARTED if the device has already been started +* - XST_DEVICE_NOT_FOUND if the device doesn't exist +* +* @note None. +* +******************************************************************************/ +int XTmrCtr_Initialize(XTmrCtr * InstancePtr, u16 DeviceId) +{ + XTmrCtr_Config *TmrCtrConfigPtr; + int TmrCtrNumber; + int TmrCtrLowIndex = 0; + int TmrCtrHighIndex = XTC_DEVICE_TIMER_COUNT; + + Xil_AssertNonvoid(InstancePtr != NULL); + + + /* + * If both the timers have already started, disallow the initialize and + * return a status indicating it is started. This allows the user to stop + * the device and reinitialize, but prevents a user from inadvertently + * initializing. + * In case one of the timers has not started then that particular timer + * will be initialized + */ + if ((InstancePtr->IsStartedTmrCtr0 == XIL_COMPONENT_IS_STARTED) && + (InstancePtr->IsStartedTmrCtr1 == XIL_COMPONENT_IS_STARTED)) { + return XST_DEVICE_IS_STARTED; + } + + + /* + * Ensure that only the timer which is NOT started can be initialized + */ + if ((InstancePtr->IsStartedTmrCtr0 == XIL_COMPONENT_IS_STARTED)) { + TmrCtrLowIndex = 1; + } else if ((InstancePtr->IsStartedTmrCtr1 == XIL_COMPONENT_IS_STARTED)) { + TmrCtrHighIndex = 1; + } else { + InstancePtr->IsStartedTmrCtr0 = 0; + InstancePtr->IsStartedTmrCtr1 = 0; + } + + + + /* + * Lookup the device configuration in the temporary CROM table. Use this + * configuration info down below when initializing this component. + */ + TmrCtrConfigPtr = XTmrCtr_LookupConfig(DeviceId); + + if (TmrCtrConfigPtr == (XTmrCtr_Config *) NULL) { + return XST_DEVICE_NOT_FOUND; + } + + /* + * Set some default values, including setting the callback + * handlers to stubs. + */ + InstancePtr->BaseAddress = TmrCtrConfigPtr->BaseAddress; + InstancePtr->Handler = NULL; + InstancePtr->CallBackRef = NULL; + + /* + * Clear the statistics for this driver + */ + InstancePtr->Stats.Interrupts = 0; + + /* Initialize the registers of each timer/counter in the device */ + + for (TmrCtrNumber = TmrCtrLowIndex; TmrCtrNumber < TmrCtrHighIndex; + TmrCtrNumber++) { + + /* + * Set the Compare register to 0 + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TLR_OFFSET, 0); + /* + * Reset the timer and the interrupt, the reset bit will need to + * be cleared after this + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, + XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK); + /* + * Set the control/status register to complete initialization by + * clearing the reset bit which was just set + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, 0); + } + + /* + * Indicate the instance is ready to use, successfully initialized + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* Starts the specified timer counter of the device such that it starts running. +* The timer counter is reset before it is started and the reset value is +* loaded into the timer counter. +* +* If interrupt mode is specified in the options, it is necessary for the caller +* to connect the interrupt handler of the timer/counter to the interrupt source, +* typically an interrupt controller, and enable the interrupt within the +* interrupt controller. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XTmrCtr_Start(XTmrCtr * InstancePtr, u8 TmrCtrNumber) +{ + u32 ControlStatusReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the current register contents such that only the necessary bits + * of the register are modified in the following operations + */ + ControlStatusReg = XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TCSR_OFFSET); + /* + * Reset the timer counter such that it reloads from the compare + * register and the interrupt is cleared simultaneously, the interrupt + * can only be cleared after reset such that the interrupt condition is + * cleared + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, + XTC_CSR_LOAD_MASK); + + + + /* + * Indicate that the timer is started before enabling it + */ + if (TmrCtrNumber == 0) { + InstancePtr->IsStartedTmrCtr0 = XIL_COMPONENT_IS_STARTED; + } else { + InstancePtr->IsStartedTmrCtr1 = XIL_COMPONENT_IS_STARTED; + } + + + /* + * Remove the reset condition such that the timer counter starts running + * with the value loaded from the compare register + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, + ControlStatusReg | XTC_CSR_ENABLE_TMR_MASK); +} + +/*****************************************************************************/ +/** +* +* Stops the timer counter by disabling it. +* +* It is the callers' responsibility to disconnect the interrupt handler of the +* timer_counter from the interrupt source, typically an interrupt controller, +* and disable the interrupt within the interrupt controller. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XTmrCtr_Stop(XTmrCtr * InstancePtr, u8 TmrCtrNumber) +{ + u32 ControlStatusReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the current register contents + */ + ControlStatusReg = XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TCSR_OFFSET); + /* + * Disable the timer counter such that it's not running + */ + ControlStatusReg &= ~(XTC_CSR_ENABLE_TMR_MASK); + + /* + * Write out the updated value to the actual register. + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, ControlStatusReg); + + /* + * Indicate that the timer is stopped + */ + if (TmrCtrNumber == 0) { + InstancePtr->IsStartedTmrCtr0 = 0; + } else { + InstancePtr->IsStartedTmrCtr1 = 0; + } +} + +/*****************************************************************************/ +/** +* +* Get the current value of the specified timer counter. The timer counter +* may be either incrementing or decrementing based upon the current mode of +* operation. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return The current value for the timer counter. +* +* @note None. +* +******************************************************************************/ +u32 XTmrCtr_GetValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TCR_OFFSET); +} + +/*****************************************************************************/ +/** +* +* Set the reset value for the specified timer counter. This is the value +* that is loaded into the timer counter when it is reset. This value is also +* loaded when the timer counter is started. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param ResetValue contains the value to be used to reset the timer +* counter. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XTmrCtr_SetResetValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber, + u32 ResetValue) +{ + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TLR_OFFSET, ResetValue); +} + +/*****************************************************************************/ +/** +* +* Returns the timer counter value that was captured the last time the external +* capture input was asserted. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return The current capture value for the indicated timer counter. +* +* @note None. +* +*******************************************************************************/ +u32 XTmrCtr_GetCaptureValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber) +{ + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + return XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TLR_OFFSET); +} + +/*****************************************************************************/ +/** +* +* Resets the specified timer counter of the device. A reset causes the timer +* counter to set it's value to the reset value. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XTmrCtr_Reset(XTmrCtr * InstancePtr, u8 TmrCtrNumber) +{ + u32 CounterControlReg; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read current contents of the register so it won't be destroyed + */ + CounterControlReg = XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TCSR_OFFSET); + /* + * Reset the timer by toggling the reset bit in the register + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, + CounterControlReg | XTC_CSR_LOAD_MASK); + + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, CounterControlReg); +} + +/*****************************************************************************/ +/** +* +* Checks if the specified timer counter of the device has expired. In capture +* mode, expired is defined as a capture occurred. In compare mode, expired is +* defined as the timer counter rolled over/under for up/down counting. +* +* When interrupts are enabled, the expiration causes an interrupt. This function +* is typically used to poll a timer counter to determine when it has expired. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return TRUE if the timer has expired, and FALSE otherwise. +* +* @note None. +* +******************************************************************************/ +int XTmrCtr_IsExpired(XTmrCtr * InstancePtr, u8 TmrCtrNumber) +{ + u32 CounterControlReg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Check if timer is expired + */ + CounterControlReg = XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TCSR_OFFSET); + + return ((CounterControlReg & XTC_CSR_INT_OCCURED_MASK) == + XTC_CSR_INT_OCCURED_MASK); +} + +/***************************************************************************** +* +* Looks up the device configuration based on the unique device ID. The table +* TmrCtrConfigTable contains the configuration info for each device in the +* system. +* +* @param DeviceId is the unique device ID to search for in the config +* table. +* +* @return A pointer to the configuration that matches the given device ID, +* or NULL if no match is found. +* +* @note None. +* +******************************************************************************/ +XTmrCtr_Config *XTmrCtr_LookupConfig(u16 DeviceId) +{ + XTmrCtr_Config *CfgPtr = NULL; + int Index; + + for (Index = 0; Index < XPAR_XTMRCTR_NUM_INSTANCES; Index++) { + if (XTmrCtr_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XTmrCtr_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr.h new file mode 100755 index 000000000..3ae480077 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr.h @@ -0,0 +1,309 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr.h +* +* The Xilinx timer/counter component. This component supports the Xilinx +* timer/counter. More detailed description of the driver operation can +* be found in the xtmrctr.c file. +* +* The Xilinx timer/counter supports the following features: +* - Polled mode. +* - Interrupt driven mode +* - enabling and disabling specific timers +* - PWM operation +* - Cascade Operation (This is to be used for getting a 64 bit timer and this +* feature is present in the latest versions of the axi_timer IP) +* +* The driver does not currently support the PWM operation of the device. +* +* The timer counter operates in 2 primary modes, compare and capture. In +* either mode, the timer counter may count up or down, with up being the +* default. +* +* Compare mode is typically used for creating a single time period or multiple +* repeating time periods in the auto reload mode, such as a periodic interrupt. +* When started, the timer counter loads an initial value, referred to as the +* compare value, into the timer counter and starts counting down or up. The +* timer counter expires when it rolls over/under depending upon the mode of +* counting. An external compare output signal may be configured such that a +* pulse is generated with this signal when it hits the compare value. +* +* Capture mode is typically used for measuring the time period between +* external events. This mode uses an external capture input signal to cause +* the value of the timer counter to be captured. When started, the timer +* counter loads an initial value, referred to as the compare value, + +* The timer can be configured to either cause an interrupt when the count +* reaches the compare value in compare mode or latch the current count +* value in the capture register when an external input is asserted +* in capture mode. The external capture input can be enabled/disabled using the +* XTmrCtr_SetOptions function. While in compare mode, it is also possible to +* drive an external output when the compare value is reached in the count +* register The external compare output can be enabled/disabled using the +* XTmrCtr_SetOptions function. +* +* <b>Interrupts</b> +* +* It is the responsibility of the application to connect the interrupt +* handler of the timer/counter to the interrupt source. The interrupt +* handler function, XTmrCtr_InterruptHandler, is visible such that the user +* can connect it to the interrupt source. Note that this interrupt handler +* does not provide interrupt context save and restore processing, the user +* must perform this processing. +* +* The driver services interrupts and passes timeouts to the upper layer +* software through callback functions. The upper layer software must register +* its callback functions during initialization. The driver requires callback +* functions for timers. +* +* @note +* The default settings for the timers are: +* - Interrupt generation disabled +* - Count up mode +* - Compare mode +* - Hold counter (will not reload the timer) +* - External compare output disabled +* - External capture input disabled +* - Pulse width modulation disabled +* - Timer disabled, waits for Start function to be called +* <br><br> +* A timer counter device may contain multiple timer counters. The symbol +* XTC_DEVICE_TIMER_COUNT defines the number of timer counters in the device. +* The device currently contains 2 timer counters. +* <br><br> +* This driver is intended to be RTOS and processor independent. It works with +* physical addresses only. Any needs for dynamic memory management, threads +* or thread mutual exclusion, virtual memory, or cache control must be +* satisfied by the layer above this driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00a ecm 08/16/01 First release +* 1.00b jhl 02/21/02 Repartitioned the driver for smaller files +* 1.10b mta 03/21/07 Updated to new coding style. +* 1.11a sdm 08/22/08 Removed support for static interrupt handlers from the MDD +* file +* 2.00a ktn 10/30/09 Updated to use HAL API's. _m is removed from all the macro +* definitions. +* 2.01a ktn 07/12/10 Renamed the macro XTimerCtr_ReadReg as XTmrCtr_ReadReg +* for naming consistency (CR 559142). +* 2.02a sdm 09/28/10 Updated the driver tcl to generate the xparameters +* for the timer clock frequency (CR 572679). +* 2.03a rvo 11/30/10 Added check to see if interrupt is enabled before further +* processing for CR 584557. +* 2.04a sdm 07/12/11 Added support for cascade mode operation. +* The cascade mode of operation is present in the latest +* versions of the axi_timer IP. Please check the HW +* Datasheet to see whether this feature is present in the +* version of the IP that you are using. +* 2.05a adk 15/05/13 Fixed the CR:693066 +* Added the IsStartedTmrCtr0/IsStartedTmrCtr1 members to the +* XTmrCtr instance structure. +* The IsStartedTmrCtrX will be assigned XIL_COMPONENT_IS_STARTED in +* the XTmrCtr_Start function. +* The IsStartedTmrCtrX will be cleared in the XTmrCtr_Stop function. +* There will be no Initialization done in the +* XTmrCtr_Initialize if both the timers have already started and +* the XST_DEVICE_IS_STARTED Status is returned. +* Removed the logic in the XTmrCtr_Initialize function +* which was checking the Register Value to know whether +* a timer has started or not. +* </pre> +* +******************************************************************************/ + +#ifndef XTMRCTR_H /* prevent circular inclusions */ +#define XTMRCTR_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xtmrctr_l.h" + +/************************** Constant Definitions *****************************/ + +/** + * @name Configuration options + * These options are used in XTmrCtr_SetOptions() and XTmrCtr_GetOptions() + * @{ + */ +/** + * Used to configure the timer counter device. + * <pre> + * XTC_CASCADE_MODE_OPTION Enables the Cascade Mode only valid for TCSRO. + * XTC_ENABLE_ALL_OPTION Enables all timer counters at once. + * XTC_DOWN_COUNT_OPTION Configures the timer counter to count down from + * start value, the default is to count up. + * XTC_CAPTURE_MODE_OPTION Configures the timer to capture the timer + * counter value when the external capture line is + * asserted. The default mode is compare mode. + * XTC_INT_MODE_OPTION Enables the timer counter interrupt output. + * XTC_AUTO_RELOAD_OPTION In compare mode, configures the timer counter to + * reload from the compare value. The default mode + * causes the timer counter to hold when the + * compare value is hit. + * In capture mode, configures the timer counter to + * not hold the previous capture value if a new + * event occurs. The default mode cause the timer + * counter to hold the capture value until + * recognized. + * XTC_EXT_COMPARE_OPTION Enables the external compare output signal. + * </pre> + */ +#define XTC_CASCADE_MODE_OPTION 0x00000080UL +#define XTC_ENABLE_ALL_OPTION 0x00000040UL +#define XTC_DOWN_COUNT_OPTION 0x00000020UL +#define XTC_CAPTURE_MODE_OPTION 0x00000010UL +#define XTC_INT_MODE_OPTION 0x00000008UL +#define XTC_AUTO_RELOAD_OPTION 0x00000004UL +#define XTC_EXT_COMPARE_OPTION 0x00000002UL +/*@}*/ + +/**************************** Type Definitions *******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress;/**< Register base address */ +} XTmrCtr_Config; + +/** + * Signature for the callback function. + * + * @param CallBackRef is a callback reference passed in by the upper layer + * when setting the callback functions, and passed back to the + * upper layer when the callback is invoked. Its type is + * unimportant to the driver, so it is a void pointer. + * @param TmrCtrNumber is the number of the timer/counter within the + * device. The device typically contains at least two + * timer/counters. The timer number is a zero based number with a + * range of 0 to (XTC_DEVICE_TIMER_COUNT - 1). + */ +typedef void (*XTmrCtr_Handler) (void *CallBackRef, u8 TmrCtrNumber); + + +/** + * Timer/Counter statistics + */ +typedef struct { + u32 Interrupts; /**< The number of interrupts that have occurred */ +} XTmrCtrStats; + +/** + * The XTmrCtr driver instance data. The user is required to allocate a + * variable of this type for every timer/counter device in the system. A + * pointer to a variable of this type is then passed to the driver API + * functions. + */ +typedef struct { + XTmrCtrStats Stats; /**< Component Statistics */ + u32 BaseAddress; /**< Base address of registers */ + u32 IsReady; /**< Device is initialized and ready */ + u32 IsStartedTmrCtr0; /**< Is Timer Counter 0 started */ + u32 IsStartedTmrCtr1; /**< Is Timer Counter 1 started */ + + XTmrCtr_Handler Handler; /**< Callback function */ + void *CallBackRef; /**< Callback reference for handler */ +} XTmrCtr; + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + +/* + * Required functions, in file xtmrctr.c + */ +int XTmrCtr_Initialize(XTmrCtr * InstancePtr, u16 DeviceId); +void XTmrCtr_Start(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +void XTmrCtr_Stop(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +u32 XTmrCtr_GetValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +void XTmrCtr_SetResetValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber, + u32 ResetValue); +u32 XTmrCtr_GetCaptureValue(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +int XTmrCtr_IsExpired(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +void XTmrCtr_Reset(XTmrCtr * InstancePtr, u8 TmrCtrNumber); +XTmrCtr_Config *XTmrCtr_LookupConfig(u16 DeviceId); + +/* + * Functions for options, in file xtmrctr_options.c + */ +void XTmrCtr_SetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber, u32 Options); +u32 XTmrCtr_GetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber); + +/* + * Functions for statistics, in file xtmrctr_stats.c + */ +void XTmrCtr_GetStats(XTmrCtr * InstancePtr, XTmrCtrStats * StatsPtr); +void XTmrCtr_ClearStats(XTmrCtr * InstancePtr); + +/* + * Functions for self-test, in file xtmrctr_selftest.c + */ +int XTmrCtr_SelfTest(XTmrCtr * InstancePtr, u8 TmrCtrNumber); + +/* + * Functions for interrupts, in file xtmrctr_intr.c + */ +void XTmrCtr_SetHandler(XTmrCtr * InstancePtr, XTmrCtr_Handler FuncPtr, + void *CallBackRef); +void XTmrCtr_InterruptHandler(void *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_g.c new file mode 100644 index 000000000..bf05e9206 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_g.c @@ -0,0 +1,30 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xtmrctr.h" + +/* +* The configuration table for devices +*/ + +XTmrCtr_Config XTmrCtr_ConfigTable[] = +{ + { + XPAR_AXI_TIMER_0_DEVICE_ID, + XPAR_AXI_TIMER_0_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_i.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_i.h new file mode 100755 index 000000000..bcdb900d3 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_i.h @@ -0,0 +1,88 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_i.h +* +* This file contains data which is shared between files internal to the +* XTmrCtr component. It is intended for internal use only. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 02/06/02 First release +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 _m is removed from all the macro definitions. +* </pre> +* +******************************************************************************/ + +#ifndef XTMRCTR_I_H /* prevent circular inclusions */ +#define XTMRCTR_I_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" + +/************************** Constant Definitions *****************************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + +extern XTmrCtr_Config XTmrCtr_ConfigTable[]; + +extern u8 XTmrCtr_Offsets[]; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_intr.c new file mode 100755 index 000000000..5b8b94cf2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_intr.c @@ -0,0 +1,239 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_intr.c +* +* Contains interrupt-related functions for the XTmrCtr component. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 02/06/02 First release +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 Updated to use HAL API's. _m is removed from all the macro +* definitions. +* 2.03a rvo 11/30/10 Added check to see if interrupt is enabled before further +* processing for CR 584557. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xtmrctr.h" + + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Sets the timer callback function, which the driver calls when the specified +* timer times out. +* +* @param InstancePtr is a pointer to the XTmrCtr instance . +* @param CallBackRef is the upper layer callback reference passed back +* when the callback function is invoked. +* @param FuncPtr is the pointer to the callback function. +* +* @return None. +* +* @note +* +* The handler is called within interrupt context so the function that is +* called should either be short or pass the more extensive processing off +* to another task to allow the interrupt to return and normal processing +* to continue. +* +******************************************************************************/ +void XTmrCtr_SetHandler(XTmrCtr * InstancePtr, XTmrCtr_Handler FuncPtr, + void *CallBackRef) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FuncPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + InstancePtr->Handler = FuncPtr; + InstancePtr->CallBackRef = CallBackRef; +} + +/*****************************************************************************/ +/** +* +* Interrupt Service Routine (ISR) for the driver. This function only performs +* processing for the device and does not save and restore the interrupt context. +* +* @param InstancePtr contains a pointer to the timer/counter instance for +* the interrupt. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XTmrCtr_InterruptHandler(void *InstancePtr) +{ + XTmrCtr *TmrCtrPtr = NULL; + u8 TmrCtrNumber; + u32 ControlStatusReg; + + /* + * Verify that each of the inputs are valid. + */ + Xil_AssertVoid(InstancePtr != NULL); + + /* + * Convert the non-typed pointer to an timer/counter instance pointer + * such that there is access to the timer/counter + */ + TmrCtrPtr = (XTmrCtr *) InstancePtr; + + /* + * Loop thru each timer counter in the device and call the callback + * function for each timer which has caused an interrupt + */ + for (TmrCtrNumber = 0; + TmrCtrNumber < XTC_DEVICE_TIMER_COUNT; TmrCtrNumber++) { + + ControlStatusReg = XTmrCtr_ReadReg(TmrCtrPtr->BaseAddress, + TmrCtrNumber, + XTC_TCSR_OFFSET); + /* + * Check if interrupt is enabled + */ + if (ControlStatusReg & XTC_CSR_ENABLE_INT_MASK) { + + /* + * Check if timer expired and interrupt occured + */ + if (ControlStatusReg & XTC_CSR_INT_OCCURED_MASK) { + /* + * Increment statistics for the number of + * interrupts and call the callback to handle + * any application specific processing + */ + TmrCtrPtr->Stats.Interrupts++; + TmrCtrPtr->Handler(TmrCtrPtr->CallBackRef, + TmrCtrNumber); + /* + * Read the new Control/Status Register content. + */ + ControlStatusReg = + XTmrCtr_ReadReg(TmrCtrPtr->BaseAddress, + TmrCtrNumber, + XTC_TCSR_OFFSET); + /* + * If in compare mode and a single shot rather + * than auto reload mode then disable the timer + * and reset it such so that the interrupt can + * be acknowledged, this should be only temporary + * till the hardware is fixed + */ + if (((ControlStatusReg & + XTC_CSR_AUTO_RELOAD_MASK) == 0) && + ((ControlStatusReg & + XTC_CSR_CAPTURE_MODE_MASK)== 0)) { + /* + * Disable the timer counter and + * reset it such that the timer + * counter is loaded with the + * reset value allowing the + * interrupt to be acknowledged + */ + ControlStatusReg &= + ~XTC_CSR_ENABLE_TMR_MASK; + + XTmrCtr_WriteReg( + TmrCtrPtr->BaseAddress, + TmrCtrNumber, + XTC_TCSR_OFFSET, + ControlStatusReg | + XTC_CSR_LOAD_MASK); + + /* + * Clear the reset condition, + * the reset bit must be + * manually cleared by a 2nd write + * to the register + */ + XTmrCtr_WriteReg( + TmrCtrPtr->BaseAddress, + TmrCtrNumber, + XTC_TCSR_OFFSET, + ControlStatusReg); + } + + /* + * Acknowledge the interrupt by clearing the + * interrupt bit in the timer control status + * register, this is done after calling the + * handler so the application could call + * IsExpired, the interrupt is cleared by + * writing a 1 to the interrupt bit of the + * register without changing any of the other + * bits + */ + XTmrCtr_WriteReg(TmrCtrPtr->BaseAddress, + TmrCtrNumber, + XTC_TCSR_OFFSET, + ControlStatusReg | + XTC_CSR_INT_OCCURED_MASK); + } + } + } +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_l.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_l.c new file mode 100755 index 000000000..766a0bd40 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_l.c @@ -0,0 +1,85 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_l.c +* +* This file contains low-level driver functions that can be used to access the +* device. The user should refer to the hardware device specification for more +* details of the device operation. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 04/24/02 First release +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 Updated to use HAL API's +* </pre> +* +******************************************************************************/ + + +/***************************** Include Files *********************************/ + +#include "xtmrctr_l.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + +/* The following table contains the offset from the base address of a timer + * counter device for each timer counter. A single device may contain multiple + * timer counters and the functions specify which one to operate on. + */ +u8 XTmrCtr_Offsets[] = { 0, XTC_TIMER_COUNTER_OFFSET }; diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_l.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_l.h new file mode 100755 index 000000000..f92652035 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_l.h @@ -0,0 +1,435 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_l.h +* +* This header file contains identifiers and low-level driver functions (or +* macros) that can be used to access the device. The user should refer to the +* hardware device specification for more details of the device operation. +* High-level driver functions are defined in xtmrctr.h. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 04/24/02 First release +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 Updated to use HAL API's. _m is removed from all the macro +* definitions. +* 2.01a ktn 07/12/10 Renamed the macro XTimerCtr_ReadReg as XTmrCtr_ReadReg +* for naming consistency (CR 559142). +* 2.04a sdm 07/12/11 Added the CASC mode bit in the TCSRO register for the +* cascade mode operation. +* The cascade mode of operation is present in the latest +* versions of the axi_timer IP. Please check the HW +* Datasheet to see whether this feature is present in the +* version of the IP that you are using. +* </pre> +* +******************************************************************************/ + +#ifndef XTMRCTR_L_H /* prevent circular inclusions */ +#define XTMRCTR_L_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** + * Defines the number of timer counters within a single hardware device. This + * number is not currently parameterized in the hardware but may be in the + * future. + */ +#define XTC_DEVICE_TIMER_COUNT 2 + +/* Each timer counter consumes 16 bytes of address space */ + +#define XTC_TIMER_COUNTER_OFFSET 16 + +/** @name Register Offset Definitions + * Register offsets within a timer counter, there are multiple + * timer counters within a single device + * @{ + */ + +#define XTC_TCSR_OFFSET 0 /**< Control/Status register */ +#define XTC_TLR_OFFSET 4 /**< Load register */ +#define XTC_TCR_OFFSET 8 /**< Timer counter register */ + +/* @} */ + +/** @name Control Status Register Bit Definitions + * Control Status Register bit masks + * Used to configure the timer counter device. + * @{ + */ + +#define XTC_CSR_CASC_MASK 0x00000800 /**< Cascade Mode */ +#define XTC_CSR_ENABLE_ALL_MASK 0x00000400 /**< Enables all timer + counters */ +#define XTC_CSR_ENABLE_PWM_MASK 0x00000200 /**< Enables the Pulse Width + Modulation */ +#define XTC_CSR_INT_OCCURED_MASK 0x00000100 /**< If bit is set, an + interrupt has occured. + If set and '1' is + written to this bit + position, bit is + cleared. */ +#define XTC_CSR_ENABLE_TMR_MASK 0x00000080 /**< Enables only the + specific timer */ +#define XTC_CSR_ENABLE_INT_MASK 0x00000040 /**< Enables the interrupt + output. */ +#define XTC_CSR_LOAD_MASK 0x00000020 /**< Loads the timer using + the load value provided + earlier in the Load + Register, + XTC_TLR_OFFSET. */ +#define XTC_CSR_AUTO_RELOAD_MASK 0x00000010 /**< In compare mode, + configures + the timer counter to + reload from the + Load Register. The + default mode + causes the timer counter + to hold when the compare + value is hit. In capture + mode, configures the + timer counter to not + hold the previous + capture value if a new + event occurs. The + default mode cause the + timer counter to hold + the capture value until + recognized. */ +#define XTC_CSR_EXT_CAPTURE_MASK 0x00000008 /**< Enables the + external input + to the timer counter. */ +#define XTC_CSR_EXT_GENERATE_MASK 0x00000004 /**< Enables the + external generate output + for the timer. */ +#define XTC_CSR_DOWN_COUNT_MASK 0x00000002 /**< Configures the timer + counter to count down + from start value, the + default is to count + up.*/ +#define XTC_CSR_CAPTURE_MODE_MASK 0x00000001 /**< Enables the timer to + capture the timer + counter value when the + external capture line is + asserted. The default + mode is compare mode.*/ +/* @} */ + +/**************************** Type Definitions *******************************/ + +extern u8 XTmrCtr_Offsets[]; + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** +* Read one of the timer counter registers. +* +* @param BaseAddress contains the base address of the timer counter +* device. +* @param TmrCtrNumber contains the specific timer counter within the +* device, a zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param RegOffset contains the offset from the 1st register of the timer +* counter to select the specific register of the timer counter. +* +* @return The value read from the register, a 32 bit value. +* +* @note C-Style signature: +* u32 XTmrCtr_ReadReg(u32 BaseAddress, u8 TimerNumber, + unsigned RegOffset); +******************************************************************************/ +#define XTmrCtr_ReadReg(BaseAddress, TmrCtrNumber, RegOffset) \ + Xil_In32((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + \ + (RegOffset)) + +#ifndef XTimerCtr_ReadReg +#define XTimerCtr_ReadReg XTmrCtr_ReadReg +#endif + +/*****************************************************************************/ +/** +* Write a specified value to a register of a timer counter. +* +* @param BaseAddress is the base address of the timer counter device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param RegOffset contain the offset from the 1st register of the timer +* counter to select the specific register of the timer counter. +* @param ValueToWrite is the 32 bit value to be written to the register. +* +* @note C-Style signature: +* void XTmrCtr_WriteReg(u32 BaseAddress, u8 TimerNumber, +* unsigned RegOffset, u32 ValueToWrite); +******************************************************************************/ +#define XTmrCtr_WriteReg(BaseAddress, TmrCtrNumber, RegOffset, ValueToWrite)\ + Xil_Out32(((BaseAddress) + XTmrCtr_Offsets[(TmrCtrNumber)] + \ + (RegOffset)), (ValueToWrite)) + +/****************************************************************************/ +/** +* +* Set the Control Status Register of a timer counter to the specified value. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param RegisterValue is the 32 bit value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_SetControlStatusReg(u32 BaseAddress, +* u8 TmrCtrNumber,u32 RegisterValue); +*****************************************************************************/ +#define XTmrCtr_SetControlStatusReg(BaseAddress, TmrCtrNumber, RegisterValue)\ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the Control Status Register of a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, +* a zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return The value read from the register, a 32 bit value. +* +* @note C-Style signature: +* u32 XTmrCtr_GetControlStatusReg(u32 BaseAddress, +* u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_GetControlStatusReg(BaseAddress, TmrCtrNumber) \ + XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET) + +/****************************************************************************/ +/** +* +* Get the Timer Counter Register of a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, +* a zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return The value read from the register, a 32 bit value. +* +* @note C-Style signature: +* u32 XTmrCtr_GetTimerCounterReg(u32 BaseAddress, +* u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_GetTimerCounterReg(BaseAddress, TmrCtrNumber) \ + XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), XTC_TCR_OFFSET) \ + +/****************************************************************************/ +/** +* +* Set the Load Register of a timer counter to the specified value. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param RegisterValue is the 32 bit value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_SetLoadReg(u32 BaseAddress, u8 TmrCtrNumber, +* u32 RegisterValue); +*****************************************************************************/ +#define XTmrCtr_SetLoadReg(BaseAddress, TmrCtrNumber, RegisterValue) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TLR_OFFSET, \ + (RegisterValue)) + +/****************************************************************************/ +/** +* +* Get the Load Register of a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return The value read from the register, a 32 bit value. +* +* @note C-Style signature: +* u32 XTmrCtr_GetLoadReg(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_GetLoadReg(BaseAddress, TmrCtrNumber) \ +XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), XTC_TLR_OFFSET) + +/****************************************************************************/ +/** +* +* Enable a timer counter such that it starts running. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_Enable(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_Enable(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), ( TmrCtrNumber), \ + XTC_TCSR_OFFSET) | XTC_CSR_ENABLE_TMR_MASK)) + +/****************************************************************************/ +/** +* +* Disable a timer counter such that it stops running. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, +* a zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_Disable(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_Disable(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber),\ + XTC_TCSR_OFFSET) & ~ XTC_CSR_ENABLE_TMR_MASK)) + +/****************************************************************************/ +/** +* +* Enable the interrupt for a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_EnableIntr(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_EnableIntr(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), \ + XTC_TCSR_OFFSET) | XTC_CSR_ENABLE_INT_MASK)) + +/****************************************************************************/ +/** +* +* Disable the interrupt for a timer counter. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_DisableIntr(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_DisableIntr(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), \ + XTC_TCSR_OFFSET) & ~ XTC_CSR_ENABLE_INT_MASK)) + +/****************************************************************************/ +/** +* +* Cause the timer counter to load it's Timer Counter Register with the value +* in the Load Register. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return None. +* +* @note C-Style signature: +* void XTmrCtr_LoadTimerCounterReg(u32 BaseAddress, + u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_LoadTimerCounterReg(BaseAddress, TmrCtrNumber) \ + XTmrCtr_WriteReg((BaseAddress), (TmrCtrNumber), XTC_TCSR_OFFSET, \ + (XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber),\ + XTC_TCSR_OFFSET) | XTC_CSR_LOAD_MASK)) + +/****************************************************************************/ +/** +* +* Determine if a timer counter event has occurred. Events are defined to be +* when a capture has occurred or the counter has roller over. +* +* @param BaseAddress is the base address of the device. +* @param TmrCtrNumber is the specific timer counter within the device, a +* zero based number, 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @note C-Style signature: +* int XTmrCtr_HasEventOccurred(u32 BaseAddress, u8 TmrCtrNumber); +*****************************************************************************/ +#define XTmrCtr_HasEventOccurred(BaseAddress, TmrCtrNumber) \ + ((XTmrCtr_ReadReg((BaseAddress), (TmrCtrNumber), \ + XTC_TCSR_OFFSET) & XTC_CSR_INT_OCCURED_MASK) == \ + XTC_CSR_INT_OCCURED_MASK) + +/************************** Function Prototypes ******************************/ +/************************** Variable Definitions *****************************/ +#ifdef __cplusplus +} +#endif +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_options.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_options.c new file mode 100755 index 000000000..c070f27ca --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_options.c @@ -0,0 +1,223 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_options.c +* +* Contains configuration options functions for the XTmrCtr component. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 02/06/02 First release +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 Updated to use HAL API's. _m is removed from all the macro +* definitions. +* 2.04a sdm 07/12/11 Added support for the cascade mode operation. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xtmrctr.h" +#include "xtmrctr_i.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + +/* + * The following data type maps an option to a register mask such that getting + * and setting the options may be table driven. + */ +typedef struct { + u32 Option; + u32 Mask; +} Mapping; + +/* + * Create the table which contains options which are to be processed to get/set + * the options. These options are table driven to allow easy maintenance and + * expansion of the options. + */ +static Mapping OptionsTable[] = { + {XTC_CASCADE_MODE_OPTION, XTC_CSR_CASC_MASK}, + {XTC_ENABLE_ALL_OPTION, XTC_CSR_ENABLE_ALL_MASK}, + {XTC_DOWN_COUNT_OPTION, XTC_CSR_DOWN_COUNT_MASK}, + {XTC_CAPTURE_MODE_OPTION, XTC_CSR_CAPTURE_MODE_MASK | + XTC_CSR_EXT_CAPTURE_MASK}, + {XTC_INT_MODE_OPTION, XTC_CSR_ENABLE_INT_MASK}, + {XTC_AUTO_RELOAD_OPTION, XTC_CSR_AUTO_RELOAD_MASK}, + {XTC_EXT_COMPARE_OPTION, XTC_CSR_EXT_GENERATE_MASK} +}; + +/* Create a constant for the number of entries in the table */ + +#define XTC_NUM_OPTIONS (sizeof(OptionsTable) / sizeof(Mapping)) + +/*****************************************************************************/ +/** +* +* Enables the specified options for the specified timer counter. This function +* sets the options without regard to the current options of the driver. To +* prevent a loss of the current options, the user should call +* XTmrCtr_GetOptions() prior to this function and modify the retrieved options +* to pass into this function to prevent loss of the current options. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* @param Options contains the desired options to be set or cleared. +* Setting the option to '1' enables the option, clearing the to +* '0' disables the option. The options are bit masks such that +* multiple options may be set or cleared. The options are +* described in xtmrctr.h. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XTmrCtr_SetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber, u32 Options) +{ + u32 CounterControlReg = 0; + u32 Index; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Loop through the Options table, turning the enable on or off + * depending on whether the bit is set in the incoming Options flag. + */ + + for (Index = 0; Index < XTC_NUM_OPTIONS; Index++) { + if (Options & OptionsTable[Index].Option) { + + /* + * Turn the option on + */ + CounterControlReg |= OptionsTable[Index].Mask; + } + else { + /* + * Turn the option off + */ + CounterControlReg &= ~OptionsTable[Index].Mask; + } + } + + /* + * Write out the updated value to the actual register + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, CounterControlReg); +} + +/*****************************************************************************/ +/** +* +* Get the options for the specified timer counter. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return +* +* The currently set options. An option which is set to a '1' is enabled and +* set to a '0' is disabled. The options are bit masks such that multiple +* options may be set or cleared. The options are described in xtmrctr.h. +* +* @note None. +* +******************************************************************************/ +u32 XTmrCtr_GetOptions(XTmrCtr * InstancePtr, u8 TmrCtrNumber) +{ + + u32 Options = 0; + u32 CounterControlReg; + u32 Index; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the current contents of the control status register to allow + * the current options to be determined + */ + CounterControlReg = XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TCSR_OFFSET); + /* + * Loop through the Options table, turning the enable on or off + * depending on whether the bit is set in the current register settings. + */ + for (Index = 0; Index < XTC_NUM_OPTIONS; Index++) { + if (CounterControlReg & OptionsTable[Index].Mask) { + Options |= OptionsTable[Index].Option; /* turn it on */ + } + else { + Options &= ~OptionsTable[Index].Option; /* turn it off */ + } + } + + return Options; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_selftest.c new file mode 100755 index 000000000..964bd54ac --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_selftest.c @@ -0,0 +1,172 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_selftest.c +* +* Contains diagnostic/self-test functions for the XTmrCtr component. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 02/06/02 First release +* 1.10b mta 03/21/07 Updated to new coding style +* 2.00a ktn 10/30/09 Updated to use HAL API's. _m is removed from all the macro +* definitions. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xil_io.h" +#include "xtmrctr.h" +#include "xtmrctr_i.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Runs a self-test on the driver/device. This test verifies that the specified +* timer counter of the device can be enabled and increments. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param TmrCtrNumber is the timer counter of the device to operate on. +* Each device may contain multiple timer counters. The timer +* number is a zero based number with a range of +* 0 - (XTC_DEVICE_TIMER_COUNT - 1). +* +* @return +* - XST_SUCCESS if self-test was successful +* - XST_FAILURE if the timer is not incrementing. +* +* @note +* +* This is a destructive test using the provided timer. The current settings +* of the timer are returned to the initialized values and all settings at the +* time this function is called are overwritten. +* +******************************************************************************/ +int XTmrCtr_SelfTest(XTmrCtr * InstancePtr, u8 TmrCtrNumber) +{ + u32 TimerCount1 = 0; + u32 TimerCount2 = 0; + u16 Count = 0; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(TmrCtrNumber < XTC_DEVICE_TIMER_COUNT); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Set the Capture register to 0 + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TLR_OFFSET, 0); + + /* + * Reset the timer and the interrupt + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, + XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK); + + /* + * Set the control/status register to enable timer + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, XTC_CSR_ENABLE_TMR_MASK); + + /* + * Read the timer + */ + TimerCount1 = XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TCR_OFFSET); + /* + * Make sure timer is incrementing if the Count rolls over to zero + * and the timer still has not incremented an error is returned + */ + + do { + TimerCount2 = XTmrCtr_ReadReg(InstancePtr->BaseAddress, + TmrCtrNumber, XTC_TCR_OFFSET); + Count++; + } + while ((TimerCount1 == TimerCount2) && (Count != 0)); + + /* + * Reset the timer and the interrupt + */ + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, + XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK); + + /* + * Set the control/status register to 0 to complete initialization + * this disables the timer completely and allows it to be used again + */ + + XTmrCtr_WriteReg(InstancePtr->BaseAddress, TmrCtrNumber, + XTC_TCSR_OFFSET, 0); + + if (TimerCount1 == TimerCount2) { + return XST_FAILURE; + } + else { + return XST_SUCCESS; + } +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_stats.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_stats.c new file mode 100755 index 000000000..fc0da5f1b --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/tmrctr_v2_05_a/src/xtmrctr_stats.c @@ -0,0 +1,121 @@ +/****************************************************************************** +* +* (c) Copyright 2002-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xtmrctr_stats.c +* +* Contains function to get and clear statistics for the XTmrCtr component. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ---- -------- ----------------------------------------------- +* 1.00b jhl 02/06/02 First release. +* 1.10b mta 03/21/07 Updated for new coding style. +* 2.00a ktn 10/30/09 Updated to use HAL API's. +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xtmrctr.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + + +/*****************************************************************************/ +/** +* +* Get a copy of the XTmrCtrStats structure, which contains the current +* statistics for this driver. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* @param StatsPtr is a pointer to a XTmrCtrStats structure which will get +* a copy of current statistics. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XTmrCtr_GetStats(XTmrCtr * InstancePtr, XTmrCtrStats * StatsPtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(StatsPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + StatsPtr->Interrupts = InstancePtr->Stats.Interrupts; +} + +/*****************************************************************************/ +/** +* +* Clear the XTmrCtrStats structure for this driver. +* +* @param InstancePtr is a pointer to the XTmrCtr instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XTmrCtr_ClearStats(XTmrCtr * InstancePtr) +{ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + InstancePtr->Stats.Interrupts = 0; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/Makefile new file mode 100755 index 000000000..7d608cdae --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xuartps_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling uartps" + +xuartps_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xuartps_includes + +xuartps_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps.c new file mode 100755 index 000000000..ff89c9456 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps.c @@ -0,0 +1,673 @@ +/***************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps.c +* +* This file contains the implementation of the interface functions for XUartPs +* driver. Refer to the header file xuartps.h for more detailed information. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00 drg/jz 01/13/10 First Release +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xstatus.h" +#include "xuartps.h" +#include "xil_io.h" + +/************************** Constant Definitions ****************************/ + +/* The following constant defines the amount of error that is allowed for + * a specified baud rate. This error is the difference between the actual + * baud rate that will be generated using the specified clock and the + * desired baud rate. + */ +#define XUARTPS_MAX_BAUD_ERROR_RATE 3 /* max % error allowed */ + +/**************************** Type Definitions ******************************/ + + +/***************** Macros (Inline Functions) Definitions ********************/ + + +/************************** Function Prototypes *****************************/ + +static void XUartPs_StubHandler(void *CallBackRef, u32 Event, + unsigned int ByteCount); + +unsigned int XUartPs_SendBuffer(XUartPs *InstancePtr); + +unsigned int XUartPs_ReceiveBuffer(XUartPs *InstancePtr); + +/************************** Variable Definitions ****************************/ + +/****************************************************************************/ +/** +* +* Initializes a specific XUartPs instance such that it is ready to be used. +* The data format of the device is setup for 8 data bits, 1 stop bit, and no +* parity by default. The baud rate is set to a default value specified by +* Config->DefaultBaudRate if set, otherwise it is set to 19.2K baud. The +* receive FIFO threshold is set for 8 bytes. The default operating mode of the +* driver is polled mode. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param Config is a reference to a structure containing information +* about a specific XUartPs driver. +* @param EffectiveAddr is the device base address in the virtual memory +* address space. The caller is responsible for keeping the address +* mapping from EffectiveAddr to the device physical base address +* unchanged once this function is invoked. Unexpected errors may +* occur if the address mapping changes after this function is +* called. If address translation is not used, pass in the physical +* address instead. +* +* @return +* +* - XST_SUCCESS if initialization was successful +* - XST_UART_BAUD_ERROR if the baud rate is not possible because +* the inputclock frequency is not divisible with an acceptable +* amount of error +* +* @note +* +* The default configuration for the UART after initialization is: +* +* - 19,200 bps or XPAR_DFT_BAUDRATE if defined +* - 8 data bits +* - 1 stop bit +* - no parity +* - FIFO's are enabled with a receive threshold of 8 bytes +* - The RX timeout is enabled with a timeout of 1 (4 char times) +* +* All interrupts are disabled. +* +*****************************************************************************/ +int XUartPs_CfgInitialize(XUartPs *InstancePtr, + XUartPs_Config * Config, u32 EffectiveAddr) +{ + int Status; + u32 ModeRegister; + u32 BaudRate; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(Config != NULL); + + /* + * Setup the driver instance using passed in parameters + */ + InstancePtr->Config.BaseAddress = EffectiveAddr; + InstancePtr->Config.InputClockHz = Config->InputClockHz; + InstancePtr->Config.ModemPinsConnected = Config->ModemPinsConnected; + + /* + * Initialize other instance data to default values + */ + InstancePtr->Handler = XUartPs_StubHandler; + + InstancePtr->SendBuffer.NextBytePtr = NULL; + InstancePtr->SendBuffer.RemainingBytes = 0; + InstancePtr->SendBuffer.RequestedBytes = 0; + + InstancePtr->ReceiveBuffer.NextBytePtr = NULL; + InstancePtr->ReceiveBuffer.RemainingBytes = 0; + InstancePtr->ReceiveBuffer.RequestedBytes = 0; + + /* + * Flag that the driver instance is ready to use + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + /* + * Set the default baud rate here, can be changed prior to + * starting the device + */ + BaudRate = XUARTPS_DFT_BAUDRATE; + Status = XUartPs_SetBaudRate(InstancePtr, BaudRate); + if (Status != XST_SUCCESS) { + InstancePtr->IsReady = 0; + return Status; + } + + /* + * Set up the default data format: 8 bit data, 1 stop bit, no + * parity + */ + ModeRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_MR_OFFSET); + + /* + * Mask off what's already there + */ + ModeRegister &= ~(XUARTPS_MR_CHARLEN_MASK | + XUARTPS_MR_STOPMODE_MASK | + XUARTPS_MR_PARITY_MASK); + + /* + * Set the register value to the desired data format + */ + ModeRegister |= (XUARTPS_MR_CHARLEN_8_BIT | + XUARTPS_MR_STOPMODE_1_BIT | + XUARTPS_MR_PARITY_NONE); + + /* + * Write the mode register out + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_MR_OFFSET, + ModeRegister); + + /* + * Set the RX FIFO trigger at 8 data bytes. + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_RXWM_OFFSET, 0x08); + + /* + * Set the RX timeout to 1, which will be 4 character time + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_RXTOUT_OFFSET, 0x01); + + /* + * Disable all interrupts, polled mode is the default + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IDR_OFFSET, + XUARTPS_IXR_MASK); + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* This functions sends the specified buffer using the device in either +* polled or interrupt driven mode. This function is non-blocking, if the device +* is busy sending data, it will return and indicate zero bytes were sent. +* Otherwise, it fills the TX FIFO as much as it can, and return the number of +* bytes sent. +* +* In a polled mode, this function will only send as much data as TX FIFO can +* buffer. The application may need to call it repeatedly to send the entire +* buffer. +* +* In interrupt mode, this function will start sending the specified buffer, +* then the interrupt handler will continue sending data until the entire +* buffer has been sent. A callback function, as specified by the application, +* will be called to indicate the completion of sending. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param BufferPtr is pointer to a buffer of data to be sent. +* @param NumBytes contains the number of bytes to be sent. A value of +* zero will stop a previous send operation that is in progress +* in interrupt mode. Any data that was already put into the +* transmit FIFO will be sent. +* +* @return The number of bytes actually sent. +* +* @note +* +* The number of bytes is not asserted so that this function may be called with +* a value of zero to stop an operation that is already in progress. +* <br><br> +* +*****************************************************************************/ +unsigned int XUartPs_Send(XUartPs *InstancePtr, u8 *BufferPtr, + unsigned int NumBytes) +{ + unsigned int BytesSent; + + /* + * Asserts validate the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(BufferPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Disable the UART transmit interrupts to allow this call to stop a + * previous operation that may be interrupt driven. + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IDR_OFFSET, + (XUARTPS_IXR_TXEMPTY | XUARTPS_IXR_TXFULL)); + + /* + * Setup the buffer parameters + */ + InstancePtr->SendBuffer.RequestedBytes = NumBytes; + InstancePtr->SendBuffer.RemainingBytes = NumBytes; + InstancePtr->SendBuffer.NextBytePtr = BufferPtr; + + /* + * Transmit interrupts will be enabled in XUartPs_SendBuffer(), after + * filling the TX FIFO. + */ + BytesSent = XUartPs_SendBuffer(InstancePtr); + + return BytesSent; +} + +/****************************************************************************/ +/** +* +* This function attempts to receive a specified number of bytes of data +* from the device and store it into the specified buffer. This function works +* for both polled or interrupt driven modes. It is non-blocking. +* +* In a polled mode, this function will only receive the data already in the +* RX FIFO. The application may need to call it repeatedly to receive the +* entire buffer. Polled mode is the default mode of operation for the device. +* +* In interrupt mode, this function will start the receiving, if not the entire +* buffer has been received, the interrupt handler will continue receiving data +* until the entire buffer has been received. A callback function, as specified +* by the application, will be called to indicate the completion of the +* receiving or error conditions. +* +* @param InstancePtr is a pointer to the XUartPs instance +* @param BufferPtr is pointer to buffer for data to be received into +* @param NumBytes is the number of bytes to be received. A value of zero +* will stop a previous receive operation that is in progress in +* interrupt mode. +* +* @return The number of bytes received. +* +* @note +* +* The number of bytes is not asserted so that this function may be called +* with a value of zero to stop an operation that is already in progress. +* +*****************************************************************************/ +unsigned int XUartPs_Recv(XUartPs *InstancePtr, + u8 *BufferPtr, unsigned int NumBytes) +{ + unsigned int ReceivedCount; + u32 ImrRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(BufferPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Disable all the interrupts. + * This stops a previous operation that may be interrupt driven + */ + ImrRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_IMR_OFFSET); + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IDR_OFFSET, + XUARTPS_IXR_MASK); + + /* + * Setup the buffer parameters + */ + InstancePtr->ReceiveBuffer.RequestedBytes = NumBytes; + InstancePtr->ReceiveBuffer.RemainingBytes = NumBytes; + InstancePtr->ReceiveBuffer.NextBytePtr = BufferPtr; + + /* + * Receive the data from the device + */ + ReceivedCount = XUartPs_ReceiveBuffer(InstancePtr); + + /* + * Restore the interrupt state + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IER_OFFSET, + ImrRegister); + + return ReceivedCount; +} + +/****************************************************************************/ +/* +* +* This function sends a buffer that has been previously specified by setting +* up the instance variables of the instance. This function is an internal +* function for the XUartPs driver such that it may be called from a shell +* function that sets up the buffer or from an interrupt handler. +* +* This function sends the specified buffer in either polled or interrupt +* driven modes. This function is non-blocking. +* +* In a polled mode, this function only sends as much data as the TX FIFO +* can buffer. The application may need to call it repeatedly to send the +* entire buffer. +* +* In interrupt mode, this function starts the sending of the buffer, if not +* the entire buffer has been sent, then the interrupt handler continues the +* sending until the entire buffer has been sent. A callback function, as +* specified by the application, will be called to indicate the completion of +* sending. +* +* @param InstancePtr is a pointer to the XUartPs instance +* +* @return The number of bytes actually sent +* +* @note None. +* +*****************************************************************************/ +unsigned int XUartPs_SendBuffer(XUartPs *InstancePtr) +{ + unsigned int SentCount = 0; + u32 ImrRegister; + + /* + * If the TX FIFO is full, send nothing. + * Otherwise put bytes into the TX FIFO unil it is full, or all of the + * data has been put into the FIFO. + */ + while ((!XUartPs_IsTransmitFull(InstancePtr->Config.BaseAddress)) && + (InstancePtr->SendBuffer.RemainingBytes > SentCount)) { + + /* + * Fill the FIFO from the buffer + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_FIFO_OFFSET, + InstancePtr->SendBuffer. + NextBytePtr[SentCount]); + + /* + * Incriment the send count. + */ + SentCount++; + } + + /* + * Update the buffer to reflect the bytes that were sent from it + */ + InstancePtr->SendBuffer.NextBytePtr += SentCount; + InstancePtr->SendBuffer.RemainingBytes -= SentCount; + + /* + * If interrupts are enabled as indicated by the receive interrupt, then + * enable the TX FIFO empty interrupt, so further action can be taken + * for this sending. + */ + ImrRegister = + XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_IMR_OFFSET); + if ((ImrRegister & XUARTPS_IXR_RXFULL) || + (ImrRegister & XUARTPS_IXR_RXEMPTY) || + (ImrRegister & XUARTPS_IXR_RXOVR)) { + + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_IER_OFFSET, + ImrRegister | XUARTPS_IXR_TXEMPTY); + } + + return SentCount; +} + +/****************************************************************************/ +/* +* +* This function receives a buffer that has been previously specified by setting +* up the instance variables of the instance. This function is an internal +* function, and it may be called from a shell function that sets up the buffer +* or from an interrupt handler. +* +* This function attempts to receive a specified number of bytes from the +* device and store it into the specified buffer. This function works for +* either polled or interrupt driven modes. It is non-blocking. +* +* In polled mode, this function only receives as much data as in the RX FIFO. +* The application may need to call it repeatedly to receive the entire buffer. +* Polled mode is the default mode for the driver. +* +* In interrupt mode, this function starts the receiving, if not the entire +* buffer has been received, the interrupt handler will continue until the +* entire buffer has been received. A callback function, as specified by the +* application, will be called to indicate the completion of the receiving or +* error conditions. +* +* @param InstancePtr is a pointer to the XUartPs instance +* +* @return The number of bytes received. +* +* @note None. +* +*****************************************************************************/ +unsigned int XUartPs_ReceiveBuffer(XUartPs *InstancePtr) +{ + u32 CsrRegister; + unsigned int ReceivedCount = 0; + + /* + * Read the Channel Status Register to determine if there is any data in + * the RX FIFO + */ + CsrRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_SR_OFFSET); + + /* + * Loop until there is no more data in RX FIFO or the specified + * number of bytes has been received + */ + while((ReceivedCount < InstancePtr->ReceiveBuffer.RemainingBytes)&& + (0 == (CsrRegister & XUARTPS_SR_RXEMPTY))){ + + InstancePtr->ReceiveBuffer.NextBytePtr[ReceivedCount] = + XUartPs_ReadReg(InstancePtr->Config. + BaseAddress, + XUARTPS_FIFO_OFFSET); + + ReceivedCount++; + + CsrRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_SR_OFFSET); + } + + /* + * Update the receive buffer to reflect the number of bytes just + * received + */ + InstancePtr->ReceiveBuffer.NextBytePtr += ReceivedCount; + InstancePtr->ReceiveBuffer.RemainingBytes -= ReceivedCount; + + return ReceivedCount; +} + +/*****************************************************************************/ +/** +* +* Sets the baud rate for the device. Checks the input value for +* validity and also verifies that the requested rate can be configured to +* within the maximum error range specified by XUARTPS_MAX_BAUD_ERROR_RATE. +* If the provided rate is not possible, the current setting is unchanged. +* +* @param InstancePtr is a pointer to the XUartPs instance +* @param BaudRate to be set +* +* @return +* - XST_SUCCESS if everything configured as expected +* - XST_UART_BAUD_ERROR if the requested rate is not available +* because there was too much error +* +* @note None. +* +*****************************************************************************/ +int XUartPs_SetBaudRate(XUartPs *InstancePtr, u32 BaudRate) +{ + u8 IterBAUDDIV; /* Iterator for available baud divisor values */ + u32 BRGR_Value; /* Calculated value for baud rate generator */ + u32 CalcBaudRate; /* Calculated baud rate */ + u32 BaudError; /* Diff between calculated and requested baud rate */ + u32 Best_BRGR = 0; /* Best value for baud rate generator */ + u8 Best_BAUDDIV = 0; /* Best value for baud divisor */ + u32 Best_Error = 0xFFFFFFFF; + u32 PercentError; + u32 ModeReg; + u32 InputClk; + + /* + * Asserts validate the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(BaudRate <= XUARTPS_MAX_RATE); + Xil_AssertNonvoid(BaudRate >= XUARTPS_MIN_RATE); + + /* + * Make sure the baud rate is not impossilby large. + * Fastest possible baud rate is Input Clock / 2. + */ + if ((BaudRate * 2) > InstancePtr->Config.InputClockHz) { + return XST_UART_BAUD_ERROR; + } + /* + * Check whether the input clock is divided by 8 + */ + ModeReg = XUartPs_ReadReg( InstancePtr->Config.BaseAddress, + XUARTPS_MR_OFFSET); + + InputClk = InstancePtr->Config.InputClockHz; + if(ModeReg & XUARTPS_MR_CLKSEL) { + InputClk = InstancePtr->Config.InputClockHz / 8; + } + + /* + * Determine the Baud divider. It can be 4to 254. + * Loop through all possible combinations + */ + for (IterBAUDDIV = 4; IterBAUDDIV < 255; IterBAUDDIV++) { + + /* + * Calculate the value for BRGR register + */ + BRGR_Value = InputClk / (BaudRate * (IterBAUDDIV + 1)); + + /* + * Calculate the baud rate from the BRGR value + */ + CalcBaudRate = InputClk/ (BRGR_Value * (IterBAUDDIV + 1)); + + /* + * Avoid unsigned integer underflow + */ + if (BaudRate > CalcBaudRate) { + BaudError = BaudRate - CalcBaudRate; + } + else { + BaudError = CalcBaudRate - BaudRate; + } + + /* + * Find the calculated baud rate closest to requested baud rate. + */ + if (Best_Error > BaudError) { + + Best_BRGR = BRGR_Value; + Best_BAUDDIV = IterBAUDDIV; + Best_Error = BaudError; + } + } + + /* + * Make sure the best error is not too large. + */ + PercentError = (Best_Error * 100) / BaudRate; + if (XUARTPS_MAX_BAUD_ERROR_RATE < PercentError) { + return XST_UART_BAUD_ERROR; + } + + /* + * Disable TX and RX to avoid glitches when setting the baud rate. + */ + XUartPs_DisableUart(InstancePtr); + + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_BAUDGEN_OFFSET, Best_BRGR); + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_BAUDDIV_OFFSET, Best_BAUDDIV); + + /* + * Enable device + */ + XUartPs_EnableUart(InstancePtr); + + InstancePtr->BaudRate = BaudRate; + + return XST_SUCCESS; + +} + +/****************************************************************************/ +/** +* +* This function is a stub handler that is the default handler such that if the +* application has not set the handler when interrupts are enabled, this +* function will be called. +* +* @param CallBackRef is unused by this function. +* @param Event is unused by this function. +* @param ByteCount is unused by this function. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +static void XUartPs_StubHandler(void *CallBackRef, u32 Event, + unsigned int ByteCount) +{ + (void) CallBackRef; + (void) Event; + (void) ByteCount; + /* + * Assert occurs always since this is a stub and should never be called + */ + Xil_AssertVoidAlways(); +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps.h new file mode 100755 index 000000000..4a538044c --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps.h @@ -0,0 +1,511 @@ +/***************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps.h +* +* This driver supports the following features: +* +* - Dynamic data format (baud rate, data bits, stop bits, parity) +* - Polled mode +* - Interrupt driven mode +* - Transmit and receive FIFOs (32 byte FIFO depth) +* - Access to the external modem control lines +* +* <b>Initialization & Configuration</b> +* +* The XUartPs_Config structure is used by the driver to configure itself. +* Fields inside this structure are properties of XUartPs based on its hardware +* build. +* +* To support multiple runtime loading and initialization strategies employed +* by various operating systems, the driver instance can be initialized in the +* following way: +* +* - XUartPs_CfgInitialize(InstancePtr, CfgPtr, EffectiveAddr) - Uses a +* configuration structure provided by the caller. If running in a system +* with address translation, the parameter EffectiveAddr should be the +* virtual address. +* +* <b>Baud Rate</b> +* +* The UART has an internal baud rate generator, which furnishes the baud rate +* clock for both the receiver and the transmitter. Ther input clock frequency +* can be either the master clock or the master clock divided by 8, configured +* through the mode register. +* +* Accompanied with the baud rate divider register, the baud rate is determined +* by: +* <pre> +* baud_rate = input_clock / (bgen * (bdiv + 1) +* </pre> +* where bgen is the value of the baud rate generator, and bdiv is the value of +* baud rate divider. +* +* <b>Interrupts</b> +* +* The FIFOs are not flushed when the driver is initialized, but a function is +* provided to allow the user to reset the FIFOs if desired. +* +* The driver defaults to no interrupts at initialization such that interrupts +* must be enabled if desired. An interrupt is generated for one of the +* following conditions. +* +* - A change in the modem signals +* - Data in the receive FIFO for a configuable time without receiver activity +* - A parity error +* - A framing error +* - An overrun error +* - Transmit FIFO is full +* - Transmit FIFO is empty +* - Receive FIFO is full +* - Receive FIFO is empty +* - Data in the receive FIFO equal to the receive threshold +* +* The application can control which interrupts are enabled using the +* XUartPs_SetInterruptMask() function. +* +* In order to use interrupts, it is necessary for the user to connect the +* driver interrupt handler, XUartPs_InterruptHandler(), to the interrupt +* system of the application. A separate handler should be provided by the +* application to communicate with the interrupt system, and conduct +* application specific interrupt handling. An application registers its own +* handler through the XUartPs_SetHandler() function. +* +* <b>Data Transfer</b> +* +* The functions, XUartPs_Send() and XUartPs_Recv(), are provided in the +* driver to allow data to be sent and received. They can be used in either +* polled or interrupt mode. +* +* @note +* +* The default configuration for the UART after initialization is: +* +* - 9,600 bps or XPAR_DFT_BAUDRATE if defined +* - 8 data bits +* - 1 stop bit +* - no parity +* - FIFO's are enabled with a receive threshold of 8 bytes +* - The RX timeout is enabled with a timeout of 1 (4 char times) +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00a drg/jz 01/12/10 First Release +* 1.00a sdm 09/27/11 Fixed compiler warnings and also a bug +* in XUartPs_SetFlowDelay where the value was not +* being written to the register. +* 1.01a sdm 12/20/11 Removed the InputClockHz parameter from the XUartPs +* instance structure and the driver is updated to use +* InputClockHz parameter from the XUartPs_Config config +* structure. +* Added a parameter to XUartPs_Config structure which +* specifies whether the user has selected Modem pins +* to be connected to MIO or FMIO. +* Added the tcl file to generate the xparameters.h +* 1.02a sg 05/16/12 Changed XUARTPS_RXWM_MASK to 0x3F for CR 652540 fix. +* 1.03a sg 07/16/12 Updated XUARTPS_FORMAT_7_BITS and XUARTPS_FORMAT_6_BITS +* with the correct values for CR 666724 +* Added defines for XUARTPS_IXR_TOVR, XUARTPS_IXR_TNFUL +* and XUARTPS_IXR_TTRIG. +* Modified the name of these defines +* XUARTPS_MEDEMSR_DCDX to XUARTPS_MODEMSR_DDCD +* XUARTPS_MEDEMSR_RIX to XUARTPS_MODEMSR_TERI +* XUARTPS_MEDEMSR_DSRX to XUARTPS_MODEMSR_DDSR +* XUARTPS_MEDEMSR_CTSX to XUARTPS_MODEMSR_DCTS +* 1.05a hk 08/22/13 Added API for uart reset and related +* constant definitions. +* +* </pre> +* +*****************************************************************************/ + +#ifndef XUARTPS_H /* prevent circular inclusions */ +#define XUARTPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xuartps_hw.h" + +/************************** Constant Definitions ****************************/ + +/* + * The following constants indicate the max and min baud rates and these + * numbers are based only on the testing that has been done. The hardware + * is capable of other baud rates. + */ +#define XUARTPS_MAX_RATE 921600 +#define XUARTPS_MIN_RATE 110 + +#define XUARTPS_DFT_BAUDRATE 115200 /* Default baud rate */ + +/** @name Configuration options + * @{ + */ +/** + * These constants specify the options that may be set or retrieved + * with the driver, each is a unique bit mask such that multiple options + * may be specified. These constants indicate the available options + * in active state. + * + */ + +#define XUARTPS_OPTION_SET_BREAK 0x0080 /**< Starts break transmission */ +#define XUARTPS_OPTION_STOP_BREAK 0x0040 /**< Stops break transmission */ +#define XUARTPS_OPTION_RESET_TMOUT 0x0020 /**< Reset the receive timeout */ +#define XUARTPS_OPTION_RESET_TX 0x0010 /**< Reset the transmitter */ +#define XUARTPS_OPTION_RESET_RX 0x0008 /**< Reset the receiver */ +#define XUARTPS_OPTION_ASSERT_RTS 0x0004 /**< Assert the RTS bit */ +#define XUARTPS_OPTION_ASSERT_DTR 0x0002 /**< Assert the DTR bit */ +#define XUARTPS_OPTION_SET_FCM 0x0001 /**< Turn on flow control mode */ +/*@}*/ + + +/** @name Channel Operational Mode + * + * The UART can operate in one of four modes: Normal, Local Loopback, Remote + * Loopback, or automatic echo. + * + * @{ + */ + +#define XUARTPS_OPER_MODE_NORMAL 0x00 /**< Normal Mode */ +#define XUARTPS_OPER_MODE_AUTO_ECHO 0x01 /**< Auto Echo Mode */ +#define XUARTPS_OPER_MODE_LOCAL_LOOP 0x02 /**< Local Loopback Mode */ +#define XUARTPS_OPER_MODE_REMOTE_LOOP 0x03 /**< Remote Loopback Mode */ + +/* @} */ + +/** @name Data format values + * + * These constants specify the data format that the driver supports. + * The data format includes the number of data bits, the number of stop + * bits and parity. + * + * @{ + */ +#define XUARTPS_FORMAT_8_BITS 0 /**< 8 data bits */ +#define XUARTPS_FORMAT_7_BITS 2 /**< 7 data bits */ +#define XUARTPS_FORMAT_6_BITS 3 /**< 6 data bits */ + +#define XUARTPS_FORMAT_NO_PARITY 4 /**< No parity */ +#define XUARTPS_FORMAT_MARK_PARITY 3 /**< Mark parity */ +#define XUARTPS_FORMAT_SPACE_PARITY 2 /**< parity */ +#define XUARTPS_FORMAT_ODD_PARITY 1 /**< Odd parity */ +#define XUARTPS_FORMAT_EVEN_PARITY 0 /**< Even parity */ + +#define XUARTPS_FORMAT_2_STOP_BIT 2 /**< 2 stop bits */ +#define XUARTPS_FORMAT_1_5_STOP_BIT 1 /**< 1.5 stop bits */ +#define XUARTPS_FORMAT_1_STOP_BIT 0 /**< 1 stop bit */ +/*@}*/ + +/** @name Callback events + * + * These constants specify the handler events that an application can handle + * using its specific handler function. Note that these constants are not bit + * mask, so only one event can be passed to an application at a time. + * + * @{ + */ +#define XUARTPS_EVENT_RECV_DATA 1 /**< Data receiving done */ +#define XUARTPS_EVENT_RECV_TOUT 2 /**< A receive timeout occurred */ +#define XUARTPS_EVENT_SENT_DATA 3 /**< Data transmission done */ +#define XUARTPS_EVENT_RECV_ERROR 4 /**< A receive error detected */ +#define XUARTPS_EVENT_MODEM 5 /**< Modem status changed */ +/*@}*/ + + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Base address of device (IPIF) */ + u32 InputClockHz;/**< Input clock frequency */ + int ModemPinsConnected; /** Specifies whether modem pins are connected + * to MIO or FMIO */ +} XUartPs_Config; + +/* + * Keep track of state information about a data buffer in the interrupt mode. + */ +typedef struct { + u8 *NextBytePtr; + unsigned int RequestedBytes; + unsigned int RemainingBytes; +} XUartPsBuffer; + +/** + * Keep track of data format setting of a device. + */ +typedef struct { + u32 BaudRate; /**< In bps, ie 1200 */ + u32 DataBits; /**< Number of data bits */ + u32 Parity; /**< Parity */ + u8 StopBits; /**< Number of stop bits */ +} XUartPsFormat; + +/******************************************************************************/ +/** + * This data type defines a handler that an application defines to communicate + * with interrupt system to retrieve state information about an application. + * + * @param CallBackRef is a callback reference passed in by the upper layer + * when setting the handler, and is passed back to the upper layer + * when the handler is called. It is used to find the device driver + * instance. + * @param Event contains one of the event constants indicating events that + * have occurred. + * @param EventData contains the number of bytes sent or received at the + * time of the call for send and receive events and contains the + * modem status for modem events. + * + ******************************************************************************/ +typedef void (*XUartPs_Handler) (void *CallBackRef, u32 Event, + unsigned int EventData); + +/** + * The XUartPs driver instance data structure. A pointer to an instance data + * structure is passed around by functions to refer to a specific driver + * instance. + */ +typedef struct { + XUartPs_Config Config; /* Configuration data structure */ + u32 InputClockHz; /* Input clock frequency */ + u32 IsReady; /* Device is initialized and ready */ + u32 BaudRate; /* Current baud rate */ + + XUartPsBuffer SendBuffer; + XUartPsBuffer ReceiveBuffer; + + XUartPs_Handler Handler; + void *CallBackRef; /* Callback reference for event handler */ +} XUartPs; + + +/***************** Macros (Inline Functions) Definitions ********************/ + +/****************************************************************************/ +/** +* Get the UART Channel Status Register. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u16 XUartPs_GetChannelStatus(XUartPs *InstancePtr) +* +******************************************************************************/ +#define XUartPs_GetChannelStatus(InstancePtr) \ + Xil_In32(((InstancePtr)->Config.BaseAddress) + XUARTPS_SR_OFFSET) + +/****************************************************************************/ +/** +* Get the UART Mode Control Register. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u32 XUartPs_GetControl(XUartPs *InstancePtr) +* +******************************************************************************/ +#define XUartPs_GetModeControl(InstancePtr) \ + Xil_In32(((InstancePtr)->Config.BaseAddress) + XUARTPS_CR_OFFSET) + +/****************************************************************************/ +/** +* Set the UART Mode Control Register. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XUartPs_SetModeControl(XUartPs *InstancePtr, u16 RegisterValue) +* +******************************************************************************/ +#define XUartPs_SetModeControl(InstancePtr, RegisterValue) \ + Xil_Out32(((InstancePtr)->Config.BaseAddress) + XUARTPS_CR_OFFSET, \ + (RegisterValue)) + +/****************************************************************************/ +/** +* Enable the transmitter and receiver of the UART. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XUartPs_EnableUart(XUartPs *InstancePtr) +* +******************************************************************************/ +#define XUartPs_EnableUart(InstancePtr) \ + Xil_Out32(((InstancePtr)->Config.BaseAddress + XUARTPS_CR_OFFSET), \ + ((Xil_In32((InstancePtr)->Config.BaseAddress + XUARTPS_CR_OFFSET) & \ + ~XUARTPS_CR_EN_DIS_MASK) | (XUARTPS_CR_RX_EN | XUARTPS_CR_TX_EN))) + +/****************************************************************************/ +/** +* Disable the transmitter and receiver of the UART. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XUartPs_DisableUart(XUartPs *InstancePtr) +* +******************************************************************************/ +#define XUartPs_DisableUart(InstancePtr) \ + Xil_Out32(((InstancePtr)->Config.BaseAddress + XUARTPS_CR_OFFSET), \ + (((Xil_In32((InstancePtr)->Config.BaseAddress + XUARTPS_CR_OFFSET)) & \ + ~XUARTPS_CR_EN_DIS_MASK) | (XUARTPS_CR_RX_DIS | XUARTPS_CR_TX_DIS))) + +/****************************************************************************/ +/** +* Determine if the transmitter FIFO is empty. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return +* - TRUE if a byte can be sent +* - FALSE if the Transmitter Fifo is not empty +* +* @note C-Style signature: +* u32 XUartPs_IsTransmitEmpty(XUartPs InstancePtr) +* +******************************************************************************/ +#define XUartPs_IsTransmitEmpty(InstancePtr) \ + ((Xil_In32(((InstancePtr)->Config.BaseAddress) + XUARTPS_SR_OFFSET) & \ + XUARTPS_SR_TXEMPTY) == XUARTPS_SR_TXEMPTY) + + +/************************** Function Prototypes *****************************/ + +/* + * Static lookup function implemented in xuartps_sinit.c + */ +XUartPs_Config *XUartPs_LookupConfig(u16 DeviceId); + +/* + * Interface functions implemented in xuartps.c + */ +int XUartPs_CfgInitialize(XUartPs *InstancePtr, + XUartPs_Config * Config, u32 EffectiveAddr); + +unsigned int XUartPs_Send(XUartPs *InstancePtr, u8 *BufferPtr, + unsigned int NumBytes); + +unsigned int XUartPs_Recv(XUartPs *InstancePtr, u8 *BufferPtr, + unsigned int NumBytes); + +int XUartPs_SetBaudRate(XUartPs *InstancePtr, u32 BaudRate); + +/* + * Options functions in xuartps_options.c + */ +void XUartPs_SetOptions(XUartPs *InstancePtr, u16 Options); + +u16 XUartPs_GetOptions(XUartPs *InstancePtr); + +void XUartPs_SetFifoThreshold(XUartPs *InstancePtr, u8 TriggerLevel); + +u8 XUartPs_GetFifoThreshold(XUartPs *InstancePtr); + +u16 XUartPs_GetModemStatus(XUartPs *InstancePtr); + +u32 XUartPs_IsSending(XUartPs *InstancePtr); + +u8 XUartPs_GetOperMode(XUartPs *InstancePtr); + +void XUartPs_SetOperMode(XUartPs *InstancePtr, u8 OperationMode); + +u8 XUartPs_GetFlowDelay(XUartPs *InstancePtr); + +void XUartPs_SetFlowDelay(XUartPs *InstancePtr, u8 FlowDelayValue); + +u8 XUartPs_GetRecvTimeout(XUartPs *InstancePtr); + +void XUartPs_SetRecvTimeout(XUartPs *InstancePtr, u8 RecvTimeout); + +int XUartPs_SetDataFormat(XUartPs *InstancePtr, XUartPsFormat * Format); +void XUartPs_GetDataFormat(XUartPs *InstancePtr, XUartPsFormat * Format); + +/* + * interrupt functions in xuartps_intr.c + */ +u32 XUartPs_GetInterruptMask(XUartPs *InstancePtr); + +void XUartPs_SetInterruptMask(XUartPs *InstancePtr, u32 Mask); + +void XUartPs_InterruptHandler(XUartPs *InstancePtr); + +void XUartPs_SetHandler(XUartPs *InstancePtr, XUartPs_Handler FuncPtr, + void *CallBackRef); + +/* + * self-test functions in xuartps_selftest.c + */ +int XUartPs_SelfTest(XUartPs *InstancePtr); + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_g.c new file mode 100644 index 000000000..2d86c04aa --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_g.c @@ -0,0 +1,38 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xuartps.h" + +/* +* The configuration table for devices +*/ + +XUartPs_Config XUartPs_ConfigTable[] = +{ + { + XPAR_PS7_UART_0_DEVICE_ID, + XPAR_PS7_UART_0_BASEADDR, + XPAR_PS7_UART_0_UART_CLK_FREQ_HZ, + XPAR_PS7_UART_0_HAS_MODEM + }, + { + XPAR_PS7_UART_1_DEVICE_ID, + XPAR_PS7_UART_1_BASEADDR, + XPAR_PS7_UART_1_UART_CLK_FREQ_HZ, + XPAR_PS7_UART_1_HAS_MODEM + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_hw.c new file mode 100755 index 000000000..b7fe10ab8 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_hw.c @@ -0,0 +1,201 @@ +/***************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_hw.c +* +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00 drg/jz 01/12/10 First Release +* 1.05a hk 08/22/13 Added reset function +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ +#include "xuartps_hw.h" + +/************************** Constant Definitions ****************************/ + + +/***************** Macros (Inline Functions) Definitions ********************/ + + +/************************** Function Prototypes ******************************/ + + +/************************** Variable Definitions *****************************/ + +/****************************************************************************/ +/** +* +* This function sends one byte using the device. This function operates in +* polled mode and blocks until the data has been put into the TX FIFO register. +* +* @param BaseAddress contains the base address of the device. +* @param Data contains the byte to be sent. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XUartPs_SendByte(u32 BaseAddress, u8 Data) +{ + /* + * Wait until there is space in TX FIFO + */ + while (XUartPs_IsTransmitFull(BaseAddress)); + + /* + * Write the byte into the TX FIFO + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_FIFO_OFFSET, Data); +} + +/****************************************************************************/ +/** +* +* This function receives a byte from the device. It operates in polled mode +* and blocks until a byte has received. +* +* @param BaseAddress contains the base address of the device. +* +* @return The data byte received. +* +* @note None. +* +*****************************************************************************/ +u8 XUartPs_RecvByte(u32 BaseAddress) +{ + /* + * Wait until there is data + */ + while (!XUartPs_IsReceiveData(BaseAddress)); + + /* + * Return the byte received + */ + return (XUartPs_ReadReg(BaseAddress, XUARTPS_FIFO_OFFSET)); +} + +/****************************************************************************/ +/** +* +* This function resets UART +* +* @param BaseAddress contains the base address of the device. +* +* @return None +* +* @note None. +* +*****************************************************************************/ +void XUartPs_ResetHw(u32 BaseAddress) +{ + + /* + * Disable interrupts + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_IDR_OFFSET, XUARTPS_IXR_MASK); + + /* + * Disable receive and transmit + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_CR_OFFSET, + XUARTPS_CR_RX_DIS | XUARTPS_CR_TX_DIS); + + /* + * Software reset of receive and transmit + * This clears the FIFO. + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_CR_OFFSET, + XUARTPS_CR_TXRST | XUARTPS_CR_RXRST); + + /* + * Clear status flags - SW reset wont clear sticky flags. + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_ISR_OFFSET, XUARTPS_IXR_MASK); + + /* + * Mode register reset value : All zeroes + * Normal mode, even parity, 1 stop bit + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_MR_OFFSET, + XUARTPS_MR_CHMODE_NORM); + + /* + * Rx and TX trigger register reset values + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_RXWM_OFFSET, + XUARTPS_RXWM_RESET_VAL); + XUartPs_WriteReg(BaseAddress, XUARTPS_TXWM_OFFSET, + XUARTPS_TXWM_RESET_VAL); + + /* + * Rx timeout disabled by default + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_RXTOUT_OFFSET, + XUARTPS_RXTOUT_DISABLE); + + /* + * Baud rate generator and dividor reset values + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_BAUDGEN_OFFSET, + XUARTPS_BAUDGEN_RESET_VAL); + XUartPs_WriteReg(BaseAddress, XUARTPS_BAUDDIV_OFFSET, + XUARTPS_BAUDDIV_RESET_VAL); + + /* + * Control register reset value - + * RX and TX are disable by default + */ + XUartPs_WriteReg(BaseAddress, XUARTPS_CR_OFFSET, + XUARTPS_CR_RX_DIS | XUARTPS_CR_TX_DIS | + XUARTPS_CR_STOPBRK); + +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_hw.h new file mode 100755 index 000000000..768e38027 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_hw.h @@ -0,0 +1,432 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xuartps_hw.h +* +* This header file contains the hardware interface of an XUartPs device. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ---------------------------------------------- +* 1.00 drg/jz 01/12/10 First Release +* 1.03a sg 09/04/12 Added defines for XUARTPS_IXR_TOVR, XUARTPS_IXR_TNFUL +* and XUARTPS_IXR_TTRIG. +* Modified the names of these defines +* XUARTPS_MEDEMSR_DCDX to XUARTPS_MODEMSR_DDCD +* XUARTPS_MEDEMSR_RIX to XUARTPS_MODEMSR_TERI +* XUARTPS_MEDEMSR_DSRX to XUARTPS_MODEMSR_DDSR +* XUARTPS_MEDEMSR_CTSX to XUARTPS_MODEMSR_DCTS +* 1.05a hk 08/22/13 Added prototype for uart reset and related +* constant definitions. +* +* </pre> +* +******************************************************************************/ +#ifndef XUARTPS_HW_H /* prevent circular inclusions */ +#define XUARTPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + +/** @name Register Map + * + * Register offsets for the UART. + * @{ + */ +#define XUARTPS_CR_OFFSET 0x00 /**< Control Register [8:0] */ +#define XUARTPS_MR_OFFSET 0x04 /**< Mode Register [9:0] */ +#define XUARTPS_IER_OFFSET 0x08 /**< Interrupt Enable [12:0] */ +#define XUARTPS_IDR_OFFSET 0x0C /**< Interrupt Disable [12:0] */ +#define XUARTPS_IMR_OFFSET 0x10 /**< Interrupt Mask [12:0] */ +#define XUARTPS_ISR_OFFSET 0x14 /**< Interrupt Status [12:0]*/ +#define XUARTPS_BAUDGEN_OFFSET 0x18 /**< Baud Rate Generator [15:0] */ +#define XUARTPS_RXTOUT_OFFSET 0x1C /**< RX Timeout [7:0] */ +#define XUARTPS_RXWM_OFFSET 0x20 /**< RX FIFO Trigger Level [5:0] */ +#define XUARTPS_MODEMCR_OFFSET 0x24 /**< Modem Control [5:0] */ +#define XUARTPS_MODEMSR_OFFSET 0x28 /**< Modem Status [8:0] */ +#define XUARTPS_SR_OFFSET 0x2C /**< Channel Status [14:0] */ +#define XUARTPS_FIFO_OFFSET 0x30 /**< FIFO [7:0] */ +#define XUARTPS_BAUDDIV_OFFSET 0x34 /**< Baud Rate Divider [7:0] */ +#define XUARTPS_FLOWDEL_OFFSET 0x38 /**< Flow Delay [5:0] */ +#define XUARTPS_TXWM_OFFSET 0x44 /**< TX FIFO Trigger Level [5:0] */ +/* @} */ + +/** @name Control Register + * + * The Control register (CR) controls the major functions of the device. + * + * Control Register Bit Definition + */ + +#define XUARTPS_CR_STOPBRK 0x00000100 /**< Stop transmission of break */ +#define XUARTPS_CR_STARTBRK 0x00000080 /**< Set break */ +#define XUARTPS_CR_TORST 0x00000040 /**< RX timeout counter restart */ +#define XUARTPS_CR_TX_DIS 0x00000020 /**< TX disabled. */ +#define XUARTPS_CR_TX_EN 0x00000010 /**< TX enabled */ +#define XUARTPS_CR_RX_DIS 0x00000008 /**< RX disabled. */ +#define XUARTPS_CR_RX_EN 0x00000004 /**< RX enabled */ +#define XUARTPS_CR_EN_DIS_MASK 0x0000003C /**< Enable/disable Mask */ +#define XUARTPS_CR_TXRST 0x00000002 /**< TX logic reset */ +#define XUARTPS_CR_RXRST 0x00000001 /**< RX logic reset */ +/* @}*/ + + +/** @name Mode Register + * + * The mode register (MR) defines the mode of transfer as well as the data + * format. If this register is modified during transmission or reception, + * data validity cannot be guaranteed. + * + * Mode Register Bit Definition + * @{ + */ +#define XUARTPS_MR_CCLK 0x00000400 /**< Input clock selection */ +#define XUARTPS_MR_CHMODE_R_LOOP 0x00000300 /**< Remote loopback mode */ +#define XUARTPS_MR_CHMODE_L_LOOP 0x00000200 /**< Local loopback mode */ +#define XUARTPS_MR_CHMODE_ECHO 0x00000100 /**< Auto echo mode */ +#define XUARTPS_MR_CHMODE_NORM 0x00000000 /**< Normal mode */ +#define XUARTPS_MR_CHMODE_SHIFT 8 /**< Mode shift */ +#define XUARTPS_MR_CHMODE_MASK 0x00000300 /**< Mode mask */ +#define XUARTPS_MR_STOPMODE_2_BIT 0x00000080 /**< 2 stop bits */ +#define XUARTPS_MR_STOPMODE_1_5_BIT 0x00000040 /**< 1.5 stop bits */ +#define XUARTPS_MR_STOPMODE_1_BIT 0x00000000 /**< 1 stop bit */ +#define XUARTPS_MR_STOPMODE_SHIFT 6 /**< Stop bits shift */ +#define XUARTPS_MR_STOPMODE_MASK 0x000000A0 /**< Stop bits mask */ +#define XUARTPS_MR_PARITY_NONE 0x00000020 /**< No parity mode */ +#define XUARTPS_MR_PARITY_MARK 0x00000018 /**< Mark parity mode */ +#define XUARTPS_MR_PARITY_SPACE 0x00000010 /**< Space parity mode */ +#define XUARTPS_MR_PARITY_ODD 0x00000008 /**< Odd parity mode */ +#define XUARTPS_MR_PARITY_EVEN 0x00000000 /**< Even parity mode */ +#define XUARTPS_MR_PARITY_SHIFT 3 /**< Parity setting shift */ +#define XUARTPS_MR_PARITY_MASK 0x00000038 /**< Parity mask */ +#define XUARTPS_MR_CHARLEN_6_BIT 0x00000006 /**< 6 bits data */ +#define XUARTPS_MR_CHARLEN_7_BIT 0x00000004 /**< 7 bits data */ +#define XUARTPS_MR_CHARLEN_8_BIT 0x00000000 /**< 8 bits data */ +#define XUARTPS_MR_CHARLEN_SHIFT 1 /**< Data Length shift */ +#define XUARTPS_MR_CHARLEN_MASK 0x00000006 /**< Data length mask */ +#define XUARTPS_MR_CLKSEL 0x00000001 /**< Input clock selection */ +/* @} */ + + +/** @name Interrupt Registers + * + * Interrupt control logic uses the interrupt enable register (IER) and the + * interrupt disable register (IDR) to set the value of the bits in the + * interrupt mask register (IMR). The IMR determines whether to pass an + * interrupt to the interrupt status register (ISR). + * Writing a 1 to IER Enbables an interrupt, writing a 1 to IDR disables an + * interrupt. IMR and ISR are read only, and IER and IDR are write only. + * Reading either IER or IDR returns 0x00. + * + * All four registers have the same bit definitions. + * + * @{ + */ +#define XUARTPS_IXR_TOVR 0x00001000 /**< Tx FIFO Overflow interrupt */ +#define XUARTPS_IXR_TNFUL 0x00000800 /**< Tx FIFO Nearly Full interrupt */ +#define XUARTPS_IXR_TTRIG 0x00000400 /**< Tx Trig interrupt */ +#define XUARTPS_IXR_DMS 0x00000200 /**< Modem status change interrupt */ +#define XUARTPS_IXR_TOUT 0x00000100 /**< Timeout error interrupt */ +#define XUARTPS_IXR_PARITY 0x00000080 /**< Parity error interrupt */ +#define XUARTPS_IXR_FRAMING 0x00000040 /**< Framing error interrupt */ +#define XUARTPS_IXR_OVER 0x00000020 /**< Overrun error interrupt */ +#define XUARTPS_IXR_TXFULL 0x00000010 /**< TX FIFO full interrupt. */ +#define XUARTPS_IXR_TXEMPTY 0x00000008 /**< TX FIFO empty interrupt. */ +#define XUARTPS_IXR_RXFULL 0x00000004 /**< RX FIFO full interrupt. */ +#define XUARTPS_IXR_RXEMPTY 0x00000002 /**< RX FIFO empty interrupt. */ +#define XUARTPS_IXR_RXOVR 0x00000001 /**< RX FIFO trigger interrupt. */ +#define XUARTPS_IXR_MASK 0x00001FFF /**< Valid bit mask */ +/* @} */ + + +/** @name Baud Rate Generator Register + * + * The baud rate generator control register (BRGR) is a 16 bit register that + * controls the receiver bit sample clock and baud rate. + * Valid values are 1 - 65535. + * + * Bit Sample Rate = CCLK / BRGR, where the CCLK is selected by the MR_CCLK bit + * in the MR register. + * @{ + */ +#define XUARTPS_BAUDGEN_DISABLE 0x00000000 /**< Disable clock */ +#define XUARTPS_BAUDGEN_MASK 0x0000FFFF /**< Valid bits mask */ +#define XUARTPS_BAUDGEN_RESET_VAL 0x0000028B /**< Reset value */ + +/** @name Baud Divisor Rate register + * + * The baud rate divider register (BDIV) controls how much the bit sample + * rate is divided by. It sets the baud rate. + * Valid values are 0x04 to 0xFF. Writing a value less than 4 will be ignored. + * + * Baud rate = CCLK / ((BAUDDIV + 1) x BRGR), where the CCLK is selected by + * the MR_CCLK bit in the MR register. + * @{ + */ +#define XUARTPS_BAUDDIV_MASK 0x000000FF /**< 8 bit baud divider mask */ +#define XUARTPS_BAUDDIV_RESET_VAL 0x0000000F /**< Reset value */ +/* @} */ + + +/** @name Receiver Timeout Register + * + * Use the receiver timeout register (RTR) to detect an idle condition on + * the receiver data line. + * + * @{ + */ +#define XUARTPS_RXTOUT_DISABLE 0x00000000 /**< Disable time out */ +#define XUARTPS_RXTOUT_MASK 0x000000FF /**< Valid bits mask */ + +/** @name Receiver FIFO Trigger Level Register + * + * Use the Receiver FIFO Trigger Level Register (RTRIG) to set the value at + * which the RX FIFO triggers an interrupt event. + * @{ + */ + +#define XUARTPS_RXWM_DISABLE 0x00000000 /**< Disable RX trigger interrupt */ +#define XUARTPS_RXWM_MASK 0x0000003F /**< Valid bits mask */ +#define XUARTPS_RXWM_RESET_VAL 0x00000020 /**< Reset value */ +/* @} */ + +/** @name Transmit FIFO Trigger Level Register + * + * Use the Transmit FIFO Trigger Level Register (TTRIG) to set the value at + * which the TX FIFO triggers an interrupt event. + * @{ + */ + +#define XUARTPS_TXWM_MASK 0x0000003F /**< Valid bits mask */ +#define XUARTPS_TXWM_RESET_VAL 0x00000020 /**< Reset value */ +/* @} */ + +/** @name Modem Control Register + * + * This register (MODEMCR) controls the interface with the modem or data set, + * or a peripheral device emulating a modem. + * + * @{ + */ +#define XUARTPS_MODEMCR_FCM 0x00000010 /**< Flow control mode */ +#define XUARTPS_MODEMCR_RTS 0x00000002 /**< Request to send */ +#define XUARTPS_MODEMCR_DTR 0x00000001 /**< Data terminal ready */ +/* @} */ + +/** @name Modem Status Register + * + * This register (MODEMSR) indicates the current state of the control lines + * from a modem, or another peripheral device, to the CPU. In addition, four + * bits of the modem status register provide change information. These bits + * are set to a logic 1 whenever a control input from the modem changes state. + * + * Note: Whenever the DCTS, DDSR, TERI, or DDCD bit is set to logic 1, a modem + * status interrupt is generated and this is reflected in the modem status + * register. + * + * @{ + */ +#define XUARTPS_MODEMSR_FCMS 0x00000100 /**< Flow control mode (FCMS) */ +#define XUARTPS_MODEMSR_DCD 0x00000080 /**< Complement of DCD input */ +#define XUARTPS_MODEMSR_RI 0x00000040 /**< Complement of RI input */ +#define XUARTPS_MODEMSR_DSR 0x00000020 /**< Complement of DSR input */ +#define XUARTPS_MODEMSR_CTS 0x00000010 /**< Complement of CTS input */ +#define XUARTPS_MODEMSR_DDCD 0x00000008 /**< Delta DCD indicator */ +#define XUARTPS_MODEMSR_TERI 0x00000004 /**< Trailing Edge Ring Indicator */ +#define XUARTPS_MODEMSR_DDSR 0x00000002 /**< Change of DSR */ +#define XUARTPS_MODEMSR_DCTS 0x00000001 /**< Change of CTS */ +/* @} */ + +/** @name Channel Status Register + * + * The channel status register (CSR) is provided to enable the control logic + * to monitor the status of bits in the channel interrupt status register, + * even if these are masked out by the interrupt mask register. + * + * @{ + */ +#define XUARTPS_SR_TNFUL 0x00004000 /**< TX FIFO Nearly Full Status */ +#define XUARTPS_SR_TTRIG 0x00002000 /**< TX FIFO Trigger Status */ +#define XUARTPS_SR_FLOWDEL 0x00001000 /**< RX FIFO fill over flow delay */ +#define XUARTPS_SR_TACTIVE 0x00000800 /**< TX active */ +#define XUARTPS_SR_RACTIVE 0x00000400 /**< RX active */ +#define XUARTPS_SR_DMS 0x00000200 /**< Delta modem status change */ +#define XUARTPS_SR_TOUT 0x00000100 /**< RX timeout */ +#define XUARTPS_SR_PARITY 0x00000080 /**< RX parity error */ +#define XUARTPS_SR_FRAME 0x00000040 /**< RX frame error */ +#define XUARTPS_SR_OVER 0x00000020 /**< RX overflow error */ +#define XUARTPS_SR_TXFULL 0x00000010 /**< TX FIFO full */ +#define XUARTPS_SR_TXEMPTY 0x00000008 /**< TX FIFO empty */ +#define XUARTPS_SR_RXFULL 0x00000004 /**< RX FIFO full */ +#define XUARTPS_SR_RXEMPTY 0x00000002 /**< RX FIFO empty */ +#define XUARTPS_SR_RXOVR 0x00000001 /**< RX FIFO fill over trigger */ +/* @} */ + +/** @name Flow Delay Register + * + * Operation of the flow delay register (FLOWDEL) is very similar to the + * receive FIFO trigger register. An internal trigger signal activates when the + * FIFO is filled to the level set by this register. This trigger will not + * cause an interrupt, although it can be read through the channel status + * register. In hardware flow control mode, RTS is deactivated when the trigger + * becomes active. RTS only resets when the FIFO level is four less than the + * level of the flow delay trigger and the flow delay trigger is not activated. + * A value less than 4 disables the flow delay. + * @{ + */ +#define XUARTPS_FLOWDEL_MASK XUARTPS_RXWM_MASK /**< Valid bit mask */ +/* @} */ + + + +/* + * Defines for backwards compatabilty, will be removed + * in the next version of the driver + */ +#define XUARTPS_MEDEMSR_DCDX XUARTPS_MODEMSR_DDCD +#define XUARTPS_MEDEMSR_RIX XUARTPS_MODEMSR_TERI +#define XUARTPS_MEDEMSR_DSRX XUARTPS_MODEMSR_DDSR +#define XUARTPS_MEDEMSR_CTSX XUARTPS_MODEMSR_DCTS + + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* Read a UART register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the base address of the +* device. +* +* @return The value read from the register. +* +* @note C-Style signature: +* u32 XUartPs_ReadReg(u32 BaseAddress, int RegOffset) +* +******************************************************************************/ +#define XUartPs_ReadReg(BaseAddress, RegOffset) \ + Xil_In32((BaseAddress) + (RegOffset)) + +/***************************************************************************/ +/** +* Write a UART register. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset contains the offset from the base address of the +* device. +* @param RegisterValue is the value to be written to the register. +* +* @return None. +* +* @note C-Style signature: +* void XUartPs_WriteReg(u32 BaseAddress, int RegOffset, +* u16 RegisterValue) +* +******************************************************************************/ +#define XUartPs_WriteReg(BaseAddress, RegOffset, RegisterValue) \ + Xil_Out32((BaseAddress) + (RegOffset), (RegisterValue)) + +/****************************************************************************/ +/** +* Determine if there is receive data in the receiver and/or FIFO. +* +* @param BaseAddress contains the base address of the device. +* +* @return TRUE if there is receive data, FALSE otherwise. +* +* @note C-Style signature: +* u32 XUartPs_IsReceiveData(u32 BaseAddress) +* +******************************************************************************/ +#define XUartPs_IsReceiveData(BaseAddress) \ + !((Xil_In32((BaseAddress) + XUARTPS_SR_OFFSET) & \ + XUARTPS_SR_RXEMPTY) == XUARTPS_SR_RXEMPTY) + +/****************************************************************************/ +/** +* Determine if a byte of data can be sent with the transmitter. +* +* @param BaseAddress contains the base address of the device. +* +* @return TRUE if the TX FIFO is full, FALSE if a byte can be put in the +* FIFO. +* +* @note C-Style signature: +* u32 XUartPs_IsTransmitFull(u32 BaseAddress) +* +******************************************************************************/ +#define XUartPs_IsTransmitFull(BaseAddress) \ + ((Xil_In32((BaseAddress) + XUARTPS_SR_OFFSET) & \ + XUARTPS_SR_TXFULL) == XUARTPS_SR_TXFULL) + +/************************** Function Prototypes ******************************/ + +void XUartPs_SendByte(u32 BaseAddress, u8 Data); + +u8 XUartPs_RecvByte(u32 BaseAddress); + +void XUartPs_ResetHw(u32 BaseAddress); + +/************************** Variable Definitions *****************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* end of protection macro */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_intr.c new file mode 100755 index 000000000..5cfbd0e6f --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_intr.c @@ -0,0 +1,452 @@ +/***************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_intr.c +* +* This file contains the functions for interrupt handling +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00 drg/jz 01/13/10 First Release +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xuartps.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Function Prototypes *****************************/ + +static void ReceiveDataHandler(XUartPs *InstancePtr); +static void SendDataHandler(XUartPs *InstancePtr, u32 isrstatus); +static void ReceiveErrorHandler(XUartPs *InstancePtr); +static void ReceiveTimeoutHandler(XUartPs *InstancePtr); +static void ModemHandler(XUartPs *InstancePtr); + + +/* Internal function prototypes implemented in xuartps.c */ +extern unsigned int XUartPs_ReceiveBuffer(XUartPs *InstancePtr); +extern unsigned int XUartPs_SendBuffer(XUartPs *InstancePtr); + +/************************** Variable Definitions ****************************/ + +typedef void (*Handler)(XUartPs *InstancePtr); + +/****************************************************************************/ +/** +* +* This function gets the interrupt mask +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return +* The current interrupt mask. The mask indicates which interupts +* are enabled. +* +* @note None. +* +*****************************************************************************/ +u32 XUartPs_GetInterruptMask(XUartPs *InstancePtr) +{ + /* + * Assert validates the input argument + */ + Xil_AssertNonvoid(InstancePtr != NULL); + + /* + * Read the Interrupt Mask register + */ + return (XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_IMR_OFFSET)); +} + +/****************************************************************************/ +/** +* +* This function sets the interrupt mask. +* +* @param InstancePtr is a pointer to the XUartPs instance +* @param Mask contains the interrupts to be enabled or disabled. +* A '1' enables an interupt, and a '0' disables. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XUartPs_SetInterruptMask(XUartPs *InstancePtr, u32 Mask) +{ + /* + * Assert validates the input arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + + Mask &= XUARTPS_IXR_MASK; + + /* + * Write the mask to the IER Register + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_IER_OFFSET, Mask); + + /* + * Write the inverse of the Mask to the IDR register + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_IDR_OFFSET, (~Mask)); + +} + +/****************************************************************************/ +/** +* +* This function sets the handler that will be called when an event (interrupt) +* occurs that needs application's attention. +* +* @param InstancePtr is a pointer to the XUartPs instance +* @param FuncPtr is the pointer to the callback function. +* @param CallBackRef is the upper layer callback reference passed back +* when the callback function is invoked. +* +* @return None. +* +* @note +* +* There is no assert on the CallBackRef since the driver doesn't know what it +* is (nor should it) +* +*****************************************************************************/ +void XUartPs_SetHandler(XUartPs *InstancePtr, XUartPs_Handler FuncPtr, + void *CallBackRef) +{ + /* + * Asserts validate the input arguments + * CallBackRef not checked, no way to know what is valid + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FuncPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + InstancePtr->Handler = FuncPtr; + InstancePtr->CallBackRef = CallBackRef; +} + +/****************************************************************************/ +/** +* +* This function is the interrupt handler for the driver. +* It must be connected to an interrupt system by the application such that it +* can be called when an interrupt occurs. +* +* @param InstancePtr contains a pointer to the driver instance +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XUartPs_InterruptHandler(XUartPs *InstancePtr) +{ + u32 IsrStatus; + + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the interrupt ID register to determine which + * interrupt is active + */ + IsrStatus = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_IMR_OFFSET); + + IsrStatus &= XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_ISR_OFFSET); + + /* + * Dispatch an appropiate handler. + */ + if(0 != (IsrStatus & (XUARTPS_IXR_RXOVR | XUARTPS_IXR_RXEMPTY | + XUARTPS_IXR_RXFULL))) { + /* Recieved data interrupt */ + ReceiveDataHandler(InstancePtr); + } + + if(0 != (IsrStatus & (XUARTPS_IXR_TXEMPTY | XUARTPS_IXR_TXFULL))) { + /* Transmit data interrupt */ + SendDataHandler(InstancePtr, IsrStatus); + } + + if(0 != (IsrStatus & (XUARTPS_IXR_OVER | XUARTPS_IXR_FRAMING | + XUARTPS_IXR_PARITY))) { + /* Recieved Error Status interrupt */ + ReceiveErrorHandler(InstancePtr); + } + + if(0 != (IsrStatus & XUARTPS_IXR_TOUT )) { + /* Recieved Timeout interrupt */ + ReceiveTimeoutHandler(InstancePtr); + } + + if(0 != (IsrStatus & XUARTPS_IXR_DMS)) { + /* Modem status interrupt */ + ModemHandler(InstancePtr); + } + + /* + * Clear the interrupt status. + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_ISR_OFFSET, + IsrStatus); + +} + +/****************************************************************************/ +/* +* +* This function handles interrupts for receive errors which include +* overrun errors, framing errors, parity errors, and the break interrupt. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +static void ReceiveErrorHandler(XUartPs *InstancePtr) +{ + /* + * If there are bytes still to be received in the specified buffer + * go ahead and receive them. Removing bytes from the RX FIFO will + * clear the interrupt. + */ + if (InstancePtr->ReceiveBuffer.RemainingBytes != 0) { + XUartPs_ReceiveBuffer(InstancePtr); + } + + /* + * Call the application handler to indicate that there is a receive + * error or a break interrupt, if the application cares about the + * error it call a function to get the last errors. + */ + InstancePtr->Handler(InstancePtr->CallBackRef, + XUARTPS_EVENT_RECV_ERROR, + (InstancePtr->ReceiveBuffer.RequestedBytes - + InstancePtr->ReceiveBuffer.RemainingBytes)); + +} +/****************************************************************************/ +/** +* +* This function handles the receive timeout interrupt. This interrupt occurs +* whenever a number of bytes have been present in the RX FIFO and the receive +* data line has been idle for at lease 4 or more character times, (the timeout +* is set using XUartPs_SetrecvTimeout() function). +* +* @param InstancePtr is a pointer to the XUartPs instance +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +static void ReceiveTimeoutHandler(XUartPs *InstancePtr) +{ + u32 Event; + + /* + * If there are bytes still to be received in the specified buffer + * go ahead and receive them. Removing bytes from the RX FIFO will + * clear the interrupt. + */ + if (InstancePtr->ReceiveBuffer.RemainingBytes != 0) { + XUartPs_ReceiveBuffer(InstancePtr); + } + + /* + * If there are no more bytes to receive then indicate that this is + * not a receive timeout but the end of the buffer reached, a timeout + * normally occurs if # of bytes is not divisible by FIFO threshold, + * don't rely on previous test of remaining bytes since receive + * function updates it + */ + if (InstancePtr->ReceiveBuffer.RemainingBytes != 0) { + Event = XUARTPS_EVENT_RECV_TOUT; + } else { + Event = XUARTPS_EVENT_RECV_DATA; + } + + /* + * Call the application handler to indicate that there is a receive + * timeout or data event + */ + InstancePtr->Handler(InstancePtr->CallBackRef, Event, + InstancePtr->ReceiveBuffer.RequestedBytes - + InstancePtr->ReceiveBuffer.RemainingBytes); + +} +/****************************************************************************/ +/** +* +* This function handles the interrupt when data is in RX FIFO. +* +* @param InstancePtr is a pointer to the XUartPs instance +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +static void ReceiveDataHandler(XUartPs *InstancePtr) +{ + /* + * If there are bytes still to be received in the specified buffer + * go ahead and receive them. Removing bytes from the RX FIFO will + * clear the interrupt. + */ + if (InstancePtr->ReceiveBuffer.RemainingBytes != 0) { + XUartPs_ReceiveBuffer(InstancePtr); + } + + + /* If the last byte of a message was received then call the application + * handler, this code should not use an else from the previous check of + * the number of bytes to receive because the call to receive the buffer + * updates the bytes ramained + */ + if (InstancePtr->ReceiveBuffer.RemainingBytes == 0) { + InstancePtr->Handler(InstancePtr->CallBackRef, + XUARTPS_EVENT_RECV_DATA, + (InstancePtr->ReceiveBuffer.RequestedBytes - + InstancePtr->ReceiveBuffer.RemainingBytes)); + } + +} + +/****************************************************************************/ +/** +* +* This function handles the interrupt when data has been sent, the transmit +* FIFO is empty (transmitter holding register). +* +* @param InstancePtr is a pointer to the XUartPs instance +* @param IsrStatus is the register value for channel status register +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +static void SendDataHandler(XUartPs *InstancePtr, u32 IsrStatus) +{ + + /* + * If there are not bytes to be sent from the specified buffer then disable + * the transmit interrupt so it will stop interrupting as it interrupts + * any time the FIFO is empty + */ + if (InstancePtr->SendBuffer.RemainingBytes == 0) { + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_IDR_OFFSET, + (XUARTPS_IXR_TXEMPTY | XUARTPS_IXR_TXFULL)); + + /* Call the application handler to indicate the sending is done */ + InstancePtr->Handler(InstancePtr->CallBackRef, + XUARTPS_EVENT_SENT_DATA, + InstancePtr->SendBuffer.RequestedBytes - + InstancePtr->SendBuffer.RemainingBytes); + } + + /* + * If TX FIFO is empty, send more. + */ + else if(IsrStatus & XUARTPS_IXR_TXEMPTY) { + XUartPs_SendBuffer(InstancePtr); + } + +} + +/****************************************************************************/ +/** +* +* This function handles modem interrupts. It does not do any processing +* except to call the application handler to indicate a modem event. +* +* @param InstancePtr is a pointer to the XUartPs instance +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +static void ModemHandler(XUartPs *InstancePtr) +{ + u32 MsrRegister; + + /* + * Read the modem status register so that the interrupt is acknowledged + * and it can be passed to the callback handler with the event + */ + MsrRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_MODEMSR_OFFSET); + + /* + * Call the application handler to indicate the modem status changed, + * passing the modem status and the event data in the call + */ + InstancePtr->Handler(InstancePtr->CallBackRef, + XUARTPS_EVENT_MODEM, + MsrRegister); + +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_options.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_options.c new file mode 100755 index 000000000..6d7688df5 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_options.c @@ -0,0 +1,805 @@ +/***************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_options.c +* +* The implementation of the options functions for the XUartPs driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00 drg/jz 01/13/10 First Release +* 1.00 sdm 09/27/11 Fixed a bug in XUartPs_SetFlowDelay where the input +* value was not being written to the register. +* +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xuartps.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ +/* + * The following data type is a map from an option to the offset in the + * register to which it belongs as well as its bit mask in that register. + */ +typedef struct { + u16 Option; + u16 RegisterOffset; + u32 Mask; +} Mapping; + +/* + * Create the table which contains options which are to be processed to get/set + * the options. These options are table driven to allow easy maintenance and + * expansion of the options. + */ + +static Mapping OptionsTable[] = { + {XUARTPS_OPTION_SET_BREAK, XUARTPS_CR_OFFSET, XUARTPS_CR_STARTBRK}, + {XUARTPS_OPTION_STOP_BREAK, XUARTPS_CR_OFFSET, XUARTPS_CR_STOPBRK}, + {XUARTPS_OPTION_RESET_TMOUT, XUARTPS_CR_OFFSET, XUARTPS_CR_TORST}, + {XUARTPS_OPTION_RESET_TX, XUARTPS_CR_OFFSET, XUARTPS_CR_TXRST}, + {XUARTPS_OPTION_RESET_RX, XUARTPS_CR_OFFSET, XUARTPS_CR_RXRST}, + {XUARTPS_OPTION_ASSERT_RTS, XUARTPS_MODEMCR_OFFSET, + XUARTPS_MODEMCR_RTS}, + {XUARTPS_OPTION_ASSERT_DTR, XUARTPS_MODEMCR_OFFSET, + XUARTPS_MODEMCR_DTR}, + {XUARTPS_OPTION_SET_FCM, XUARTPS_MODEMCR_OFFSET, XUARTPS_MODEMCR_FCM} +}; + +/* Create a constant for the number of entries in the table */ + +#define XUARTPS_NUM_OPTIONS (sizeof(OptionsTable) / sizeof(Mapping)) + +/************************** Function Prototypes *****************************/ + +/****************************************************************************/ +/** +* +* Gets the options for the specified driver instance. The options are +* implemented as bit masks such that multiple options may be enabled or +* disabled simulataneously. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return +* +* The current options for the UART. The optionss are bit masks that are +* contained in the file xuartps.h and named XUARTPS_OPTION_*. +* +* @note None. +* +*****************************************************************************/ +u16 XUartPs_GetOptions(XUartPs *InstancePtr) +{ + u16 Options = 0; + u32 Register; + unsigned int Index; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Loop thru the options table to map the physical options in the + * registers of the UART to the logical options to be returned + */ + for (Index = 0; Index < XUARTPS_NUM_OPTIONS; Index++) { + Register = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + OptionsTable[Index]. + RegisterOffset); + + /* + * If the bit in the register which correlates to the option + * is set, then set the corresponding bit in the options, + * ignoring any bits which are zero since the options variable + * is initialized to zero + */ + if (Register & OptionsTable[Index].Mask) { + Options |= OptionsTable[Index].Option; + } + } + + return Options; +} + +/****************************************************************************/ +/** +* +* Sets the options for the specified driver instance. The options are +* implemented as bit masks such that multiple options may be enabled or +* disabled simultaneously. +* +* The GetOptions function may be called to retrieve the currently enabled +* options. The result is ORed in the desired new settings to be enabled and +* ANDed with the inverse to clear the settings to be disabled. The resulting +* value is then used as the options for the SetOption function call. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param Options contains the options to be set which are bit masks +* contained in the file xuartps.h and named XUARTPS_OPTION_*. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XUartPs_SetOptions(XUartPs *InstancePtr, u16 Options) +{ + unsigned int Index; + u32 Register; + + /* + * Assert validates the input arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Loop thru the options table to map the logical options to the + * physical options in the registers of the UART. + */ + for (Index = 0; Index < XUARTPS_NUM_OPTIONS; Index++) { + + /* + * Read the register which contains option so that the register + * can be changed without destoying any other bits of the + * register. + */ + Register = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + OptionsTable[Index]. + RegisterOffset); + + /* + * If the option is set in the input, then set the corresponding + * bit in the specified register, otherwise clear the bit in + * the register. + */ + if (Options & OptionsTable[Index].Option) { + Register |= OptionsTable[Index].Mask; + } + else { + Register &= ~OptionsTable[Index].Mask; + } + + /* Write the new value to the register to set the option */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + OptionsTable[Index].RegisterOffset, + Register); + } + +} + +/****************************************************************************/ +/** +* +* This function gets the receive FIFO trigger level. The receive trigger +* level indicates the number of bytes in the receive FIFO that cause a receive +* data event (interrupt) to be generated. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return The current receive FIFO trigger level. This is a value +* from 0-31. +* +* @note None. +* +*****************************************************************************/ +u8 XUartPs_GetFifoThreshold(XUartPs *InstancePtr) +{ + u8 RtrigRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the value of the FIFO control register so that the threshold + * can be retrieved, this read takes special register processing + */ + RtrigRegister = (u8) XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_RXWM_OFFSET); + + /* Return only the trigger level from the register value */ + + return (RtrigRegister & XUARTPS_RXWM_MASK); +} + +/****************************************************************************/ +/** +* +* This functions sets the receive FIFO trigger level. The receive trigger +* level specifies the number of bytes in the receive FIFO that cause a receive +* data event (interrupt) to be generated. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param TriggerLevel contains the trigger level to set. +* +* @return None +* +* @note None. +* +*****************************************************************************/ +void XUartPs_SetFifoThreshold(XUartPs *InstancePtr, u8 TriggerLevel) +{ + u32 RtrigRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(TriggerLevel <= XUARTPS_RXWM_MASK); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + RtrigRegister = TriggerLevel & XUARTPS_RXWM_MASK; + + /* + * Write the new value for the FIFO control register to it such that the + * threshold is changed + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_RXWM_OFFSET, RtrigRegister); + +} + +/****************************************************************************/ +/** +* +* This function gets the modem status from the specified UART. The modem +* status indicates any changes of the modem signals. This function allows +* the modem status to be read in a polled mode. The modem status is updated +* whenever it is read such that reading it twice may not yield the same +* results. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return +* +* The modem status which are bit masks that are contained in the file +* xuartps.h and named XUARTPS_MODEM_*. +* +* @note +* +* The bit masks used for the modem status are the exact bits of the modem +* status register with no abstraction. +* +*****************************************************************************/ +u16 XUartPs_GetModemStatus(XUartPs *InstancePtr) +{ + u32 ModemStatusRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* Read the modem status register to return + */ + ModemStatusRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_MODEMSR_OFFSET); + return ModemStatusRegister; +} + +/****************************************************************************/ +/** +* +* This function determines if the specified UART is sending data. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return +* - TRUE if the UART is sending data +* - FALSE if UART is not sending data +* +* @note None. +* +*****************************************************************************/ +u32 XUartPs_IsSending(XUartPs *InstancePtr) +{ + u32 ChanStatRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the channel status register to determine if the transmitter is + * active + */ + ChanStatRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_SR_OFFSET); + + /* + * If the transmitter is active, or the TX FIFO is not empty, then indicate + * that the UART is still sending some data + */ + return ((XUARTPS_SR_TACTIVE == (ChanStatRegister & + XUARTPS_SR_TACTIVE)) || + (XUARTPS_SR_TXEMPTY != (ChanStatRegister & + XUARTPS_SR_TXEMPTY))); +} + +/****************************************************************************/ +/** +* +* This function gets the operational mode of the UART. The UART can operate +* in one of four modes: Normal, Local Loopback, Remote Loopback, or automatic +* echo. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return +* +* The operational mode is specified by constants defined in xuartps.h. The +* constants are named XUARTPS_OPER_MODE_* +* +* @note None. +* +*****************************************************************************/ +u8 XUartPs_GetOperMode(XUartPs *InstancePtr) +{ + u32 ModeRegister; + u8 OperMode; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Mode register. + */ + ModeRegister = + XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_MR_OFFSET); + + ModeRegister &= XUARTPS_MR_CHMODE_MASK; + /* + * Return the constant + */ + switch (ModeRegister) { + case XUARTPS_MR_CHMODE_NORM: + OperMode = XUARTPS_OPER_MODE_NORMAL; + break; + case XUARTPS_MR_CHMODE_ECHO: + OperMode = XUARTPS_OPER_MODE_AUTO_ECHO; + break; + case XUARTPS_MR_CHMODE_L_LOOP: + OperMode = XUARTPS_OPER_MODE_LOCAL_LOOP; + break; + case XUARTPS_MR_CHMODE_R_LOOP: + OperMode = XUARTPS_OPER_MODE_REMOTE_LOOP; + break; + default: + OperMode = (u8) ((ModeRegister & XUARTPS_MR_CHMODE_MASK) >> + XUARTPS_MR_CHMODE_SHIFT); + } + + return OperMode; +} + +/****************************************************************************/ +/** +* +* This function sets the operational mode of the UART. The UART can operate +* in one of four modes: Normal, Local Loopback, Remote Loopback, or automatic +* echo. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param OperationMode is the mode of the UART. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XUartPs_SetOperMode(XUartPs *InstancePtr, u8 OperationMode) +{ + u32 ModeRegister; + + /* + * Assert validates the input arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(OperationMode <= XUARTPS_OPER_MODE_REMOTE_LOOP); + + /* + * Read the Mode register. + */ + ModeRegister = + XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_MR_OFFSET); + + /* + * Set the correct value by masking the bits, then ORing the const. + */ + ModeRegister &= ~XUARTPS_MR_CHMODE_MASK; + + switch (OperationMode) { + case XUARTPS_OPER_MODE_NORMAL: + ModeRegister |= XUARTPS_MR_CHMODE_NORM; + break; + case XUARTPS_OPER_MODE_AUTO_ECHO: + ModeRegister |= XUARTPS_MR_CHMODE_ECHO; + break; + case XUARTPS_OPER_MODE_LOCAL_LOOP: + ModeRegister |= XUARTPS_MR_CHMODE_L_LOOP; + break; + case XUARTPS_OPER_MODE_REMOTE_LOOP: + ModeRegister |= XUARTPS_MR_CHMODE_R_LOOP; + break; + } + + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_MR_OFFSET, + ModeRegister); + +} + +/****************************************************************************/ +/** +* +* This function sets the Flow Delay. +* 0 - 3: Flow delay inactive +* 4 - 32: If Flow Control mode is enabled, UART_rtsN is deactivated when the +* receive FIFO fills to this level. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return +* +* The Flow Delay is specified by constants defined in xuartps_hw.h. The +* constants are named XUARTPS_FLOWDEL* +* +* @note None. +* +*****************************************************************************/ +u8 XUartPs_GetFlowDelay(XUartPs *InstancePtr) +{ + u32 FdelRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Mode register. + */ + FdelRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_FLOWDEL_OFFSET); + + /* + * Return the contents of the flow delay register + */ + return (u8) (FdelRegister & XUARTPS_FLOWDEL_MASK); +} + +/****************************************************************************/ +/** +* +* This function sets the Flow Delay. +* 0 - 3: Flow delay inactive +* 4 - 63: If Flow Control mode is enabled, UART_rtsN is deactivated when the +* receive FIFO fills to this level. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param FlowDelayValue is the Setting for the flow delay. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XUartPs_SetFlowDelay(XUartPs *InstancePtr, u8 FlowDelayValue) +{ + u32 FdelRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FlowDelayValue > XUARTPS_FLOWDEL_MASK); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Set the correct value by shifting the input constant, then masking + * the bits + */ + FdelRegister = (FlowDelayValue & XUARTPS_FLOWDEL_MASK); + + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_FLOWDEL_OFFSET, FdelRegister); + +} + +/****************************************************************************/ +/** +* +* This function gets the Receive Timeout of the UART. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* +* @return The current setting for receive time out. +* +* @note None. +* +*****************************************************************************/ +u8 XUartPs_GetRecvTimeout(XUartPs *InstancePtr) +{ + u32 RtoRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Recieve Timeout register. + */ + RtoRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_RXTOUT_OFFSET); + + /* + * Return the contents of the mode register shifted appropriately + */ + return (RtoRegister & XUARTPS_RXTOUT_MASK); +} + +/****************************************************************************/ +/** +* +* This function sets the Receive Timeout of the UART. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param RecvTimeout setting allows the UART to detect an idle connection +* on the reciever data line. +* Timeout duration = RecvTimeout x 4 x Bit Period. 0 disables the +* timeout function. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XUartPs_SetRecvTimeout(XUartPs *InstancePtr, u8 RecvTimeout) +{ + u32 RtoRegister; + + /* + * Assert validates the input arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Set the correct value by masking the bits + */ + RtoRegister = (RecvTimeout & XUARTPS_RXTOUT_MASK); + + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, + XUARTPS_RXTOUT_OFFSET, RtoRegister); + + /* + * Configure CR to restart the receiver timeout counter + */ + RtoRegister = + XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_CR_OFFSET); + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_CR_OFFSET, + (RtoRegister | XUARTPS_CR_TORST)); + +} +/****************************************************************************/ +/** +* +* Sets the data format for the device. The data format includes the +* baud rate, number of data bits, number of stop bits, and parity. It is the +* caller's responsibility to ensure that the UART is not sending or receiving +* data when this function is called. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param FormatPtr is a pointer to a format structure containing the data +* format to be set. +* +* @return +* - XST_SUCCESS if the data format was successfully set. +* - XST_UART_BAUD_ERROR indicates the baud rate could not be +* set because of the amount of error with the baud rate and +* the input clock frequency. +* - XST_INVALID_PARAM if one of the parameters was not valid. +* +* @note +* +* The data types in the format type, data bits and parity, are 32 bit fields +* to prevent a compiler warning. +* The asserts in this function will cause a warning if these fields are +* bytes. +* <br><br> +* +*****************************************************************************/ +int XUartPs_SetDataFormat(XUartPs *InstancePtr, + XUartPsFormat * FormatPtr) +{ + int Status; + u32 ModeRegister; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(FormatPtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Verify the inputs specified are valid + */ + if ((FormatPtr->DataBits > XUARTPS_FORMAT_6_BITS) || + (FormatPtr->StopBits > XUARTPS_FORMAT_2_STOP_BIT) || + (FormatPtr->Parity > XUARTPS_FORMAT_NO_PARITY)) { + return XST_INVALID_PARAM; + } + + /* + * Try to set the baud rate and if it's not successful then don't + * continue altering the data format, this is done first to avoid the + * format from being altered when an error occurs + */ + Status = XUartPs_SetBaudRate(InstancePtr, FormatPtr->BaudRate); + if (Status != XST_SUCCESS) { + return Status; + } + + ModeRegister = + XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_MR_OFFSET); + + /* + * Set the length of data (8,7,6) by first clearing out the bits + * that control it in the register, then set the length in the register + */ + ModeRegister &= ~XUARTPS_MR_CHARLEN_MASK; + ModeRegister |= (FormatPtr->DataBits << XUARTPS_MR_CHARLEN_SHIFT); + + /* + * Set the number of stop bits in the mode register by first clearing + * out the bits that control it in the register, then set the number + * of stop bits in the register. + */ + ModeRegister &= ~XUARTPS_MR_STOPMODE_MASK; + ModeRegister |= (FormatPtr->StopBits << XUARTPS_MR_STOPMODE_SHIFT); + + /* + * Set the parity by first clearing out the bits that control it in the + * register, then set the bits in the register, the default is no parity + * after clearing the register bits + */ + ModeRegister &= ~XUARTPS_MR_PARITY_MASK; + ModeRegister |= (FormatPtr->Parity << XUARTPS_MR_PARITY_SHIFT); + + /* + * Update the mode register + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_MR_OFFSET, + ModeRegister); + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* Gets the data format for the specified UART. The data format includes the +* baud rate, number of data bits, number of stop bits, and parity. +* +* @param InstancePtr is a pointer to the XUartPs instance. +* @param FormatPtr is a pointer to a format structure that will contain +* the data format after this call completes. +* +* @return None. +* +* @note None. +* +* +*****************************************************************************/ +void XUartPs_GetDataFormat(XUartPs *InstancePtr, XUartPsFormat * FormatPtr) +{ + u32 ModeRegister; + + + /* + * Assert validates the input arguments + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(FormatPtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Get the baud rate from the instance, this is not retrieved from the + * hardware because it is only kept as a divisor such that it is more + * difficult to get back to the baud rate + */ + FormatPtr->BaudRate = InstancePtr->BaudRate; + + ModeRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_MR_OFFSET); + + /* + * Get the length of data (8,7,6,5) + */ + FormatPtr->DataBits = + (ModeRegister & XUARTPS_MR_CHARLEN_MASK) >> + XUARTPS_MR_CHARLEN_SHIFT; + + /* + * Get the number of stop bits + */ + FormatPtr->StopBits = + (ModeRegister & XUARTPS_MR_STOPMODE_MASK) >> + XUARTPS_MR_STOPMODE_SHIFT; + + /* + * Determine what parity is + */ + FormatPtr->Parity = + (ModeRegister & XUARTPS_MR_PARITY_MASK) >> + XUARTPS_MR_PARITY_SHIFT; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_selftest.c new file mode 100755 index 000000000..42b8cafa9 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_selftest.c @@ -0,0 +1,176 @@ +/***************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_selftest.c +* +* This file contains the self-test functions for the XUartPs driver. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00 drg/jz 01/13/108First Release +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xstatus.h" +#include "xuartps.h" + +/************************** Constant Definitions *****************************/ + + +/**************************** Type Definitions *******************************/ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +#define XUARTPS_TOTAL_BYTES 32 + +/************************** Variable Definitions *****************************/ + +static u8 TestString[XUARTPS_TOTAL_BYTES]="abcdefghABCDEFGH012345677654321"; +static u8 ReturnString[XUARTPS_TOTAL_BYTES]; + +/************************** Function Prototypes ******************************/ + + +/****************************************************************************/ +/** +* +* This function runs a self-test on the driver and hardware device. This self +* test performs a local loopback and verifies data can be sent and received. +* +* The time for this test is proportional to the baud rate that has been set +* prior to calling this function. +* +* The mode and control registers are restored before return. +* +* @param InstancePtr is a pointer to the XUartPs instance +* +* @return +* - XST_SUCCESS if the test was successful +* - XST_UART_TEST_FAIL if the test failed looping back the data +* +* @note +* +* This function can hang if the hardware is not functioning properly. +* +******************************************************************************/ +int XUartPs_SelfTest(XUartPs *InstancePtr) +{ + int Status = XST_SUCCESS; + u32 IntrRegister; + u32 ModeRegister; + u8 Index; + + /* + * Assert validates the input arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Disable all interrupts in the interrupt disable register + */ + IntrRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_IMR_OFFSET); + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IDR_OFFSET, + XUARTPS_IXR_MASK); + + /* + * Setup for local loopback + */ + ModeRegister = XUartPs_ReadReg(InstancePtr->Config.BaseAddress, + XUARTPS_MR_OFFSET); + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_MR_OFFSET, + ((ModeRegister & (~XUARTPS_MR_CHMODE_MASK)) | + XUARTPS_MR_CHMODE_L_LOOP)); + + /* + * Send a number of bytes and receive them, one at a time. + */ + for (Index = 0; Index < XUARTPS_TOTAL_BYTES; Index++) { + /* + * Send out the byte and if it was not sent then the failure + * will be caught in the comparison at the end + */ + XUartPs_Send(InstancePtr, &TestString[Index], 1); + + /* + * Wait until the byte is received. This can hang if the HW + * is broken. Watch for the FIFO empty flag to be false. + */ + while (!(XUartPs_IsReceiveData(InstancePtr->Config. + BaseAddress))); + + /* + * Receive the byte + */ + XUartPs_Recv(InstancePtr, &ReturnString[Index], 1); + } + + /* + * Compare the bytes received to the bytes sent to verify the exact data + * was received + */ + for (Index = 0; Index < XUARTPS_TOTAL_BYTES; Index++) { + if (TestString[Index] != ReturnString[Index]) { + Status = XST_UART_TEST_FAIL; + } + } + + /* + * Restore the registers which were altered to put into polling and + * loopback modes so that this test is not destructive + */ + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_IER_OFFSET, + IntrRegister); + XUartPs_WriteReg(InstancePtr->Config.BaseAddress, XUARTPS_MR_OFFSET, + ModeRegister); + + return Status; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_sinit.c new file mode 100755 index 000000000..4a2c7d1a8 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/uartps_v1_05_a/src/xuartps_sinit.c @@ -0,0 +1,104 @@ +/***************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +*****************************************************************************/ +/****************************************************************************/ +/** +* +* @file xuartps_sinit.c +* +* The implementation of the XUartPs driver's static initialzation +* functionality. +* +* <pre> +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ------ -------- ----------------------------------------------- +* 1.00 drg/jz 01/13/10 First Release +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xstatus.h" +#include "xparameters.h" +#include "xuartps.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ +extern XUartPs_Config XUartPs_ConfigTable[]; + +/************************** Function Prototypes *****************************/ + +/****************************************************************************/ +/** +* +* Looks up the device configuration based on the unique device ID. The table +* contains the configuration info for each device in the system. +* +* @param DeviceId contains the ID of the device +* +* @return A pointer to the configuration structure or NULL if the +* specified device is not in the system. +* +* @note None. +* +******************************************************************************/ +XUartPs_Config *XUartPs_LookupConfig(u16 DeviceId) +{ + XUartPs_Config *CfgPtr = NULL; + + int Index; + + for (Index = 0; Index < XPAR_XUARTPS_NUM_INSTANCES; Index++) { + if (XUartPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XUartPs_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/Makefile new file mode 100755 index 000000000..7cf97e2f0 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xusbps_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling usbps" + +xusbps_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xusbps_includes + +xusbps_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps.c new file mode 100755 index 000000000..82344db51 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps.c @@ -0,0 +1,437 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/******************************************************************************/ +/** + * @file xusbps.c + * + * The XUsbPs driver. Functions in this file are the minimum required + * functions for this driver. See xusbps.h for a detailed description of the + * driver. + * + * @note None. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- -------------------------------------------------------- + * 1.00a jz 10/10/10 First release + * </pre> + ******************************************************************************/ + +/***************************** Include Files **********************************/ +#include <stdio.h> +#include "xusbps.h" + +/************************** Constant Definitions ******************************/ + +/**************************** Type Definitions ********************************/ + +/***************** Macros (Inline Functions) Definitions **********************/ + +/************************** Variable Definitions ******************************/ + +/************************** Function Prototypes *******************************/ + +/*****************************************************************************/ +/** +* +* This function initializes a XUsbPs instance/driver. +* +* The initialization entails: +* - Initialize all members of the XUsbPs structure. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param ConfigPtr is a pointer to a XUsbPs_Config configuration +* structure. This structure will contain the requested +* configuration for the device. Typically, this is a local +* structure and the content of which will be copied into the +* configuration structure within XUsbPs. +* @param VirtBaseAddress is the base address of the device. For systems +* with virtual memory, this address must be the virtual address +* of the device. +* For systems that do not support virtual memory this address +* should be the physical address of the device. For backwards +* compatibilty NULL may be passed in systems that do not support +* virtual memory (deprecated). +* +* @return +* - XST_SUCCESS no errors occured. +* - XST_FAILURE an error occured during initialization. +* +* @note +* After calling XUsbPs_CfgInitialize() the controller +* IS NOT READY for use. Before the controller can be used its +* DEVICE parameters must be configured. See xusbps.h +* for details. +* +******************************************************************************/ +int XUsbPs_CfgInitialize(XUsbPs *InstancePtr, + const XUsbPs_Config *ConfigPtr, u32 VirtBaseAddress) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + /* Copy the config structure. */ + InstancePtr->Config = *ConfigPtr; + + /* Check if the user provided a non-NULL base address. If so, we have + * to overwrite the base address in the configuration structure. + */ + if (0 != VirtBaseAddress) { + InstancePtr->Config.BaseAddress = VirtBaseAddress; + } + + /* Initialize the XUsbPs structure to default values. */ + InstancePtr->CurrentAltSetting = XUSBPS_DEFAULT_ALT_SETTING; + + InstancePtr->HandlerFunc = NULL; + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* +* This function performs device reset, device is stopped at the end. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XUsbPs_DeviceReset(XUsbPs *InstancePtr) +{ + int Timeout; + + /* Clear all setup token semaphores by reading the + * XUSBPS_EPSTAT_OFFSET register and writing its value back to + * itself. + */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, XUSBPS_EPSTAT_OFFSET, + XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPSTAT_OFFSET)); + + /* Clear all the endpoint complete status bits by reading the + * XUSBPS_EPCOMPL_OFFSET register and writings its value back + * to itself. + */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, XUSBPS_EPCOMPL_OFFSET, + XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPCOMPL_OFFSET)); + + /* Cancel all endpoint prime status by waiting until all bits + * in XUSBPS_EPPRIME_OFFSET are 0 and then writing 0xFFFFFFFF + * to XUSBPS_EPFLUSH_OFFSET. + * + * Avoid hanging here by using a Timeout counter... + */ + Timeout = XUSBPS_TIMEOUT_COUNTER; + while ((XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPPRIME_OFFSET) & + XUSBPS_EP_ALL_MASK) && --Timeout) { + /* NOP */ + } + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPFLUSH_OFFSET, 0xFFFFFFFF); + + XUsbPs_Stop(InstancePtr); + + /* Write to CR register for controller reset */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, XUSBPS_CMD_OFFSET, + XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_CMD_OFFSET) | XUSBPS_CMD_RST_MASK); + + /* Wait for reset to finish, hardware clears the reset bit once done */ + Timeout = 1000000; + while((XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_CMD_OFFSET) & + XUSBPS_CMD_RST_MASK) && --Timeout) { + /* NOP */ + } +} +/*****************************************************************************/ +/** +* +* This function resets the USB device. All the configuration registers are +* reset to their default values. The function waits until the reset operation +* is complete or for a certain duration within which the reset operation is +* expected to be completed. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @return +* - XST_SUCCESS Reset operation completed successfully. +* - XST_FAILURE Reset operation timed out. +* +* @note None. +* +******************************************************************************/ +int XUsbPs_Reset(XUsbPs *InstancePtr) +{ + int Timeout; + + Xil_AssertNonvoid(InstancePtr != NULL); + + /* Write a 1 to the RESET bit. The RESET bit is cleared by HW once the + * RESET is complete. + * + * We are going to wait for the RESET bit to clear before we return + * from this function. Unfortunately we do not have timers available at + * this point to determine when we should report a Timeout. + * + * However, by using a large number for the poll loop we can assume + * that the polling operation will take longer than the expected time + * the HW needs to RESET. If the poll loop expires we can assume a + * Timeout. The drawback is that on a slow system (and even on a fast + * system) this can lead to _very_ long Timeout periods. + */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_CMD_OFFSET, XUSBPS_CMD_RST_MASK); + + + /* Wait for the RESET bit to be cleared by HW. */ + Timeout = XUSBPS_TIMEOUT_COUNTER; + while ((XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_CMD_OFFSET) & + XUSBPS_CMD_RST_MASK) && --Timeout) { + /* NOP */ + } + + if (0 == Timeout) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** + * USB Suspend + * + * In order to conserve power, USB devices automatically enter the suspended + * state when the device has observed no bus traffic for a specified period. + * When suspended, the USB device maintains any internal status, including its + * address and configuration. Attached devices must be prepared to suspend at + * any time they are powered, regardless of if they have been assigned a + * non-default address, are configured, or neither. Bus activity may cease due + * to the host entering a suspend mode of its own. In addition, a USB device + * shall also enter the suspended state when the hub port it is attached to is + * disabled. + * + * A USB device exits suspend mode when there is bus activity. A USB device may + * also request the host to exit suspend mode or selective suspend by using + * electrical signaling to indicate remote wakeup. The ability of a device to + * signal remote wakeup is optional. If the USB device is capable of remote + * wakeup signaling, the device must support the ability of the host to enable + * and disable this capability. When the device is reset, remote wakeup + * signaling must be disabled. + * + * @param InstancePtr is a pointer to XUsbPs instance of the controller. + * + * @return + * - XST_SUCCESS if the USB device has entered Suspend mode + * successfully + * - XST_FAILURE on any error + * + * @note None. + * + ******************************************************************************/ +int XUsbPs_Suspend(const XUsbPs *InstancePtr) +{ + (void) InstancePtr; + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* USB Resume +* + If the USB controller is suspended, its operation is resumed when any +* non-idle signaling is received on its upstream facing port. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @return +* - XST_SUCCESS if the USB device has Resumed successfully +* - XST_FAILURE on any error +* +* @note None. +* +******************************************************************************/ +int XUsbPs_Resume(const XUsbPs *InstancePtr) +{ + (void) InstancePtr; + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* USB Assert Resume +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @return +* - XST_SUCCESS if the USB device has Resumed successfully +* - XST_FAILURE on any error +* +* @note None. +* +******************************************************************************/ + +int XUsbPs_RequestHostResume(const XUsbPs *InstancePtr) +{ + (void) InstancePtr; + return XST_SUCCESS; +} + + +/****************************************************************************/ +/** + * This function returns the size of the DMAable memory required by the driver + * to store the Endpoint Device Queue Head List, the Transfer Descriptors and + * all OUT (receive) Transfer Descriptor buffers. + * + * @param CfgPtr is pointer to the XUsbPs_DeviceConfig instance of the + * controller. + * + * @return The number of bytes of DMAable memory required. + * Returns 0 on error. + * + * @note + * All the endpoint parameters in the XUsbPs_DeviceConfig data + * structure must be configured to their desired values before + * calling this function. + * + *****************************************************************************/ +u32 XUsbPs_DeviceMemRequired(const XUsbPs_DeviceConfig *CfgPtr) +{ + int EndPointNum; + u32 Size; + + Xil_AssertNonvoid(NULL != CfgPtr); + + /* Start with the amount required to be able to align the allocated + * memory block to XUSBPS_dQH_BASE_ALIGN. The first data structure put + * into this memory block is the Device Queue Head List which must be + * aligned at a XUSBPS_dQH_BASE_ALIGN boundary. + */ + Size = XUSBPS_dQH_BASE_ALIGN; + + /* Add the size required for the Queue Heads. There are 2 Queue Heads + * per Endpoint. We need to allocate memory even for endpoints that are + * not used. + */ + Size += CfgPtr->NumEndpoints * 2 * XUSBPS_dQH_ALIGN; + + /* Add the size required for the Transfer Descriptors and the OUT + * buffers. + */ + for (EndPointNum = 0; EndPointNum < CfgPtr->NumEndpoints; EndPointNum++) { + if (XUSBPS_EP_TYPE_NONE != CfgPtr->EpCfg[EndPointNum].Out.Type) { + /* Memory required for OUT Transfer Descriptors. + */ + Size += CfgPtr->EpCfg[EndPointNum].Out.NumBufs * + XUSBPS_dTD_ALIGN; + /* Memory required for OUT buffers. + */ + Size += CfgPtr->EpCfg[EndPointNum].Out.NumBufs * + CfgPtr->EpCfg[EndPointNum].Out.BufSize; + } + + + if (XUSBPS_EP_TYPE_NONE != CfgPtr->EpCfg[EndPointNum].In.Type) { + /* Memory required for IN Transfer Descriptors. + */ + Size += CfgPtr->EpCfg[EndPointNum].In.NumBufs * + XUSBPS_dTD_ALIGN; + } + + } + + return Size; +} + + +/****************************************************************************/ +/** +* This functions sets the controller's DEVICE address. It also sets the +* advance bit so the controller will wait for the next IN-ACK before the new +* address takes effect. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param Address is the Address of the device. +* +* @return +* - XST_SUCCESS: Address set successfully. +* - XST_FAILURE: An error occured. +* - XST_INVALID_PARAM: Invalid parameter passed, e.g. address +* value too big. +* +* @note None. +* +*****************************************************************************/ +int XUsbPs_SetDeviceAddress(XUsbPs *InstancePtr, u8 Address) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + + /* Check address range validity. */ + if (Address > XUSBPS_DEVICEADDR_MAX) { + return XST_INVALID_PARAM; + } + + /* Set the address register with the Address value provided. Also set + * the Address Advance Bit. This will cause the address to be set only + * after an IN occured and has been ACKed on the endpoint. + */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_DEVICEADDR_OFFSET, + (Address << XUSBPS_DEVICEADDR_ADDR_SHIFT) | + XUSBPS_DEVICEADDR_DEVICEAADV_MASK); + + return XST_SUCCESS; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps.h new file mode 100755 index 000000000..a4a552393 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps.h @@ -0,0 +1,1091 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps.h + * + * This file contains the implementation of the XUsbPs driver. It is the + * driver for an USB controller in DEVICE or HOST mode. + * + * <h2>Introduction</h2> + * + * The Spartan-3AF Embedded Peripheral Block contains a USB controller for + * communication with serial peripherals or hosts. The USB controller supports + * Host, Device and On the Go (OTG) applications. + * + * <h2>USB Controller Features</h2> + * + * - Supports Low Speed USB 1.1 (1.5Mbps), Full Speed USB 1.1 (12Mbps), and + * High Speed USB 2.0 (480Mbps) data speeds + * - Supports Device, Host and OTG operational modes + * - ULPI transceiver interface for USB 2.0 operation + * - Integrated USB Full and Low speed serial transceiver interfaces for lowest + * cost connections + * + * <h2>Initialization & Configuration</h2> + * + * The configuration of the USB driver happens in multiple stages: + * + * - (a) Configuration of the basic parameters: + * In this stage the basic parameters for the driver are configured, + * including the base address and the controller ID. + * + * - (b) Configuration of the DEVICE endpoints (if applicable): + * If DEVICE mode is desired, the endpoints of the controller need to be + * configured using the XUsbPs_DeviceConfig data structure. Once the + * endpoint configuration is set up in the data structure, the user needs to + * call XUsbPs_DeviceMemRequired() to obtain the required size of DMAable + * memory that the driver needs for operation with the given configuration. + * The user then needs to allocate the required amount of DMAable memory and + * finalize the configuration of the XUsbPs_DeviceConfig data structure, + * e.g. setting the DMAMemVirt and DMAMemPhys members. + * + * - (c) Configuration of the DEVICE modes: + * In the second stage the parameters for DEVICE are configured. + * The caller only needs to configure the modes that are + * actually used. Configuration is done with the: + * XUsbPs_ConfigureDevice() + * Configuration parameters are defined and passed + * into these functions using the: + * XUsbPs_DeviceConfig data structures. + * + * + * <h2>USB Device Endpoints</h2> + * + * The USB core supports up to 4 endpoints. Each endpoint has two directions, + * an OUT (RX) and an IN (TX) direction. Note that the direction is viewed from + * the host's perspective. Endpoint 0 defaults to be the control endpoint and + * does not need to be set up. Other endpoints need to be configured and set up + * depending on the application. Only endpoints that are actuelly used by the + * application need to be initialized. + * See the example code (xusbps_intr_example.c) for more information. + * + * + * <h2>Interrupt Handling</h2> + * + * The USB core uses one interrupt line to report interrupts to the CPU. + * Interrupts are handled by the driver's interrupt handler function + * XUsbPs_IntrHandler(). + * It has to be registered with the OS's interrupt subsystem. The driver's + * interrupt handler divides incoming interrupts into two categories: + * + * - General device interrupts + * - Endopint related interrupts + * + * The user (typically the adapter layer) can register general interrupt + * handler fucntions and endpoint specific interrupt handler functions with the + * driver to receive those interrupts by calling the + * XUsbPs_IntrSetHandler() + * and + * XUsbPs_EpSetHandler() + * functions respectively. Calling these functions with a NULL pointer as the + * argument for the function pointer will "clear" the handler function. + * + * The user can register one handler function for the generic interrupts and + * two handler functions for each endpoint, one for the RX (OUT) and one for + * the TX (IN) direction. For some applications it may be useful to register a + * single endpoint handler function for muliple endpoints/directions. + * + * When a callback function is called by the driver, parameters identifying the + * type of the interrupt will be passed into the handler functions. For general + * interrupts the interrupt mask will be passed into the handler function. For + * endpoint interrupts the parameters include the number of the endpoint, the + * direction (OUT/IN) and the type of the interrupt. + * + * + * <h2>Data buffer handling</h2> + * + * Data buffers are sent to and received from endpoint using the + * XUsbPs_EpBufferSend() + * and + * XUsbPs_EpBufferReceive() + * functions. + * + * User data buffer size is limited to 16 Kbytes. If the user wants to send a + * data buffer that is bigger than this limit it needs to break down the data + * buffer into multiple fragments and send the fragments individually. + * + * Data buffers can be aligned at any boundary. + * + * + * <h3>Zero copy</h3> + * + * The driver uses a zero copy mechanism which imposes certain restrictions to + * the way the user can handle the data buffers. + * + * One restriction is that the user needs to release a buffer after it is done + * processing the data in the buffer. + * + * Similarly, when the user sends a data buffer it MUST not re-use the buffer + * until it is notified by the driver that the buffer has been transmitted. The + * driver will notify the user via the registered endpoint interrupt handling + * function by sending a XUSBPS_EP_EVENT_DATA_TX event. + * + * + * <h2>DMA</h2> + * + * The driver uses DMA internally to move data from/to memory. This behaviour + * is transparent to the user. Keeping the DMA handling hidden from the user + * has the advantage that the same API can be used with USB cores that do not + * support DMA. + * + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ---------------------------------------------------------- + * 1.00a wgr 10/10/10 First release + * 1.02a wgr 05/16/12 Removed comments as they are showing up in SDK + * Tabs for CR 657898 + * 1.03a nm 09/21/12 Fixed CR#678977. Added proper sequence for setup packet + * handling. + * 1.04a nm 10/23/12 Fixed CR# 679106. + * 11/02/12 Fixed CR# 683931. Mult bits are set properly in dQH. + * </pre> + * + ******************************************************************************/ + +#ifndef XUSBPS_H +#define XUSBPS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xusbps_hw.h" +#include "xil_types.h" +#include "xstatus.h" + +/************************** Constant Definitions *****************************/ + +/** + * @name System hang prevention Timeout counter value. + * + * This value is used throughout the code to initialize a Timeout counter that + * is used when hard polling a register. The ides is to initialize the Timeout + * counter to a value that is longer than any expected Timeout but short enough + * so the system will continue to work and report an error while the user is + * still paying attention. A reasonable Timeout time would be about 10 seconds. + * The XUSBPS_TIMEOUT_COUNTER value should be chosen so a polling loop would + * run about 10 seconds before a Timeout is detected. For example: + * + * int Timeout = XUSBPS_TIMEOUT_COUNTER; + * while ((XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + * XUSBPS_CMD_OFFSET) & + * XUSBPS_CMD_RST_MASK) && --Timeout) { + * ; + * } + * if (0 == Timeout) { + * return XST_FAILURE; + * } + * + */ +#define XUSBPS_TIMEOUT_COUNTER 1000000 + + +/** + * @name Endpoint Direction (bitmask) + * Definitions to be used with Endpoint related function that require a + * 'Direction' parameter. + * + * NOTE: + * The direction is always defined from the perspective of the HOST! This + * means that an IN endpoint on the controller is used for sending data while + * the OUT endpoint on the controller is used for receiving data. + * @{ + */ +#define XUSBPS_EP_DIRECTION_IN 0x01 /**< Endpoint direction IN. */ +#define XUSBPS_EP_DIRECTION_OUT 0x02 /**< Endpoint direction OUT. */ +/* @} */ + + +/** + * @name Endpoint Type + * Definitions to be used with Endpoint related functions that require a 'Type' + * parameter. + * @{ + */ +#define XUSBPS_EP_TYPE_NONE 0 /**< Endpoint is not used. */ +#define XUSBPS_EP_TYPE_CONTROL 1 /**< Endpoint for Control Transfers */ +#define XUSBPS_EP_TYPE_ISOCHRONOUS 2 /**< Endpoint for isochronous data */ +#define XUSBPS_EP_TYPE_BULK 3 /**< Endpoint for BULK Transfers. */ +#define XUSBPS_EP_TYPE_INTERRUPT 4 /**< Endpoint for interrupt Transfers */ +/* @} */ + +/** + * Endpoint Max Packet Length in DeviceConfig is a coded value, ch9.6.6. + * + * @{ + */ +#define ENDPOINT_MAXP_LENGTH 0x400 +#define ENDPOINT_MAXP_MULT_MASK 0xC00 +#define ENDPOINT_MAXP_MULT_SHIFT 10 +/* @} */ + +/** + * @name Field names for status retrieval + * Definitions for the XUsbPs_GetStatus() function call 'StatusType' + * parameter. + * @{ + */ +#define XUSBPS_EP_STS_ADDRESS 1 /**< Address of controller. */ +#define XUSBPS_EP_STS_CONTROLLER_STATE 2 /**< Current controller state. */ +/* @} */ + + + +/** + * @name USB Default alternate setting + * + * @{ + */ +#define XUSBPS_DEFAULT_ALT_SETTING 0 /**< The default alternate setting is 0 */ +/* @} */ + +/** + * @name Endpoint event types + * Definitions that are used to identify events that occur on endpoints. Passed + * to the endpoint event handler functions registered with + * XUsbPs_EpSetHandler(). + * @{ + */ +#define XUSBPS_EP_EVENT_SETUP_DATA_RECEIVED 0x01 + /**< Setup data has been received on the enpoint. */ +#define XUSBPS_EP_EVENT_DATA_RX 0x02 + /**< Data frame has been received on the endpoint. */ +#define XUSBPS_EP_EVENT_DATA_TX 0x03 + /**< Data frame has been sent on the endpoint. */ +/* @} */ + + +/* + * Maximum packet size for endpoint, 1024 + * @{ + */ +#define XUSBPS_MAX_PACKET_SIZE 1024 + /**< Maximum value can be put into the queue head */ +/* @} */ +/**************************** Type Definitions *******************************/ + +/****************************************************************************** + * This data type defines the callback function to be used for Endpoint + * handlers. + * + * @param CallBackRef is the Callback reference passed in by the upper + * layer when setting the handler, and is passed back to the upper + * layer when the handler is called. + * @param EpNum is the Number of the endpoint that caused the event. + * @param EventType is the type of the event that occured on the endpoint. + * @param Data is a pointer to user data pointer specified when callback + * was registered. + */ +typedef void (*XUsbPs_EpHandlerFunc)(void *CallBackRef, + u8 EpNum, u8 EventType, void *Data); + + +/****************************************************************************** + * This data type defines the callback function to be used for the general + * interrupt handler. + * + * @param CallBackRef is the Callback reference passed in by the upper + * layer when setting the handler, and is passed back to the upper + * layer when the handler is called. + * @param IrqMask is the Content of the interrupt status register. This + * value can be used by the callback function to distinguish the + * individual interrupt types. + */ +typedef void (*XUsbPs_IntrHandlerFunc)(void *CallBackRef, u32 IrqMask); + + +/******************************************************************************/ + +/* The following type definitions are used for referencing Queue Heads and + * Transfer Descriptors. The structures themselves are not used, however, the + * types are used in the API to avoid using (void *) pointers. + */ +typedef u8 XUsbPs_dQH[XUSBPS_dQH_ALIGN]; +typedef u8 XUsbPs_dTD[XUSBPS_dTD_ALIGN]; + + +/** + * The following data structures are used internally by the L0/L1 driver. + * Their contents MUST NOT be changed by the upper layers. + */ + +/** + * The following data structure represents OUT endpoint. + */ +typedef struct { + XUsbPs_dQH *dQH; + /**< Pointer to the Queue Head structure of the endpoint. */ + + XUsbPs_dTD *dTDs; + /**< Pointer to the first dTD of the dTD list for this + * endpoint. */ + + XUsbPs_dTD *dTDCurr; + /**< Buffer to the currently processed descriptor. */ + + u8 *dTDBufs; + /**< Pointer to the first buffer of the buffer list for this + * endpoint. */ + + XUsbPs_EpHandlerFunc HandlerFunc; + /**< Handler function for this endpoint. */ + void *HandlerRef; + /**< User data reference for the handler. */ +} XUsbPs_EpOut; + + +/** + * The following data structure represents IN endpoint. + */ +typedef struct { + XUsbPs_dQH *dQH; + /**< Pointer to the Queue Head structure of the endpoint. */ + + XUsbPs_dTD *dTDs; + /**< List of pointers to the Transfer Descriptors of the + * endpoint. */ + + XUsbPs_dTD *dTDHead; + /**< Buffer to the next available descriptor in the list. */ + + XUsbPs_dTD *dTDTail; + /**< Buffer to the last unsent descriptor in the list*/ + + XUsbPs_EpHandlerFunc HandlerFunc; + /**< Handler function for this endpoint. */ + void *HandlerRef; + /**< User data reference for the handler. */ +} XUsbPs_EpIn; + + +/** + * The following data structure represents an endpoint used internally + * by the L0/L1 driver. + */ +typedef struct { + /* Each endpoint has an OUT and an IN component. + */ + XUsbPs_EpOut Out; /**< OUT endpoint structure */ + XUsbPs_EpIn In; /**< IN endpoint structure */ +} XUsbPs_Endpoint; + + + +/** + * The following structure is used by the user to receive Setup Data from an + * endpoint. Using this structure simplifies the process of interpreting the + * setup data in the core's data fields. + * + * The naming scheme for the members of this structure is different from the + * naming scheme found elsewhere in the code. The members of this structure are + * defined in the Chapter 9 USB reference guide. Using this naming scheme makes + * it easier for people familiar with the standard to read the code. + */ +typedef struct { + u8 bmRequestType; /**< bmRequestType in setup data */ + u8 bRequest; /**< bRequest in setup data */ + u16 wValue; /**< wValue in setup data */ + u16 wIndex; /**< wIndex in setup data */ + u16 wLength; /**< wLength in setup data */ +} +XUsbPs_SetupData; + + +/** + * Data structures used to configure endpoints. + */ +typedef struct { + u32 Type; + /**< Endpoint type: + - XUSBPS_EP_TYPE_CONTROL + - XUSBPS_EP_TYPE_ISOCHRONOUS + - XUSBPS_EP_TYPE_BULK + - XUSBPS_EP_TYPE_INTERRUPT */ + + u32 NumBufs; + /**< Number of buffers to be handled by this endpoint. */ + u32 BufSize; + /**< Buffer size. Only relevant for OUT (receive) Endpoints. */ + + u16 MaxPacketSize; + /**< Maximum packet size for this endpoint. This number will + * define the maximum number of bytes sent on the wire per + * transaction. Range: 0..1024 */ +} XUsbPs_EpSetup; + + +/** + * Endpoint configuration structure. + */ +typedef struct { + XUsbPs_EpSetup Out; /**< OUT component of endpoint. */ + XUsbPs_EpSetup In; /**< IN component of endpoint. */ +} XUsbPs_EpConfig; + + +/** + * The XUsbPs_DeviceConfig structure contains the configuration information to + * configure the USB controller for DEVICE mode. This data structure is used + * with the XUsbPs_ConfigureDevice() function call. + */ +typedef struct { + u8 NumEndpoints; /**< Number of Endpoints for the controller. + This number depends on the runtime + configuration of driver. The driver may + configure fewer endpoints than are available + in the core. */ + + XUsbPs_EpConfig EpCfg[XUSBPS_MAX_ENDPOINTS]; + /**< List of endpoint configurations. */ + + u32 DMAMemVirt; /**< Virtual base address of DMAable memory + allocated for the driver. */ + + u32 DMAMemPhys; /**< Physical base address of DMAable memory + allocated for the driver. */ + + /* The following members are used internally by the L0/L1 driver. They + * MUST NOT be accesses and/or modified in any way by the upper layers. + * + * The reason for having these members is that we generally try to + * avoid allocating memory in the L0/L1 driver as we want to be OS + * independent. In order to avoid allocating memory for this data + * structure wihin L0/L1 we put it into the XUsbPs_DeviceConfig + * structure which is allocated by the caller. + */ + XUsbPs_Endpoint Ep[XUSBPS_MAX_ENDPOINTS]; + /**< List of endpoint metadata structures. */ + + u32 PhysAligned; /**< 64 byte aligned base address of the DMA + memory block. Will be computed and set by + the L0/L1 driver. */ +} XUsbPs_DeviceConfig; + + +/** + * The XUsbPs_Config structure contains configuration information for the USB + * controller. + * + * This structure only contains the basic configuration for the controller. The + * caller also needs to initialize the controller for the DEVICE mode + * using the XUsbPs_DeviceConfig data structures with the + * XUsbPs_ConfigureDevice() function call + */ +typedef struct { + u16 DeviceID; /**< Unique ID of controller. */ + u32 BaseAddress; /**< Core register base address. */ +} XUsbPs_Config; + + +/** + * The XUsbPs driver instance data. The user is required to allocate a + * variable of this type for every USB controller in the system. A pointer to a + * variable of this type is then passed to the driver API functions. + */ +typedef struct { + XUsbPs_Config Config; /**< Configuration structure */ + + int CurrentAltSetting; /**< Current alternative setting of interface */ + + void *UserDataPtr; /**< Data pointer to be used by upper layers to + store application dependent data structures. + The upper layers are responsible to allocated + and free the memory. The driver will not + mofidy this data pointer. */ + + /** + * The following structures hold the configuration for DEVICE mode + * of the controller. They are initialized using the + * XUsbPs_ConfigureDevice() function call. + */ + XUsbPs_DeviceConfig DeviceConfig; + /**< Configuration for the DEVICE mode. */ + + XUsbPs_IntrHandlerFunc HandlerFunc; + /**< Handler function for the controller. */ + void *HandlerRef; + /**< User data reference for the handler. */ + u32 HandlerMask; + /**< User interrupt mask. Defines which interrupts will cause + * the callback to be called. */ +} XUsbPs; + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************** + * + * USB CONTROLLER RELATED MACROS + * + ******************************************************************************/ +/*****************************************************************************/ +/** + * This macro returns the current frame number. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * + * @return The current frame number. + * + * @note C-style signature: + * u32 XUsbPs_GetFrameNum(const XUsbPs *InstancePtr) + * + ******************************************************************************/ +#define XUsbPs_GetFrameNum(InstancePtr) \ + XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, XUSBPS_FRAME_OFFSET) + + +/*****************************************************************************/ +/** + * This macro starts the USB engine. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * + * @note C-style signature: + * void XUsbPs_Start(XUsbPs *InstancePtr) + * + ******************************************************************************/ +#define XUsbPs_Start(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_CMD_OFFSET, XUSBPS_CMD_RS_MASK) + + +/*****************************************************************************/ +/** + * This macro stops the USB engine. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * + * @note C-style signature: + * void XUsbPs_Stop(XUsbPs *InstancePtr) + * + ******************************************************************************/ +#define XUsbPs_Stop(InstancePtr) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_CMD_OFFSET, XUSBPS_CMD_RS_MASK) + + +/*****************************************************************************/ +/** + * This macro forces the USB engine to be in Full Speed (FS) mode. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * + * @note C-style signature: + * void XUsbPs_ForceFS(XUsbPs *InstancePtr) + * + ******************************************************************************/ +#define XUsbPs_ForceFS(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_PORTSCR1_OFFSET, \ + XUSBPS_PORTSCR_PFSC_MASK) + + +/*****************************************************************************/ +/** + * This macro starts the USB Timer 0, with repeat option for period of + * one second. + * + * @param InstancePtr is a pointer to XUsbPs instance of the controller. + * @param Interval is the interval for Timer0 to generate an interrupt + * + * @note C-style signature: + * void XUsbPs_StartTimer0(XUsbPs *InstancePtr, u32 Interval) + * + ******************************************************************************/ +#define XUsbPs_StartTimer0(InstancePtr, Interval) \ +{ \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_TIMER0_LD_OFFSET, (Interval)); \ + XUsbPs_SetBits(InstancePtr, XUSBPS_TIMER0_CTL_OFFSET, \ + XUSBPS_TIMER_RUN_MASK | \ + XUSBPS_TIMER_RESET_MASK | \ + XUSBPS_TIMER_REPEAT_MASK); \ +} \ + + +/*****************************************************************************/ +/** +* This macro stops Timer 0. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_StopTimer0(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_StopTimer0(InstancePtr) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_TIMER0_CTL_OFFSET, \ + XUSBPS_TIMER_RUN_MASK) + + +/*****************************************************************************/ +/** +* This macro reads Timer 0. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_ReadTimer0(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_ReadTimer0(InstancePtr) \ + XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_TIMER0_CTL_OFFSET) & \ + XUSBPS_TIMER_COUNTER_MASK + + +/*****************************************************************************/ +/** +* This macro force remote wakeup on host +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_RemoteWakeup(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_RemoteWakeup(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_PORTSCR1_OFFSET, \ + XUSBPS_PORTSCR_FPR_MASK) + + +/****************************************************************************** + * + * ENDPOINT RELATED MACROS + * + ******************************************************************************/ +/*****************************************************************************/ +/** +* This macro enables the given endpoint for the given direction. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is number of the endpoint to enable. +* @param Dir is direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpEnable(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpEnable(InstancePtr, EpNum, Dir) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_EPCRn_OFFSET(EpNum), \ + ((Dir) & XUSBPS_EP_DIRECTION_OUT ? XUSBPS_EPCR_RXE_MASK : 0) | \ + ((Dir) & XUSBPS_EP_DIRECTION_IN ? XUSBPS_EPCR_TXE_MASK : 0)) + + +/*****************************************************************************/ +/** +* This macro disables the given endpoint for the given direction. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is the number of the endpoint to disable. +* @param Dir is the direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpDisable(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpDisable(InstancePtr, EpNum, Dir) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_EPCRn_OFFSET(EpNum), \ + ((Dir) & XUSBPS_EP_DIRECTION_OUT ? XUSBPS_EPCR_RXE_MASK : 0) | \ + ((Dir) & XUSBPS_EP_DIRECTION_IN ? XUSBPS_EPCR_TXE_MASK : 0)) + + +/*****************************************************************************/ +/** +* This macro stalls the given endpoint for the given direction, and flush +* the buffers. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is number of the endpoint to stall. +* @param Dir is the direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpStall(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpStall(InstancePtr, EpNum, Dir) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_EPCRn_OFFSET(EpNum), \ + ((Dir) & XUSBPS_EP_DIRECTION_OUT ? XUSBPS_EPCR_RXS_MASK : 0) | \ + ((Dir) & XUSBPS_EP_DIRECTION_IN ? XUSBPS_EPCR_TXS_MASK : 0)) + + +/*****************************************************************************/ +/** +* This macro unstalls the given endpoint for the given direction. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is the Number of the endpoint to unstall. +* @param Dir is the Direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpUnStall(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpUnStall(InstancePtr, EpNum, Dir) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_EPCRn_OFFSET(EpNum), \ + ((Dir) & XUSBPS_EP_DIRECTION_OUT ? XUSBPS_EPCR_RXS_MASK : 0) | \ + ((Dir) & XUSBPS_EP_DIRECTION_IN ? XUSBPS_EPCR_TXS_MASK : 0)) + + +/*****************************************************************************/ +/** +* This macro flush an endpoint upon interface disable +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is the number of the endpoint to flush. +* @param Dir is the direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @note C-style signature: +* void XUsbPs_EpFlush(XUsbPs *InstancePtr, u8 EpNum, u8 Dir) +* +******************************************************************************/ +#define XUsbPs_EpFlush(InstancePtr, EpNum, Dir) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_EPFLUSH_OFFSET, \ + EpNum << ((Dir) & XUSBPS_EP_DIRECTION_OUT ? \ + XUSBPS_EPFLUSH_RX_SHIFT:XUSBPS_EPFLUSH_TX_SHIFT)) \ + +/*****************************************************************************/ +/** +* This macro enables the interrupts defined by the bit mask. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param IntrMask is the Bit mask of interrupts to be enabled. +* +* @note C-style signature: +* void XUsbPs_IntrEnable(XUsbPs *InstancePtr, u32 IntrMask) +* +******************************************************************************/ +#define XUsbPs_IntrEnable(InstancePtr, IntrMask) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_IER_OFFSET, IntrMask) + + +/*****************************************************************************/ +/** +* This function disables the interrupts defined by the bit mask. +* +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param IntrMask is a Bit mask of interrupts to be disabled. +* +* @note C-style signature: +* void XUsbPs_IntrDisable(XUsbPs *InstancePtr, u32 IntrMask) +* +******************************************************************************/ +#define XUsbPs_IntrDisable(InstancePtr, IntrMask) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_IER_OFFSET, IntrMask) + + +/*****************************************************************************/ +/** +* This macro enables the endpoint NAK interrupts defined by the bit mask. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param NakIntrMask is the Bit mask of endpoint NAK interrupts to be +* enabled. +* @note C-style signature: +* void XUsbPs_NakIntrEnable(XUsbPs *InstancePtr, u32 NakIntrMask) +* +******************************************************************************/ +#define XUsbPs_NakIntrEnable(InstancePtr, NakIntrMask) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_EPNAKIER_OFFSET, NakIntrMask) + + +/*****************************************************************************/ +/** +* This macro disables the endpoint NAK interrupts defined by the bit mask. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param NakIntrMask is a Bit mask of endpoint NAK interrupts to be +* disabled. +* +* @note +* C-style signature: +* void XUsbPs_NakIntrDisable(XUsbPs *InstancePtr, u32 NakIntrMask) +* +******************************************************************************/ +#define XUsbPs_NakIntrDisable(InstancePtr, NakIntrMask) \ + XUsbPs_ClrBits(InstancePtr, XUSBPS_EPNAKIER_OFFSET, NakIntrMask) + + +/*****************************************************************************/ +/** +* This function clears the endpoint NAK interrupts status defined by the +* bit mask. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param NakIntrMask is the Bit mask of endpoint NAK interrupts to be cleared. +* +* @note C-style signature: +* void XUsbPs_NakIntrClear(XUsbPs *InstancePtr, u32 NakIntrMask) +* +******************************************************************************/ +#define XUsbPs_NakIntrClear(InstancePtr, NakIntrMask) \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_EPNAKISR_OFFSET, NakIntrMask) + + + +/*****************************************************************************/ +/** +* This macro sets the Interrupt Threshold value in the control register +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param Threshold is the Interrupt threshold to be set. +* Allowed values: +* - XUSBPS_CMD_ITHRESHOLD_0 - Immediate interrupt +* - XUSBPS_CMD_ITHRESHOLD_1 - 1 Frame +* - XUSBPS_CMD_ITHRESHOLD_2 - 2 Frames +* - XUSBPS_CMD_ITHRESHOLD_4 - 4 Frames +* - XUSBPS_CMD_ITHRESHOLD_8 - 8 Frames +* - XUSBPS_CMD_ITHRESHOLD_16 - 16 Frames +* - XUSBPS_CMD_ITHRESHOLD_32 - 32 Frames +* - XUSBPS_CMD_ITHRESHOLD_64 - 64 Frames +* +* @note +* C-style signature: +* void XUsbPs_SetIntrThreshold(XUsbPs *InstancePtr, u8 Threshold) +* +******************************************************************************/ +#define XUsbPs_SetIntrThreshold(InstancePtr, Threshold) \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_CMD_OFFSET, (Threshold))\ + + +/*****************************************************************************/ +/** +* This macro sets the Tripwire bit in the USB command register. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_SetTripwire(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_SetTripwire(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_CMD_OFFSET, \ + XUSBPS_CMD_ATDTW_MASK) + + +/*****************************************************************************/ +/** +* This macro clears the Tripwire bit in the USB command register. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @note C-style signature: +* void XUsbPs_ClrTripwire(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_ClrTripwire(InstancePtr) \ + XUsbPs_SetBits(InstancePtr, XUSBPS_CMD_OFFSET, \ + XUSBPS_CMD_ATDTW_MASK) + + +/*****************************************************************************/ +/** +* This macro checks if the Tripwire bit in the USB command register is set. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* +* @return +* - TRUE: The tripwire bit is still set. +* - FALSE: The tripwire bit has been cleared. +* +* @note C-style signature: +* int XUsbPs_TripwireIsSet(XUsbPs *InstancePtr) +* +******************************************************************************/ +#define XUsbPs_TripwireIsSet(InstancePtr) \ + (XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XUSBPS_CMD_OFFSET) & \ + XUSBPS_CMD_ATDTW_MASK ? TRUE : FALSE) + + +/****************************************************************************** +* +* GENERAL REGISTER / BIT MANIPULATION MACROS +* +******************************************************************************/ +/****************************************************************************/ +/** +* This macro sets the given bit mask in the register. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param RegOffset is the register offset to be written. +* @param Bits is the Bits to be set in the register +* +* @return None. +* +* @note C-style signature: +* void XUsbPs_SetBits(u32 BaseAddress, u32 RegOffset, u32 Bits) +* +*****************************************************************************/ +#define XUsbPs_SetBits(InstancePtr, RegOffset, Bits) \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, RegOffset, \ + XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + RegOffset) | (Bits)); + + +/****************************************************************************/ +/** +* +* This macro clears the given bits in the register. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param RegOffset is the register offset to be written. +* @param Bits are the bits to be cleared in the register +* +* @return None. +* +* @note +* C-style signature: +* void XUsbPs_ClrBits(u32 BaseAddress, u32 RegOffset, u32 Bits) +* +*****************************************************************************/ +#define XUsbPs_ClrBits(InstancePtr, RegOffset, Bits) \ + XUsbPs_WriteReg((InstancePtr)->Config.BaseAddress, RegOffset, \ + XUsbPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + RegOffset) & ~(Bits)); + + +/************************** Function Prototypes ******************************/ + +/** + * Setup / Initialize functions. + * + * Implemented in file xusbps.c + */ +int XUsbPs_CfgInitialize(XUsbPs *InstancePtr, + const XUsbPs_Config *ConfigPtr, u32 BaseAddress); + +int XUsbPs_ConfigureDevice(XUsbPs *InstancePtr, + const XUsbPs_DeviceConfig *CfgPtr); +u32 XUsbPs_DeviceMemRequired(const XUsbPs_DeviceConfig *CfgPtr); + +/** + * Common functions used for DEVICE/HOST mode. + */ +int XUsbPs_Reset(XUsbPs *InstancePtr); + +/** + * DEVICE mode specific functions. + */ +int XUsbPs_BusReset(XUsbPs *InstancePtr); +u32 XUsbPs_DeviceMemRequired(const XUsbPs_DeviceConfig *CfgPtr); +int XUsbPs_SetDeviceAddress(XUsbPs *InstancePtr, u8 Address); + + +/** + * Handling Suspend and Resume. + * + * Implemented in xusbps.c + */ +int XUsbPs_Suspend(const XUsbPs *InstancePtr); +int XUsbPs_Resume(const XUsbPs *InstancePtr); +int XUsbPs_RequestHostResume(const XUsbPs *InstancePtr); + + +/* + * Functions for managing Endpoints / Transfers + * + * Implemented in file xusbps_endpoint.c + */ +int XUsbPs_EpBufferSend(XUsbPs *InstancePtr, u8 EpNum, + const u8 *BufferPtr, u32 BufferLen); +int XUsbPs_EpBufferReceive(XUsbPs *InstancePtr, u8 EpNum, + u8 **BufferPtr, u32 *BufferLenPtr, u32 *Handle); +void XUsbPs_EpBufferRelease(u32 Handle); + +int XUsbPs_EpSetHandler(XUsbPs *InstancePtr, u8 EpNum, u8 Direction, + XUsbPs_EpHandlerFunc CallBackFunc, + void *CallBackRef); +int XUsbPs_EpGetSetupData(XUsbPs *InstancePtr, int EpNum, + XUsbPs_SetupData *SetupDataPtr); + +int XUsbPs_EpPrime(XUsbPs *InstancePtr, u8 EpNum, u8 Direction); + +int XUsbPs_ReconfigureEp(XUsbPs *InstancePtr, XUsbPs_DeviceConfig *CfgPtr, + int EpNum, unsigned short NewDirection, int DirectionChanged); + +/* + * Interrupt handling functions + * + * Implemented in file xusbps_intr.c + */ +void XUsbPs_IntrHandler(void *InstancePtr); + +int XUsbPs_IntrSetHandler(XUsbPs *InstancePtr, + XUsbPs_IntrHandlerFunc CallBackFunc, + void *CallBackRef, u32 Mask); +/* + * Helper functions for static configuration. + * Implemented in xusbps_sinit.c + */ +XUsbPs_Config *XUsbPs_LookupConfig(u16 DeviceId); + +#ifdef __cplusplus +} +#endif + +#endif /* XUSBPS_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_endpoint.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_endpoint.c new file mode 100755 index 000000000..853e8907e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_endpoint.c @@ -0,0 +1,1384 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/******************************************************************************/ +/** + * @file xusbps_endpoint.c + * + * Endpoint specific function implementations. + * + * @note None. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- -------------------------------------------------------- + * 1.00a jz 10/10/10 First release + * 1.03a nm 09/21/12 Fixed CR#678977. Added proper sequence for setup packet + * handling. + * 1.04a nm 11/02/12 Fixed CR#683931. Mult bits are set properly in dQH. + * </pre> + ******************************************************************************/ + +/***************************** Include Files **********************************/ + +#include <string.h> /* for bzero() */ +#include <stdio.h> + +#include "xusbps.h" +#include "xusbps_endpoint.h" + +/************************** Constant Definitions ******************************/ + +/**************************** Type Definitions ********************************/ + +/************************** Variable Definitions ******************************/ + +/************************** Function Prototypes ******************************/ + +static void XUsbPs_EpListInit(XUsbPs_DeviceConfig *DevCfgPtr); +static void XUsbPs_dQHInit(XUsbPs_DeviceConfig *DevCfgPtr); +static int XUsbPs_dTDInit(XUsbPs_DeviceConfig *DevCfgPtr); +static int XUsbPs_dTDAttachBuffer(XUsbPs_dTD *dTDPtr, + const u8 *BufferPtr, u32 BufferLen); + +static void XUsbPs_dQHSetMaxPacketLenISO(XUsbPs_dQH *dQHPtr, u32 Len); + +/* Functions to reconfigure endpoint upon host's set alternate interface + * request. + */ +static void XUsbPs_dQHReinitEp(XUsbPs_DeviceConfig *DevCfgPtr, + int EpNum, unsigned short NewDirection); +static int XUsbPs_dTDReinitEp(XUsbPs_DeviceConfig *DevCfgPtr, + int EpNum, unsigned short NewDirection); + +/******************************* Functions ************************************/ + +/*****************************************************************************/ +/** + * + * This function configures the DEVICE side of the controller. The caller needs + * to pass in the desired configuration (e.g. number of endpoints) and a + * DMAable buffer that will hold the Queue Head List and the Transfer + * Descriptors. The required size for this buffer can be obtained by the caller + * using the: XUsbPs_DeviceMemRequired() macro. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * @param CfgPtr is a pointer to the configuration structure that contains + * the desired DEVICE side configuration. + * + * @return + * - XST_SUCCESS: The operation completed successfully. + * - XST_FAILURE: An error occured. + * + * @note + * The caller may configure the controller for both, DEVICE and + * HOST side. + * + ******************************************************************************/ +int XUsbPs_ConfigureDevice(XUsbPs *InstancePtr, + const XUsbPs_DeviceConfig *CfgPtr) +{ + int Status; + u32 ModeValue = 0x0; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(CfgPtr != NULL); + + /* Copy the configuration data over into the local instance structure */ + InstancePtr->DeviceConfig = *CfgPtr; + + + /* Align the buffer to a 2048 byte (XUSBPS_dQH_BASE_ALIGN) boundary.*/ + InstancePtr->DeviceConfig.PhysAligned = + (InstancePtr->DeviceConfig.DMAMemPhys + + XUSBPS_dQH_BASE_ALIGN) & + ~(XUSBPS_dQH_BASE_ALIGN -1); + + + /* Clear out the buffer.*/ + memset((void *) InstancePtr->DeviceConfig.DMAMemPhys, 0, + XUsbPs_DeviceMemRequired(&InstancePtr->DeviceConfig)); + + /* Initialize the endpoint pointer list data structure. */ + XUsbPs_EpListInit(&InstancePtr->DeviceConfig); + + + /* Initialize the Queue Head structures in DMA memory. */ + XUsbPs_dQHInit(&InstancePtr->DeviceConfig); + + + /* Initialize the Transfer Descriptors in DMA memory.*/ + Status = XUsbPs_dTDInit(&InstancePtr->DeviceConfig); + if (XST_SUCCESS != Status) { + return XST_FAILURE; + } + + /* Changing the DEVICE mode requires a controller RESET. */ + if (XST_SUCCESS != XUsbPs_Reset(InstancePtr)) { + return XST_FAILURE; + } + + /* Set the Queue Head List address. */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPLISTADDR_OFFSET, + InstancePtr->DeviceConfig.PhysAligned); + + /* Set the USB mode register to configure DEVICE mode. + * + * XUSBPS_MODE_SLOM_MASK note: + * Disable Setup Lockout. Setup Lockout is not required as we + * will be using the tripwire mechanism when handling setup + * packets. + */ + ModeValue = XUSBPS_MODE_CM_DEVICE_MASK | XUSBPS_MODE_SLOM_MASK; + + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_MODE_OFFSET, ModeValue); + + XUsbPs_SetBits(InstancePtr, XUSBPS_OTGCSR_OFFSET, + XUSBPS_OTGSC_OT_MASK); + + return XST_SUCCESS; +} + +/*****************************************************************************/ +/** +* This function sends a given data buffer. +* +* @param InstancePtr is a pointer to XUsbPs instance of the controller. +* @param EpNum is the number of the endpoint to receive data from. +* @param BufferPtr is a pointer to the buffer to send. +* @param BufferLen is the Buffer length. +* +* @return +* - XST_SUCCESS: The operation completed successfully. +* - XST_FAILURE: An error occured. +* - XST_USB_BUF_TOO_BIG: Provided buffer is too big (>16kB). +* - XST_USB_NO_DESC_AVAILABLE: No TX descriptor is available. +* +******************************************************************************/ +int XUsbPs_EpBufferSend(XUsbPs *InstancePtr, u8 EpNum, + const u8 *BufferPtr, u32 BufferLen) +{ + int Status; + u32 Token; + XUsbPs_EpIn *Ep; + XUsbPs_dTD *DescPtr; + u32 Length; + u32 PipeEmpty = 1; + u32 Mask = 0x00010000; + u32 BitMask = Mask << EpNum; + u32 RegValue; + u32 Temp; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(EpNum < InstancePtr->DeviceConfig.NumEndpoints); + + /* Locate the next available buffer in the ring. A buffer is available + * if its descriptor is not active. + */ + Ep = &InstancePtr->DeviceConfig.Ep[EpNum].In; + + Xil_DCacheFlushRange((unsigned int)BufferPtr, BufferLen); + + if(Ep->dTDTail != Ep->dTDHead) { + PipeEmpty = 0; + } + XUsbPs_dTDInvalidateCache(Ep->dTDHead); + + /* Tell the caller if we do not have any descriptors available. */ + if (XUsbPs_dTDIsActive(Ep->dTDHead)) { + return XST_USB_NO_DESC_AVAILABLE; + } + + /* Remember the current head. */ + DescPtr = Ep->dTDHead; + + do { + Length = (BufferLen > XUSBPS_dTD_BUF_MAX_SIZE) ? XUSBPS_dTD_BUF_MAX_SIZE : BufferLen; + /* Attach the provided buffer to the current descriptor.*/ + Status = XUsbPs_dTDAttachBuffer(Ep->dTDHead, BufferPtr, Length); + if (XST_SUCCESS != Status) { + return XST_FAILURE; + } + BufferLen -= Length; + BufferPtr += Length; + + XUsbPs_dTDSetActive(Ep->dTDHead); + if(BufferLen == 0) + XUsbPs_dTDSetIOC(Ep->dTDHead); + XUsbPs_dTDClrTerminate(Ep->dTDHead); + XUsbPs_dTDFlushCache(Ep->dTDHead); + + /* Advance the head descriptor pointer to the next descriptor. */ + Ep->dTDHead = XUsbPs_dTDGetNLP(Ep->dTDHead); + /* Terminate the next descriptor and flush the cache.*/ + XUsbPs_dTDInvalidateCache(Ep->dTDHead); + /* Tell the caller if we do not have any descriptors available. */ + if (XUsbPs_dTDIsActive(Ep->dTDHead)) { + return XST_USB_NO_DESC_AVAILABLE; + } + } while(BufferLen); + + XUsbPs_dTDSetTerminate(Ep->dTDHead); + XUsbPs_dTDFlushCache(Ep->dTDHead); + + if(!PipeEmpty) { + /* Read the endpoint prime register. */ + RegValue = XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, XUSBPS_EPPRIME_OFFSET); + if(RegValue & BitMask) { + return XST_SUCCESS; + } + + do { + RegValue = XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, XUSBPS_CMD_OFFSET); + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, XUSBPS_CMD_OFFSET, + RegValue | XUSBPS_CMD_ATDTW_MASK); + Temp = XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, XUSBPS_EPRDY_OFFSET) + & BitMask; + } while(!(XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, XUSBPS_CMD_OFFSET) & + XUSBPS_CMD_ATDTW_MASK)); + + RegValue = XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, XUSBPS_CMD_OFFSET); + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, XUSBPS_CMD_OFFSET, + RegValue & ~XUSBPS_CMD_ATDTW_MASK); + + if(Temp) { + return XST_SUCCESS; + } + } + + /* Check, if the DMA engine is still running. If it is running, we do + * not clear Queue Head fields. + * + * Same cache rule as for the Transfer Descriptor applies for the Queue + * Head. + */ + XUsbPs_dQHInvalidateCache(Ep->dQH); + /* Add the dTD to the dQH */ + XUsbPs_WritedQH(Ep->dQH, XUSBPS_dQHdTDNLP, DescPtr); + Token = XUsbPs_ReaddQH(Ep->dQH, XUSBPS_dQHdTDTOKEN); + Token &= ~(XUSBPS_dTDTOKEN_ACTIVE_MASK | XUSBPS_dTDTOKEN_HALT_MASK); + XUsbPs_WritedQH(Ep->dQH, XUSBPS_dQHdTDTOKEN, Token); + + XUsbPs_dQHFlushCache(Ep->dQH); + + Status = XUsbPs_EpPrime(InstancePtr, EpNum, XUSBPS_EP_DIRECTION_IN); + + return Status; +} + +/*****************************************************************************/ +/** + * This function receives a data buffer from the endpoint of the given endpoint + * number. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * @param EpNum is the number of the endpoint to receive data from. + * @param BufferPtr (OUT param) is a pointer to the buffer pointer to hold + * the reference of the data buffer. + * @param BufferLenPtr (OUT param) is a pointer to the integer that will + * hold the buffer length. + * @param Handle is the opaque handle to be used when the buffer is + * released. + * + * @return + * - XST_SUCCESS: The operation completed successfully. + * - XST_FAILURE: An error occured. + * - XST_USB_NO_BUF: No buffer available. + * + * @note + * After handling the data in the buffer, the user MUST release + * the buffer using the Handle by calling the + * XUsbPs_EpBufferRelease() function. + * + ******************************************************************************/ +int XUsbPs_EpBufferReceive(XUsbPs *InstancePtr, u8 EpNum, + u8 **BufferPtr, u32 *BufferLenPtr, u32 *Handle) +{ + XUsbPs_EpOut *Ep; + XUsbPs_EpSetup *EpSetup; + u32 length = 0; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(BufferPtr != NULL); + Xil_AssertNonvoid(BufferLenPtr != NULL); + Xil_AssertNonvoid(Handle != NULL); + Xil_AssertNonvoid(EpNum < InstancePtr->DeviceConfig.NumEndpoints); + + /* Locate the next available buffer in the ring. A buffer is available + * if its descriptor is not active. + */ + Ep = &InstancePtr->DeviceConfig.Ep[EpNum].Out; + + XUsbPs_dTDInvalidateCache(Ep->dTDCurr); + + if (XUsbPs_dTDIsActive(Ep->dTDCurr)) { + return XST_USB_NO_BUF; + } + + /* The buffer is not active which means that it has been processed by + * the DMA engine and contains valid data. + */ + EpSetup = &InstancePtr->DeviceConfig.EpCfg[EpNum].Out; + + + /* Use the buffer pointer stored in the "user data" field of the + * Transfer Descriptor. + */ + *BufferPtr = (u8 *) XUsbPs_ReaddTD(Ep->dTDCurr, + XUSBPS_dTDUSERDATA); + + length = EpSetup->BufSize - + XUsbPs_dTDGetTransferLen(Ep->dTDCurr); + + if(length > 0) { + *BufferLenPtr = length; + }else { + *BufferLenPtr = 0; + } + + *Handle = (u32) Ep->dTDCurr; + + + /* Reset the descriptor's BufferPointer0 and Transfer Length fields to + * their original value. Note that we can not yet re-activate the + * descriptor as the caller will be using the attached buffer. Once the + * caller releases the buffer by calling XUsbPs_EpBufferRelease(), we + * can re-activate the descriptor. + */ + XUsbPs_WritedTD(Ep->dTDCurr, XUSBPS_dTDBPTR0, *BufferPtr); + XUsbPs_dTDSetTransferLen(Ep->dTDCurr, EpSetup->BufSize); + + XUsbPs_dTDFlushCache(Ep->dTDCurr); + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* This function returns a previously received data buffer to the driver. +* +* @param Handle is a pointer to the buffer that is returned. +* +* @return None. +* +******************************************************************************/ +void XUsbPs_EpBufferRelease(u32 Handle) +{ + XUsbPs_dTD *dTDPtr; + + /* Perform sanity check on Handle.*/ + Xil_AssertVoid((0 != Handle) && (0 == (Handle % XUSBPS_dTD_ALIGN))); + + /* Activate the descriptor and clear the Terminate bit. Make sure to do + * the proper cache handling. + */ + dTDPtr = (XUsbPs_dTD *) Handle; + + XUsbPs_dTDInvalidateCache(dTDPtr); + + XUsbPs_dTDClrTerminate(dTDPtr); + XUsbPs_dTDSetActive(dTDPtr); + XUsbPs_dTDSetIOC(dTDPtr); + + XUsbPs_dTDFlushCache(dTDPtr); + +} + + +/*****************************************************************************/ +/** + * This function sets the handler for endpoint events. + * + * @param InstancePtr is a pointer to the XUsbPs instance of the + * controller. + * @param EpNum is the number of the endpoint to receive data from. + * @param Direction is the direction of the endpoint (bitfield): + * - XUSBPS_EP_DIRECTION_OUT + * - XUSBPS_EP_DIRECTION_IN + * @param CallBackFunc is the Handler callback function. + * Can be NULL if the user wants to disable the handler entry. + * @param CallBackRef is the user definable data pointer that will be + * passed back if the handler is called. May be NULL. + * + * @return + * - XST_SUCCESS: The operation completed successfully. + * - XST_FAILURE: An error occured. + * - XST_INVALID_PARAM: Invalid parameter passed. + * + * @note + * The user can disable a handler by setting the callback function + * pointer to NULL. + * + ******************************************************************************/ +int XUsbPs_EpSetHandler(XUsbPs *InstancePtr, u8 EpNum, u8 Direction, + XUsbPs_EpHandlerFunc CallBackFunc, + void *CallBackRef) +{ + XUsbPs_Endpoint *Ep; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(CallBackFunc != NULL); + Xil_AssertNonvoid(EpNum < InstancePtr->DeviceConfig.NumEndpoints); + + Ep = &InstancePtr->DeviceConfig.Ep[EpNum]; + + if(Direction & XUSBPS_EP_DIRECTION_OUT) { + Ep->Out.HandlerFunc = CallBackFunc; + Ep->Out.HandlerRef = CallBackRef; + } + + if(Direction & XUSBPS_EP_DIRECTION_IN) { + Ep->In.HandlerFunc = CallBackFunc; + Ep->In.HandlerRef = CallBackRef; + } + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* This function primes an endpoint. +* +* @param InstancePtr is pointer to the XUsbPs instance. +* @param EpNum is the number of the endpoint to receive data from. +* @param Direction is the direction of the endpoint (bitfield): +* - XUSBPS_EP_DIRECTION_OUT +* - XUSBPS_EP_DIRECTION_IN +* +* @return +* - XST_SUCCESS: The operation completed successfully. +* - XST_FAILURE: An error occured. +* - XST_INVALID_PARAM: Invalid parameter passed. +* +* @note None. +* +******************************************************************************/ +int XUsbPs_EpPrime(XUsbPs *InstancePtr, u8 EpNum, u8 Direction) +{ + u32 Mask; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(EpNum < InstancePtr->DeviceConfig.NumEndpoints); + + /* Get the right bit mask for the endpoint direction. */ + switch (Direction) { + + case XUSBPS_EP_DIRECTION_OUT: + Mask = 0x00000001; + break; + + case XUSBPS_EP_DIRECTION_IN: + Mask = 0x00010000; + break; + + default: + return XST_INVALID_PARAM; + } + + /* Write the endpoint prime register. */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPPRIME_OFFSET, Mask << EpNum); + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* This function extracts the Setup Data from a given endpoint. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpNum is the number of the endpoint to receive data from. +* @param SetupDataPtr is a pointer to the setup data structure to be +* filled. +* +* @return +* - XST_SUCCESS: The operation completed successfully. +* - XST_FAILURE: An error occured. +* +* @note None. +******************************************************************************/ +int XUsbPs_EpGetSetupData(XUsbPs *InstancePtr, int EpNum, + XUsbPs_SetupData *SetupDataPtr) +{ + XUsbPs_EpOut *Ep; + + u32 Data[2]; + u8 *p; + + int Timeout; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(SetupDataPtr != NULL); + Xil_AssertNonvoid(EpNum < InstancePtr->DeviceConfig.NumEndpoints); + + Ep = &InstancePtr->DeviceConfig.Ep[EpNum].Out; + + + /* Get the data from the Queue Heads Setup buffer into local variables + * so we can extract the setup data values. + */ + do { + /* Arm the tripwire. The tripwire will tell us if a new setup + * packet arrived (in which case the tripwire bit will be + * cleared) while we were reading the buffer. If a new setup + * packet arrived the buffer is corrupted and we continue + * reading. + */ + XUsbPs_SetTripwire(InstancePtr); + + XUsbPs_dQHInvalidateCache(Ep->dQH); + + Data[0] = XUsbPs_ReaddQH(Ep->dQH, XUSBPS_dQHSUB0); + Data[1] = XUsbPs_ReaddQH(Ep->dQH, XUSBPS_dQHSUB1); + } while (FALSE == XUsbPs_TripwireIsSet(InstancePtr)); + + /* Clear the pending endpoint setup stat bit. + */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPSTAT_OFFSET, 1 << EpNum); + + /* Clear the Tripwire bit and continue. + */ + XUsbPs_ClrTripwire(InstancePtr); + + + /* Data in the setup buffer is being converted by the core to big + * endian format. We have to take care of proper byte swapping when + * reading the setup data values. + * + * Need to check if there is a smarter way to do this and take the + * processor/memory-controller endianess into account? + */ + p = (u8 *) Data; + + SetupDataPtr->bmRequestType = p[0]; + SetupDataPtr->bRequest = p[1]; + SetupDataPtr->wValue = (p[3] << 8) | p[2]; + SetupDataPtr->wIndex = (p[5] << 8) | p[4]; + SetupDataPtr->wLength = (p[7] << 8) | p[6]; + + /* Before we leave we need to make sure that the endpoint setup bit has + * cleared. It needs to be 0 before the endpoint can be re-primed. + * + * Note: According to the documentation this endpoint setup bit should + * clear within 1-2us after it has been written above. This means that + * we should never catch it being 1 here. However, we still need to + * poll it to make sure. Just in case, we use a counter 'Timeout' so we + * won't hang here if the bit is stuck for some reason. + */ + Timeout = XUSBPS_TIMEOUT_COUNTER; + while ((XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPSTAT_OFFSET) & + (1 << EpNum)) && --Timeout) { + /* NOP */ + } + if (0 == Timeout) { + return XST_FAILURE; + } + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* +* This function initializes the endpoint pointer data structure. +* +* The function sets up the local data structure with the aligned addresses for +* the Queue Head and Transfer Descriptors. +* +* @param DevCfgPtr is pointer to the XUsbPs DEVICE configuration +* structure. +* +* @return none +* +* @note +* Endpoints of type XUSBPS_EP_TYPE_NONE are not used in the +* system. Therefore no memory is reserved for them. +* +******************************************************************************/ +static void XUsbPs_EpListInit(XUsbPs_DeviceConfig *DevCfgPtr) +{ + int EpNum; + u8 *p; + + XUsbPs_Endpoint *Ep; + XUsbPs_EpConfig *EpCfg; + + /* Set up the XUsbPs_Endpoint array. This array is used to define the + * location of the Queue Head list and the Transfer Descriptors in the + * block of DMA memory that has been passed into the driver. + * + * 'p' is used to set the pointers in the local data structure. + * Initially 'p' is pointed to the beginning of the DMAable memory + * block. As pointers are assigned, 'p' is incremented by the size of + * the respective object. + */ + Ep = DevCfgPtr->Ep; + EpCfg = DevCfgPtr->EpCfg; + + /* Start off with 'p' pointing to the (aligned) beginning of the DMA + * buffer. + */ + p = (u8 *) DevCfgPtr->PhysAligned; + + + /* Initialize the Queue Head pointer list. + * + * Each endpoint has two Queue Heads. One for the OUT direction and one + * for the IN direction. An OUT Queue Head is always followed by an IN + * Queue Head. + * + * Queue Head alignment is XUSBPS_dQH_ALIGN. + * + * Note that we have to reserve space here for unused endpoints. + */ + for (EpNum = 0; EpNum < DevCfgPtr->NumEndpoints; ++EpNum) { + /* OUT Queue Head */ + Ep[EpNum].Out.dQH = (XUsbPs_dQH *) p; + p += XUSBPS_dQH_ALIGN; + + /* IN Queue Head */ + Ep[EpNum].In.dQH = (XUsbPs_dQH *) p; + p += XUSBPS_dQH_ALIGN; + } + + + /* 'p' now points to the first address after the Queue Head list. The + * Transfer Descriptors start here. + * + * Each endpoint has a variable number of Transfer Descriptors + * depending on user configuration. + * + * Transfer Descriptor alignment is XUSBPS_dTD_ALIGN. + */ + for (EpNum = 0; EpNum < DevCfgPtr->NumEndpoints; ++EpNum) { + /* OUT Descriptors. + */ + if (XUSBPS_EP_TYPE_NONE != EpCfg[EpNum].Out.Type) { + Ep[EpNum].Out.dTDs = (XUsbPs_dTD *) p; + Ep[EpNum].Out.dTDCurr = (XUsbPs_dTD *) p; + p += XUSBPS_dTD_ALIGN * EpCfg[EpNum].Out.NumBufs; + } + + /* IN Descriptors. + */ + if (XUSBPS_EP_TYPE_NONE != EpCfg[EpNum].In.Type) { + Ep[EpNum].In.dTDs = (XUsbPs_dTD *) p; + Ep[EpNum].In.dTDHead = (XUsbPs_dTD *) p; + Ep[EpNum].In.dTDTail = (XUsbPs_dTD *) p; + p += XUSBPS_dTD_ALIGN * EpCfg[EpNum].In.NumBufs; + } + } + + + /* 'p' now points to the first address after the Transfer Descriptors. + * The data buffers for the OUT Transfer Desciptors start here. + * + * Note that IN (TX) Transfer Descriptors are not assigned buffers at + * this point. Buffers will be assigned when the user calls the send() + * function. + */ + for (EpNum = 0; EpNum < DevCfgPtr->NumEndpoints; ++EpNum) { + + if (XUSBPS_EP_TYPE_NONE != EpCfg[EpNum].Out.Type) { + /* If BufSize for this endpoint is set to 0 it means + * that we do not need to attach a buffer to this + * descriptor. We also initialize it's buffer pointer + * to NULL. + */ + if (0 == EpCfg[EpNum].Out.BufSize) { + Ep[EpNum].Out.dTDBufs = NULL; + continue; + } + + Ep[EpNum].Out.dTDBufs = p; + p += EpCfg[EpNum].Out.BufSize * EpCfg[EpNum].Out.NumBufs; + } + } + + + /* Initialize the endpoint event handlers to NULL. + */ + for (EpNum = 0; EpNum < DevCfgPtr->NumEndpoints; ++EpNum) { + Ep[EpNum].Out.HandlerFunc = NULL; + Ep[EpNum].In.HandlerFunc = NULL; + } +} + + +/*****************************************************************************/ +/** +* +* This function initializes the Queue Head List in memory. +* +* @param DevCfgPtr is a pointer to the XUsbPs DEVICE configuration +* structure. +* +* @return None +* +* @note None. +* +******************************************************************************/ +static void XUsbPs_dQHInit(XUsbPs_DeviceConfig *DevCfgPtr) +{ + int EpNum; + + XUsbPs_Endpoint *Ep; + XUsbPs_EpConfig *EpCfg; + + /* Setup pointers for simpler access. */ + Ep = DevCfgPtr->Ep; + EpCfg = DevCfgPtr->EpCfg; + + + /* Go through the list of Queue Head entries and: + * + * - Set Transfer Descriptor addresses + * - Set Maximum Packet Size + * - Disable Zero Length Termination (ZLT) for non-isochronous transfers + * - Enable Interrupt On Setup (IOS) + * + */ + for (EpNum = 0; EpNum < DevCfgPtr->NumEndpoints; ++EpNum) { + + /* OUT Queue Heads.*/ + if (XUSBPS_EP_TYPE_NONE != EpCfg[EpNum].Out.Type) { + XUsbPs_WritedQH(Ep[EpNum].Out.dQH, + XUSBPS_dQHCPTR, Ep[EpNum].Out.dTDs); + + /* For isochronous, ep max packet size translates to different + * values in queue head than other types. + * Also enable ZLT for isochronous. + */ + if(XUSBPS_EP_TYPE_ISOCHRONOUS == EpCfg[EpNum].Out.Type) { + XUsbPs_dQHSetMaxPacketLenISO(Ep[EpNum].Out.dQH, + EpCfg[EpNum].Out.MaxPacketSize); + XUsbPs_dQHEnableZLT(Ep[EpNum].Out.dQH); + }else { + XUsbPs_dQHSetMaxPacketLen(Ep[EpNum].Out.dQH, + EpCfg[EpNum].Out.MaxPacketSize); + XUsbPs_dQHDisableZLT(Ep[EpNum].Out.dQH); + } + + /* Only control OUT needs this */ + if(XUSBPS_EP_TYPE_CONTROL == EpCfg[EpNum].Out.Type) { + XUsbPs_dQHSetIOS(Ep[EpNum].Out.dQH); + } + + /* Set up the overlay next dTD pointer. */ + XUsbPs_WritedQH(Ep[EpNum].Out.dQH, + XUSBPS_dQHdTDNLP, Ep[EpNum].Out.dTDs); + + XUsbPs_dQHFlushCache(Ep[EpNum].Out.dQH); + } + + + /* IN Queue Heads. */ + if (XUSBPS_EP_TYPE_NONE != EpCfg[EpNum].In.Type) { + XUsbPs_WritedQH(Ep[EpNum].In.dQH, + XUSBPS_dQHCPTR, Ep[EpNum].In.dTDs); + + + /* Isochronous ep packet size can be larger than 1024.*/ + if(XUSBPS_EP_TYPE_ISOCHRONOUS == EpCfg[EpNum].In.Type) { + XUsbPs_dQHSetMaxPacketLenISO(Ep[EpNum].In.dQH, + EpCfg[EpNum].In.MaxPacketSize); + XUsbPs_dQHEnableZLT(Ep[EpNum].In.dQH); + }else { + XUsbPs_dQHSetMaxPacketLen(Ep[EpNum].In.dQH, + EpCfg[EpNum].In.MaxPacketSize); + XUsbPs_dQHDisableZLT(Ep[EpNum].In.dQH); + } + + XUsbPs_dQHFlushCache(Ep[EpNum].In.dQH); + } + } +} + + +/*****************************************************************************/ +/** + * + * This function initializes the Transfer Descriptors lists in memory. + * + * @param DevCfgPtr is a pointer to the XUsbPs DEVICE configuration + * structure. + * + * @return + * - XST_SUCCESS: The operation completed successfully. + * - XST_FAILURE: An error occured. + * + ******************************************************************************/ +static int XUsbPs_dTDInit(XUsbPs_DeviceConfig *DevCfgPtr) +{ + int EpNum; + + XUsbPs_Endpoint *Ep; + XUsbPs_EpConfig *EpCfg; + + /* Setup pointers for simpler access. */ + Ep = DevCfgPtr->Ep; + EpCfg = DevCfgPtr->EpCfg; + + + /* Walk through the list of endpoints and initialize their Transfer + * Descriptors. + */ + for (EpNum = 0; EpNum < DevCfgPtr->NumEndpoints; ++EpNum) { + int Td; + int NumdTD; + + XUsbPs_EpOut *Out = &Ep[EpNum].Out; + XUsbPs_EpIn *In = &Ep[EpNum].In; + + + /* OUT Descriptors + * =============== + * + * + Set the next link pointer + * + Set the interrupt complete and the active bit + * + Attach the buffer to the dTD + */ + if (XUSBPS_EP_TYPE_NONE != EpCfg[EpNum].Out.Type) { + NumdTD = EpCfg[EpNum].Out.NumBufs; + } + else { + NumdTD = 0; + } + + for (Td = 0; Td < NumdTD; ++Td) { + int Status; + + int NextTd = (Td + 1) % NumdTD; + + XUsbPs_dTDInvalidateCache(&Out->dTDs[Td]); + + /* Set NEXT link pointer. */ + XUsbPs_WritedTD(&Out->dTDs[Td], XUSBPS_dTDNLP, + &Out->dTDs[NextTd]); + + /* Set the OUT descriptor ACTIVE and enable the + * interrupt on complete. + */ + XUsbPs_dTDSetActive(&Out->dTDs[Td]); + XUsbPs_dTDSetIOC(&Out->dTDs[Td]); + + + /* Set up the data buffer with the descriptor. If the + * buffer pointer is NULL it means that we do not need + * to attach a buffer to this descriptor. + */ + if (NULL == Out->dTDBufs) { + XUsbPs_dTDFlushCache(&Out->dTDs[Td]); + continue; + } + + Status = XUsbPs_dTDAttachBuffer( + &Out->dTDs[Td], + Out->dTDBufs + + (Td * EpCfg[EpNum].Out.BufSize), + EpCfg[EpNum].Out.BufSize); + if (XST_SUCCESS != Status) { + return XST_FAILURE; + } + + XUsbPs_dTDFlushCache(&Out->dTDs[Td]); + } + + + /* IN Descriptors + * ============== + * + * + Set the next link pointer + * + Set the Terminate bit to mark it available + */ + if (XUSBPS_EP_TYPE_NONE != EpCfg[EpNum].In.Type) { + NumdTD = EpCfg[EpNum].In.NumBufs; + } + else { + NumdTD = 0; + } + + for (Td = 0; Td < NumdTD; ++Td) { + int NextTd = (Td + 1) % NumdTD; + + XUsbPs_dTDInvalidateCache(&In->dTDs[Td]); + + /* Set NEXT link pointer. */ + XUsbPs_WritedTD(In->dTDs[Td], XUSBPS_dTDNLP, + In->dTDs[NextTd]); + + /* Set the IN descriptor's TERMINATE bits. */ + XUsbPs_dTDSetTerminate(In->dTDs[Td]); + + XUsbPs_dTDFlushCache(&In->dTDs[Td]); + } + } + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** + * + * This function associates a buffer with a Transfer Descriptor. The function + * will take care of splitting the buffer into multiple 4kB aligned segments if + * the buffer happens to span one or more 4kB pages. + * + * @param dTDIndex is a pointer to the Transfer Descriptor + * @param BufferPtr is pointer to the buffer to link to the descriptor. + * @param BufferLen is the length of the buffer. + * + * @return + * - XST_SUCCESS: The operation completed successfully. + * - XST_FAILURE: An error occured. + * - XST_USB_BUF_TOO_BIG: The provided buffer is bigger than tha + * maximum allowed buffer size (16k). + * + * @note + * Cache invalidation and flushing needs to be handler by the + * caller of this function. + * + ******************************************************************************/ +static int XUsbPs_dTDAttachBuffer(XUsbPs_dTD *dTDPtr, + const u8 *BufferPtr, u32 BufferLen) +{ + u32 BufAddr; + u32 BufEnd; + u32 PtrNum; + + Xil_AssertNonvoid(dTDPtr != NULL); + + /* Check if the buffer is smaller than 16kB. */ + if (BufferLen > XUSBPS_dTD_BUF_MAX_SIZE) { + return XST_USB_BUF_TOO_BIG; + } + + /* Get a u32 of the buffer pointer to avoid casting in the following + * logic operations. + */ + BufAddr = (u32) BufferPtr; + + + /* Set the buffer pointer 0. Buffer pointer 0 can point to any location + * in memory. It does not need to be 4kB aligned. However, if the + * provided buffer spans one or more 4kB boundaries, we need to set up + * the subsequent buffer pointers which must be 4kB aligned. + */ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDBPTR(0), BufAddr); + + /* Check if the buffer spans a 4kB boundary. + * + * Only do this check, if we are not sending a 0-length buffer. + */ + if (BufferLen > 0) { + BufEnd = BufAddr + BufferLen -1; + PtrNum = 1; + + while ((BufAddr & 0xFFFFF000) != (BufEnd & 0xFFFFF000)) { + /* The buffer spans at least one boundary, let's set + * the next buffer pointer and repeat the procedure + * until the end of the buffer and the pointer written + * are in the same 4kB page. + */ + BufAddr = (BufAddr + 0x1000) & 0xFFFFF000; + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDBPTR(PtrNum), + BufAddr); + PtrNum++; + } + } + + /* Set the length of the buffer. */ + XUsbPs_dTDSetTransferLen(dTDPtr, BufferLen); + + + /* We remember the buffer pointer in the user data field (reserved + * field in the dTD). This makes it easier to reset the buffer pointer + * after a buffer has been received on the endpoint. The buffer pointer + * needs to be reset because the DMA engine modifies the buffer pointer + * while receiving. + */ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDUSERDATA, BufferPtr); + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** + * This function set the Max PacketLen for the queue head for isochronous EP. + * + * If the max packet length is greater than XUSBPS_MAX_PACKET_SIZE, then + * Mult bits are set to reflect that. + * + * @param dQHPtr is a pointer to the dQH element. + * @param Len is the Length to be set. + * + ******************************************************************************/ +static void XUsbPs_dQHSetMaxPacketLenISO(XUsbPs_dQH *dQHPtr, u32 Len) +{ + u32 Mult = (Len & ENDPOINT_MAXP_MULT_MASK) >> ENDPOINT_MAXP_MULT_SHIFT; + u32 MaxPktSize = (Mult > 1) ? ENDPOINT_MAXP_LENGTH : Len; + + if (MaxPktSize > XUSBPS_MAX_PACKET_SIZE) { + return; + } + + if (Mult > 3) { + return; + } + + /* Set Max packet size */ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, + (XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & + ~XUSBPS_dQHCFG_MPL_MASK) | + (MaxPktSize << XUSBPS_dQHCFG_MPL_SHIFT)); + + /* Set Mult to tell hardware how many transactions in each microframe */ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, + (XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & + ~XUSBPS_dQHCFG_MULT_MASK) | + (Mult << XUSBPS_dQHCFG_MULT_SHIFT)); + +} + +/*****************************************************************************/ +/** +* This function reconfigures one Ep corresponding to host's request of setting +* alternate interface. The endpoint has been disabled before this call. +* +* Both QH and dTDs are updated for the new configuration. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param CfgPtr +* Pointer to the updated XUsbPs DEVICE configuration structure. +* +* @param EpNum +* The endpoint to be reconfigured. +* +* @param NewDirection +* The new transfer direction the endpoint. +* +* @param DirectionChanged +* A boolean value indicate whether the transfer direction has changed. +* +* @return +* XST_SUCCESS upon success, XST_FAILURE otherwise. +* +******************************************************************************/ +int XUsbPs_ReconfigureEp(XUsbPs *InstancePtr, XUsbPs_DeviceConfig *CfgPtr, + int EpNum, unsigned short NewDirection, + int DirectionChanged) { + + int Status = XST_SUCCESS; + XUsbPs_Endpoint *Ep; + XUsbPs_EpConfig *EpCfg; + + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(CfgPtr != NULL); + + Ep = CfgPtr->Ep; + EpCfg = CfgPtr->EpCfg; + + /* If transfer direction changes, dTDs has to be reset + * Number of buffers are preset and should not to be changed. + */ + if(DirectionChanged) { + if(NewDirection == XUSBPS_EP_DIRECTION_OUT) { + u8 *p; + + /* Swap the pointer to the dTDs. + */ + Ep[EpNum].Out.dTDs = Ep[EpNum].In.dTDs; + p = (u8 *)(Ep[EpNum].Out.dTDs + XUSBPS_dTD_ALIGN * EpCfg[EpNum].Out.NumBufs); + + /* Set the OUT buffer if buffer size is not zero + */ + if(EpCfg[EpNum].Out.BufSize > 0) { + Ep[EpNum].Out.dTDBufs = p; + } + } else if(NewDirection == XUSBPS_EP_DIRECTION_IN) { + Ep[EpNum].In.dTDs = Ep[EpNum].Out.dTDs; + } + } + + /* Reset dTD progress tracking pointers + */ + if(NewDirection == XUSBPS_EP_DIRECTION_IN) { + Ep[EpNum].In.dTDHead = Ep[EpNum].In.dTDTail = Ep[EpNum].In.dTDs; + } else if(NewDirection == XUSBPS_EP_DIRECTION_OUT) { + Ep[EpNum].Out.dTDCurr = Ep[EpNum].Out.dTDs; + } + + /* Reinitialize information in QH + */ + XUsbPs_dQHReinitEp(CfgPtr, EpNum, NewDirection); + + /* Reinitialize the dTD linked list, and flush the cache + */ + Status = XUsbPs_dTDReinitEp(CfgPtr, EpNum, NewDirection); + if(Status != XST_SUCCESS) { + return Status; + } + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** + * This function re-initializes the Queue Head List in memory. + * The endpoint 1 has been disabled before this call. + * + * @param DevCfgPtr + * Pointer to the updated XUsbPs DEVICE configuration structure. + * + * @param EpNum + * The endpoint to be reconfigured. + * + * @param NewDirection + * The new transfer direction of endpoint 1 + * + * @return none + * + ******************************************************************************/ +static void XUsbPs_dQHReinitEp(XUsbPs_DeviceConfig *DevCfgPtr, +int EpNum, unsigned short NewDirection) +{ + XUsbPs_Endpoint *Ep; + XUsbPs_EpConfig *EpCfg; + + /* Setup pointers for simpler access. + */ + Ep = DevCfgPtr->Ep; + EpCfg = DevCfgPtr->EpCfg; + + + /* Go through the list of Queue Head entries and: + * + * - Set Transfer Descriptor addresses + * - Set Maximum Packet Size + * - Disable Zero Length Termination (ZLT) for non-isochronous transfers + * - Enable Interrupt On Setup (IOS) + * + */ + if(NewDirection == XUSBPS_EP_DIRECTION_OUT) { + /* OUT Queue Heads. + */ + XUsbPs_WritedQH(Ep[EpNum].Out.dQH, + XUSBPS_dQHCPTR, Ep[EpNum].Out.dTDs); + + /* For isochronous, ep max packet size translates to different + * values in queue head than other types. + * Also enable ZLT for isochronous. + */ + if(XUSBPS_EP_TYPE_ISOCHRONOUS == EpCfg[EpNum].Out.Type) { + XUsbPs_dQHSetMaxPacketLenISO(Ep[EpNum].Out.dQH, + EpCfg[EpNum].Out.MaxPacketSize); + XUsbPs_dQHEnableZLT(Ep[EpNum].Out.dQH); + }else { + XUsbPs_dQHSetMaxPacketLen(Ep[EpNum].Out.dQH, + EpCfg[EpNum].Out.MaxPacketSize); + XUsbPs_dQHDisableZLT(Ep[EpNum].Out.dQH); + } + + XUsbPs_dQHSetIOS(Ep[EpNum].Out.dQH); + + /* Set up the overlay next dTD pointer. + */ + XUsbPs_WritedQH(Ep[EpNum].Out.dQH, + XUSBPS_dQHdTDNLP, Ep[EpNum].Out.dTDs); + + XUsbPs_dQHFlushCache(Ep[EpNum].Out.dQH); + + } else if(NewDirection == XUSBPS_EP_DIRECTION_IN) { + + /* IN Queue Heads. + */ + XUsbPs_WritedQH(Ep[EpNum].In.dQH, + XUSBPS_dQHCPTR, Ep[EpNum].In.dTDs); + + /* Isochronous ep packet size can be larger than 1024. */ + if(XUSBPS_EP_TYPE_ISOCHRONOUS == EpCfg[EpNum].In.Type) { + XUsbPs_dQHSetMaxPacketLenISO(Ep[EpNum].In.dQH, + EpCfg[EpNum].In.MaxPacketSize); + XUsbPs_dQHEnableZLT(Ep[EpNum].In.dQH); + }else { + XUsbPs_dQHSetMaxPacketLen(Ep[EpNum].In.dQH, + EpCfg[EpNum].In.MaxPacketSize); + XUsbPs_dQHDisableZLT(Ep[EpNum].In.dQH); + } + + XUsbPs_dQHSetIOS(Ep[EpNum].In.dQH); + + XUsbPs_dQHFlushCache(Ep[EpNum].In.dQH); + } + +} + +/*****************************************************************************/ +/** + * + * This function re-initializes the Transfer Descriptors lists in memory. + * The endpoint has been disabled before the call. The transfer descriptors + * list pointer has been initialized too. + * + * @param DevCfgPtr + * Pointer to the XUsbPs DEVICE configuration structure. + * + * @param EpNum + * The endpoint to be reconfigured. + * + * @param NewDirection + * The new transfer direction of endpoint 1 + * + * @return + * - XST_SUCCESS: The operation completed successfully. + * - XST_FAILURE: An error occured. + * + ******************************************************************************/ +static int XUsbPs_dTDReinitEp(XUsbPs_DeviceConfig *DevCfgPtr, +int EpNum, unsigned short NewDirection) +{ + XUsbPs_Endpoint *Ep; + XUsbPs_EpConfig *EpCfg; + int Td; + int NumdTD; + + + /* Setup pointers for simpler access. + */ + Ep = DevCfgPtr->Ep; + EpCfg = DevCfgPtr->EpCfg; + + + if(NewDirection == XUSBPS_EP_DIRECTION_OUT) { + XUsbPs_EpOut *Out = &Ep[EpNum].Out; + + /* OUT Descriptors + * =============== + * + * + Set the next link pointer + * + Set the interrupt complete and the active bit + * + Attach the buffer to the dTD + */ + NumdTD = EpCfg[EpNum].Out.NumBufs; + + for (Td = 0; Td < NumdTD; ++Td) { + int Status; + + int NextTd = (Td + 1) % NumdTD; + + XUsbPs_dTDInvalidateCache(&Out->dTDs[Td]); + + /* Set NEXT link pointer. + */ + XUsbPs_WritedTD(&Out->dTDs[Td], XUSBPS_dTDNLP, + &Out->dTDs[NextTd]); + + /* Set the OUT descriptor ACTIVE and enable the + * interrupt on complete. + */ + XUsbPs_dTDSetActive(&Out->dTDs[Td]); + XUsbPs_dTDSetIOC(&Out->dTDs[Td]); + + /* Set up the data buffer with the descriptor. If the + * buffer pointer is NULL it means that we do not need + * to attach a buffer to this descriptor. + */ + if (Out->dTDBufs != NULL) { + + Status = XUsbPs_dTDAttachBuffer( + &Out->dTDs[Td], + Out->dTDBufs + + (Td * EpCfg[EpNum].Out.BufSize), + EpCfg[EpNum].Out.BufSize); + if (Status != XST_SUCCESS) { + return XST_FAILURE; + } + } + XUsbPs_dTDFlushCache(&Out->dTDs[Td]); + } + } else if(NewDirection == XUSBPS_EP_DIRECTION_IN) { + XUsbPs_EpIn *In = &Ep[EpNum].In; + + /* IN Descriptors + * ============== + * + * + Set the next link pointer + * + Set the Terminate bit to mark it available + */ + NumdTD = EpCfg[EpNum].In.NumBufs; + + for (Td = 0; Td < NumdTD; ++Td) { + int NextTd = (Td + 1) % NumdTD; + + XUsbPs_dTDInvalidateCache(&In->dTDs[Td]); + + /* Set NEXT link pointer. + */ + XUsbPs_WritedTD(&In->dTDs[Td], XUSBPS_dTDNLP, + &In->dTDs[NextTd]); + + /* Set the IN descriptor's TERMINATE bits. + */ + XUsbPs_dTDSetTerminate(&In->dTDs[Td]); + + XUsbPs_dTDFlushCache(&In->dTDs[Td]); + } + } + + return XST_SUCCESS; +} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_endpoint.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_endpoint.h new file mode 100755 index 000000000..98d701c83 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_endpoint.h @@ -0,0 +1,521 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps_endpoint.h + * + * This is an internal file containung the definitions for endpoints. It is + * included by the xusbps_endpoint.c which is implementing the endpoint + * functions and by xusbps_intr.c. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- -------------------------------------------------------- + * 1.00a wgr 10/10/10 First release + * </pre> + * + ******************************************************************************/ +#ifndef XUSBPS_ENDPOINT_H +#define XUSBPS_ENDPOINT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_cache.h" +#include "xusbps.h" +#include "xil_types.h" + +/**************************** Type Definitions *******************************/ + +/************************** Constant Definitions *****************************/ + + +/** + * Endpoint Device Transfer Descriptor + * + * The dTD describes to the device controller the location and quantity of data + * to be sent/received for given transfer. The driver does not attempt to + * modify any field in an active dTD except the Next Link Pointer. + */ +#define XUSBPS_dTDNLP 0x00 /**< Pointer to the next descriptor */ +#define XUSBPS_dTDTOKEN 0x04 /**< Descriptor Token */ +#define XUSBPS_dTDBPTR0 0x08 /**< Buffer Pointer 0 */ +#define XUSBPS_dTDBPTR1 0x0C /**< Buffer Pointer 1 */ +#define XUSBPS_dTDBPTR2 0x10 /**< Buffer Pointer 2 */ +#define XUSBPS_dTDBPTR3 0x14 /**< Buffer Pointer 3 */ +#define XUSBPS_dTDBPTR4 0x18 /**< Buffer Pointer 4 */ +#define XUSBPS_dTDBPTR(n) (XUSBPS_dTDBPTR0 + (n) * 0x04) +#define XUSBPS_dTDRSRVD 0x1C /**< Reserved field */ + +/* We use the reserved field in the dTD to store user data. */ +#define XUSBPS_dTDUSERDATA XUSBPS_dTDRSRVD /**< Reserved field */ + + +/** @name dTD Next Link Pointer (dTDNLP) bit positions. + * @{ + */ +#define XUSBPS_dTDNLP_T_MASK 0x00000001 + /**< USB dTD Next Link Pointer Terminate Bit */ +#define XUSBPS_dTDNLP_ADDR_MASK 0xFFFFFFE0 + /**< USB dTD Next Link Pointer Address [31:5] */ +/* @} */ + + +/** @name dTD Token (dTDTOKEN) bit positions. + * @{ + */ +#define XUSBPS_dTDTOKEN_XERR_MASK 0x00000008 /**< dTD Transaction Error */ +#define XUSBPS_dTDTOKEN_BUFERR_MASK 0x00000020 /**< dTD Data Buffer Error */ +#define XUSBPS_dTDTOKEN_HALT_MASK 0x00000040 /**< dTD Halted Flag */ +#define XUSBPS_dTDTOKEN_ACTIVE_MASK 0x00000080 /**< dTD Active Bit */ +#define XUSBPS_dTDTOKEN_MULTO_MASK 0x00000C00 /**< Multiplier Override Field [1:0] */ +#define XUSBPS_dTDTOKEN_IOC_MASK 0x00008000 /**< Interrupt on Complete Bit */ +#define XUSBPS_dTDTOKEN_LEN_MASK 0x7FFF0000 /**< Transfer Length Field */ +/* @} */ + + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** + * + * IMPORTANT NOTE: + * =============== + * + * Many of the following macros modify Device Queue Head (dQH) data structures + * and Device Transfer Descriptor (dTD) data structures. Those structures can + * potentially reside in CACHED memory. Therefore, it's the callers + * responsibility to ensure cache coherency by using provided + * + * XUsbPs_dQHInvalidateCache() + * XUsbPs_dQHFlushCache() + * XUsbPs_dTDInvalidateCache() + * XUsbPs_dTDFlushCache() + * + * function calls. + * + ******************************************************************************/ +#define XUsbPs_dTDInvalidateCache(dTDPtr) \ + Xil_DCacheInvalidateRange((unsigned int)dTDPtr, sizeof(XUsbPs_dTD)) + +#define XUsbPs_dTDFlushCache(dTDPtr) \ + Xil_DCacheFlushRange((unsigned int)dTDPtr, sizeof(XUsbPs_dTD)) + +#define XUsbPs_dQHInvalidateCache(dQHPtr) \ + Xil_DCacheInvalidateRange((unsigned int)dQHPtr, sizeof(XUsbPs_dQH)) + +#define XUsbPs_dQHFlushCache(dQHPtr) \ + Xil_DCacheFlushRange((unsigned int)dQHPtr, sizeof(XUsbPs_dQH)) + +/*****************************************************************************/ +/** + * + * This macro sets the Transfer Length for the given Transfer Descriptor. + * + * @param dTDPtr is pointer to the dTD element. + * @param Len is the length to be set. Range: 0..16384 + * + * @note C-style signature: + * void XUsbPs_dTDSetTransferLen(u32 dTDPtr, u32 Len) + * + ******************************************************************************/ +#define XUsbPs_dTDSetTransferLen(dTDPtr, Len) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \ + (XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) & \ + ~XUSBPS_dTDTOKEN_LEN_MASK) | ((Len) << 16)) + + +/*****************************************************************************/ +/** + * + * This macro gets the Next Link pointer of the given Transfer Descriptor. + * + * @param dTDPtr is pointer to the dTD element. + * + * @return TransferLength field of the descriptor. + * + * @note C-style signature: + * u32 XUsbPs_dTDGetTransferLen(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDGetNLP(dTDPtr) \ + (XUsbPs_dTD *) ((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP)\ + & XUSBPS_dTDNLP_ADDR_MASK)) + + +/*****************************************************************************/ +/** + * + * This macro sets the Next Link pointer of the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * @param NLP is the Next Link Pointer + * + * @note C-style signature: + * void XUsbPs_dTDSetTransferLen(u32 dTDPtr, u32 Len) + * + ******************************************************************************/ +#define XUsbPs_dTDSetNLP(dTDPtr, NLP) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \ + (XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) & \ + ~XUSBPS_dTDNLP_ADDR_MASK) | \ + ((NLP) & XUSBPS_dTDNLP_ADDR_MASK)) + + +/*****************************************************************************/ +/** + * + * This macro gets the Transfer Length for the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @return TransferLength field of the descriptor. + * + * @note C-style signature: + * u32 XUsbPs_dTDGetTransferLen(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDGetTransferLen(dTDPtr) \ + (u32) ((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) \ + & XUSBPS_dTDTOKEN_LEN_MASK) >> 16) + + +/*****************************************************************************/ +/** + * + * This macro sets the Interrupt On Complete (IOC) bit for the given Transfer + * Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @note C-style signature: + * void XUsbPs_dTDSetIOC(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDSetIOC(dTDPtr) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \ + XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) | \ + XUSBPS_dTDTOKEN_IOC_MASK) + + +/*****************************************************************************/ +/** + * + * This macro sets the Terminate bit for the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @note C-style signature: + * void XUsbPs_dTDSetTerminate(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDSetTerminate(dTDPtr) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \ + XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) | \ + XUSBPS_dTDNLP_T_MASK) + + +/*****************************************************************************/ +/** + * + * This macro clears the Terminate bit for the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @note C-style signature: + * void XUsbPs_dTDClrTerminate(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDClrTerminate(dTDPtr) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDNLP, \ + XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDNLP) & \ + ~XUSBPS_dTDNLP_T_MASK) + + +/*****************************************************************************/ +/** + * + * This macro checks if the given descriptor is active. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @return + * - TRUE: The buffer is active. + * - FALSE: The buffer is not active. + * + * @note C-style signature: + * int XUsbPs_dTDIsActive(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDIsActive(dTDPtr) \ + ((XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) & \ + XUSBPS_dTDTOKEN_ACTIVE_MASK) ? TRUE : FALSE) + + +/*****************************************************************************/ +/** + * + * This macro sets the Active bit for the given Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * + * @note C-style signature: + * void XUsbPs_dTDSetActive(u32 dTDPtr) + * + ******************************************************************************/ +#define XUsbPs_dTDSetActive(dTDPtr) \ + XUsbPs_WritedTD(dTDPtr, XUSBPS_dTDTOKEN, \ + XUsbPs_ReaddTD(dTDPtr, XUSBPS_dTDTOKEN) | \ + XUSBPS_dTDTOKEN_ACTIVE_MASK) + + +/*****************************************************************************/ +/** + * + * This macro reads the content of a field in a Transfer Descriptor. + * + * @param dTDPtr is a pointer to the dTD element. + * @param Id is the field ID inside the dTD element to read. + * + * @note C-style signature: + * u32 XUsbPs_ReaddTD(u32 dTDPtr, u32 Id) + * + ******************************************************************************/ +#define XUsbPs_ReaddTD(dTDPtr, Id) (*(u32 *)((u32)(dTDPtr) + (u32)(Id))) + +/*****************************************************************************/ +/** + * + * This macro writes a value to a field in a Transfer Descriptor. + * + * @param dTDPtr is pointer to the dTD element. + * @param Id is the field ID inside the dTD element to read. + * @param Val is the value to write to the field. + * + * @note C-style signature: + * u32 XUsbPs_WritedTD(u32 dTDPtr, u32 Id, u32 Val) + * + ******************************************************************************/ +#define XUsbPs_WritedTD(dTDPtr, Id, Val) \ + (*(u32 *) ((u32)(dTDPtr) + (u32)(Id)) = (u32)(Val)) + + +/******************************************************************************/ +/** + * Endpoint Device Queue Head + * + * Device queue heads are arranged in an array in a continuous area of memory + * pointed to by the ENDPOINTLISTADDR pointer. The device controller will index + * into this array based upon the endpoint number received from the USB bus. + * All information necessary to respond to transactions for all primed + * transfers is contained in this list so the Device Controller can readily + * respond to incoming requests without having to traverse a linked list. + * + * The device Endpoint Queue Head (dQH) is where all transfers are managed. The + * dQH is a 48-byte data structure, but must be aligned on a 64-byte boundary. + * During priming of an endpoint, the dTD (device transfer descriptor) is + * copied into the overlay area of the dQH, which starts at the nextTD pointer + * DWord and continues through the end of the buffer pointers DWords. After a + * transfer is complete, the dTD status DWord is updated in the dTD pointed to + * by the currentTD pointer. While a packet is in progress, the overlay area of + * the dQH is used as a staging area for the dTD so that the Device Controller + * can access needed information with little minimal latency. + * + * @note + * Software must ensure that no interface data structure reachable by the + * Device Controller spans a 4K-page boundary. The first element of the + * Endpoint Queue Head List must be aligned on a 4K boundary. + */ +#define XUSBPS_dQHCFG 0x00 /**< dQH Configuration */ +#define XUSBPS_dQHCPTR 0x04 /**< dQH Current dTD Pointer */ +#define XUSBPS_dQHdTDNLP 0x08 /**< dTD Next Link Ptr in dQH + overlay */ +#define XUSBPS_dQHdTDTOKEN 0x0C /**< dTD Token in dQH overlay */ +#define XUSBPS_dQHSUB0 0x28 /**< USB dQH Setup Buffer 0 */ +#define XUSBPS_dQHSUB1 0x2C /**< USB dQH Setup Buffer 1 */ + + +/** @name dQH Configuration (dQHCFG) bit positions. + * @{ + */ +#define XUSBPS_dQHCFG_IOS_MASK 0x00008000 + /**< USB dQH Interrupt on Setup Bit */ +#define XUSBPS_dQHCFG_MPL_MASK 0x07FF0000 + /**< USB dQH Maximum Packet Length + * Field [10:0] */ +#define XUSBPS_dQHCFG_MPL_SHIFT 16 +#define XUSBPS_dQHCFG_ZLT_MASK 0x20000000 + /**< USB dQH Zero Length Termination + * Select Bit */ +#define XUSBPS_dQHCFG_MULT_MASK 0xC0000000 + /* USB dQH Number of Transactions Field + * [1:0] */ +#define XUSBPS_dQHCFG_MULT_SHIFT 30 +/* @} */ + + +/*****************************************************************************/ +/** + * + * This macro sets the Maximum Packet Length field of the give Queue Head. + * + * @param dQHPtr is a pointer to the dQH element. + * @param Len is the length to be set. + * + * @note C-style signature: + * void XUsbPs_dQHSetMaxPacketLen(u32 dQHPtr, u32 Len) + * + ******************************************************************************/ +#define XUsbPs_dQHSetMaxPacketLen(dQHPtr, Len) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + (XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \ + ~XUSBPS_dQHCFG_MPL_MASK) | ((Len) << 16)) + +/*****************************************************************************/ +/** + * + * This macro sets the Interrupt On Setup (IOS) bit for an endpoint. + * + * @param dQHPtr is a pointer to the dQH element. + * + * @note C-style signature: + * void XUsbPs_dQHSetIOS(u32 dQHPtr) + * + ******************************************************************************/ +#define XUsbPs_dQHSetIOS(dQHPtr) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) | \ + XUSBPS_dQHCFG_IOS_MASK) + +/*****************************************************************************/ +/** + * + * This macro clears the Interrupt On Setup (IOS) bit for an endpoint. + * + * @param dQHPtr is a pointer to the dQH element. + * + * @note C-style signature: + * void XUsbPs_dQHClrIOS(u32 dQHPtr) + * + ******************************************************************************/ +#define XUsbPs_dQHClrIOS(dQHPtr) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \ + ~XUSBPS_dQHCFG_IOS_MASK) + +/*****************************************************************************/ +/** + * + * This macro enables Zero Length Termination for the endpoint. + * + * @param dQHPtr is a pointer to the dQH element. + * + * @note C-style signature: + * void XUsbPs_dQHEnableZLT(u32 dQHPtr) + * + * + ******************************************************************************/ +#define XUsbPs_dQHEnableZLT(dQHPtr) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) & \ + ~XUSBPS_dQHCFG_ZLT_MASK) + + +/*****************************************************************************/ +/** + * + * This macro disables Zero Length Termination for the endpoint. + * + * @param dQHPtr is a pointer to the dQH element. + * + * @note C-style signature: + * void XUsbPs_dQHDisableZLT(u32 dQHPtr) + * + * + ******************************************************************************/ +#define XUsbPs_dQHDisableZLT(dQHPtr) \ + XUsbPs_WritedQH(dQHPtr, XUSBPS_dQHCFG, \ + XUsbPs_ReaddQH(dQHPtr, XUSBPS_dQHCFG) | \ + XUSBPS_dQHCFG_ZLT_MASK) + +/*****************************************************************************/ +/** + * + * This macro reads the content of a field in a Queue Head. + * + * @param dQHPtr is a pointer to the dQH element. + * @param Id is the Field ID inside the dQH element to read. + * + * @note C-style signature: + * u32 XUsbPs_ReaddQH(u32 dQHPtr, u32 Id) + * + ******************************************************************************/ +#define XUsbPs_ReaddQH(dQHPtr, Id) (*(u32 *)((u32)(dQHPtr) + (u32) (Id))) + +/*****************************************************************************/ +/** + * + * This macro writes a value to a field in a Queue Head. + * + * @param dQHPtr is a pointer to the dQH element. + * @param Id is the Field ID inside the dQH element to read. + * @param Val is the Value to write to the field. + * + * @note C-style signature: + * u32 XUsbPs_WritedQH(u32 dQHPtr, u32 Id, u32 Val) + * + ******************************************************************************/ +#define XUsbPs_WritedQH(dQHPtr, Id, Val) \ + (*(u32 *) ((u32)(dQHPtr) + (u32)(Id)) = (u32)(Val)) + + + +#ifdef __cplusplus +} +#endif + +#endif /* XUSBPS_ENDPOINT_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_g.c new file mode 100644 index 000000000..c84509f29 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_g.c @@ -0,0 +1,30 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xusbps.h" + +/* +* The configuration table for devices +*/ + +XUsbPs_Config XUsbPs_ConfigTable[] = +{ + { + XPAR_PS7_USB_0_DEVICE_ID, + XPAR_PS7_USB_0_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_hw.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_hw.c new file mode 100755 index 000000000..bdcb9a859 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_hw.c @@ -0,0 +1,128 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** + * + * @file xusbps_hw.c + * + * The implementation of the XUsbPs interface reset functionality + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ----------------------------------------------- + * 1.05a kpc 10/10/10 first version + * </pre> + * + *****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xstatus.h" +#include "xusbps.h" +#include "xparameters.h" + + +/************************** Constant Definitions ****************************/ +#define XUSBPS_RESET_TIMEOUT 0xFFFFF +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + + +/************************** Function Prototypes *****************************/ + + +/*****************************************************************************/ +/** +* This function perform the reset sequence to the given usbps interface by +* configuring the appropriate control bits in the usbps specifc registers. +* the usbps reset sequence involves the below steps +* Disbale the interrupts +* Clear the status registers +* Apply the reset command and wait for reset complete status +* Update the relevant control registers with reset values +* @param BaseAddress of the interface +* +* @return N/A. +* +* @note None. +* +******************************************************************************/ +void XUsbPs_ResetHw(u32 BaseAddress) +{ + u32 RegVal; + u32 Timeout = 0; + + /* Host and device mode */ + /* Disable the interrupts */ + XUsbPs_WriteReg(BaseAddress,XUSBPS_IER_OFFSET,0x0); + /* Clear the interuupt status */ + RegVal = XUsbPs_ReadReg(BaseAddress,XUSBPS_ISR_OFFSET); + XUsbPs_WriteReg(BaseAddress,XUSBPS_ISR_OFFSET,RegVal); + + /* Perform the reset operation using USB CMD register */ + RegVal = XUsbPs_ReadReg(BaseAddress,XUSBPS_CMD_OFFSET); + RegVal = RegVal | XUSBPS_CMD_RST_MASK; + XUsbPs_WriteReg(BaseAddress,XUSBPS_CMD_OFFSET,RegVal); + RegVal = XUsbPs_ReadReg(BaseAddress,XUSBPS_CMD_OFFSET); + /* Wait till the reset operation returns success */ + /* + * FIX ME: right now no indication to the caller or user about + * timeout overflow + */ + while ((RegVal & XUSBPS_CMD_RST_MASK) && (Timeout < XUSBPS_RESET_TIMEOUT)) + { + RegVal = XUsbPs_ReadReg(BaseAddress,XUSBPS_CMD_OFFSET); + Timeout++; + } + /* Update periodic list base address register with reset value */ + XUsbPs_WriteReg(BaseAddress,XUSBPS_LISTBASE_OFFSET,0x0); + /* Update async/endpoint list base address register with reset value */ + XUsbPs_WriteReg(BaseAddress,XUSBPS_ASYNCLISTADDR_OFFSET,0x0); + +} + + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_hw.h new file mode 100755 index 000000000..5986f65bd --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_hw.h @@ -0,0 +1,531 @@ +/****************************************************************************** +* +* (c) Copyright 2010-13 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** + * + * @file xusbps_hw.h + * + * This header file contains identifiers and low-level driver functions (or + * macros) that can be used to access the device. High-level driver functions + * are defined in xusbps.h. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ----------------------------------------------- + * 1.00a wgr 10/10/10 First release + * 1.04a nm 10/23/12 Fixed CR# 679106. + * 1.05a kpc 07/03/13 Added XUsbPs_ResetHw function prototype + * </pre> + * + ******************************************************************************/ +#ifndef XUSBPS_HW_H +#define XUSBPS_HW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files *********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions *****************************/ + + +#define XUSBPS_REG_SPACING 4 + +/** @name Timer 0 Register offsets + * + * @{ + */ +#define XUSBPS_TIMER0_LD_OFFSET 0x00000080 +#define XUSBPS_TIMER0_CTL_OFFSET 0x00000084 +/* @} */ + +/** @name Timer Control Register bit mask + * + * @{ + */ +#define XUSBPS_TIMER_RUN_MASK 0x80000000 +#define XUSBPS_TIMER_STOP_MASK 0x80000000 +#define XUSBPS_TIMER_RESET_MASK 0x40000000 +#define XUSBPS_TIMER_REPEAT_MASK 0x01000000 +/* @} */ + +/** @name Timer Control Register bit mask + * + * @{ + */ +#define XUSBPS_TIMER_COUNTER_MASK 0x00FFFFFF +/* @} */ + +/** @name Device Hardware Parameters + * + * @{ + */ +#define XUSBPS_HWDEVICE_OFFSET 0x0000000C + +#define XUSBPS_EP_NUM_MASK 0x3E +#define XUSBPS_EP_NUM_SHIFT 1 +/* @} */ + +/** @name Capability Regsiter offsets + */ +#define XUSBPS_HCSPARAMS_OFFSET 0x00000104 + +/** @name Operational Register offsets. + * Register comments are tagged with "H:" and "D:" for Host and Device modes, + * respectively. + * Tags are only present for registers that have a different meaning DEVICE and + * HOST modes. Most registers are only valid for either DEVICE or HOST mode. + * Those registers don't have tags. + * @{ + */ +#define XUSBPS_CMD_OFFSET 0x00000140 /**< Configuration */ +#define XUSBPS_ISR_OFFSET 0x00000144 /**< Interrupt Status */ +#define XUSBPS_IER_OFFSET 0x00000148 /**< Interrupt Enable */ +#define XUSBPS_FRAME_OFFSET 0x0000014C /**< USB Frame Index */ +#define XUSBPS_LISTBASE_OFFSET 0x00000154 /**< H: Periodic List Base Address */ +#define XUSBPS_DEVICEADDR_OFFSET 0x00000154 /**< D: Device Address */ +#define XUSBPS_ASYNCLISTADDR_OFFSET 0x00000158 /**< H: Async List Address */ +#define XUSBPS_EPLISTADDR_OFFSET 0x00000158 /**< D: Endpoint List Addr */ +#define XUSBPS_TTCTRL_OFFSET 0x0000015C /**< TT Control */ +#define XUSBPS_BURSTSIZE_OFFSET 0x00000160 /**< Burst Size */ +#define XUSBPS_TXFILL_OFFSET 0x00000164 /**< Tx Fill Tuning */ +#define XUSBPS_ULPIVIEW_OFFSET 0x00000170 /**< ULPI Viewport */ +#define XUSBPS_EPNAKISR_OFFSET 0x00000178 /**< Endpoint NAK IRQ Status */ +#define XUSBPS_EPNAKIER_OFFSET 0x0000017C /**< Endpoint NAK IRQ Enable */ +#define XUSBPS_PORTSCR1_OFFSET 0x00000184 /**< Port Control/Status 1 */ + +/* NOTE: The Port Control / Status Register index is 1-based. */ +#define XUSBPS_PORTSCRn_OFFSET(n) \ + (XUSBPS_PORTSCR1_OFFSET + (((n)-1) * XUSBPS_REG_SPACING)) + + +#define XUSBPS_OTGCSR_OFFSET 0x000001A4 /**< OTG Status and Control */ +#define XUSBPS_MODE_OFFSET 0x000001A8 /**< USB Mode */ +#define XUSBPS_EPSTAT_OFFSET 0x000001AC /**< Endpoint Setup Status */ +#define XUSBPS_EPPRIME_OFFSET 0x000001B0 /**< Endpoint Prime */ +#define XUSBPS_EPFLUSH_OFFSET 0x000001B4 /**< Endpoint Flush */ +#define XUSBPS_EPRDY_OFFSET 0x000001B8 /**< Endpoint Ready */ +#define XUSBPS_EPCOMPL_OFFSET 0x000001BC /**< Endpoint Complete */ +#define XUSBPS_EPCR0_OFFSET 0x000001C0 /**< Endpoint Control 0 */ +#define XUSBPS_EPCR1_OFFSET 0x000001C4 /**< Endpoint Control 1 */ +#define XUSBPS_EPCR2_OFFSET 0x000001C8 /**< Endpoint Control 2 */ +#define XUSBPS_EPCR3_OFFSET 0x000001CC /**< Endpoint Control 3 */ +#define XUSBPS_EPCR4_OFFSET 0x000001D0 /**< Endpoint Control 4 */ + +#define XUSBPS_MAX_ENDPOINTS 4 /**< Number of supported Endpoints in + * this core. */ +#define XUSBPS_EP_OUT_MASK 0x0000001F /**< OUR (RX) endpoint mask */ +#define XUSBPS_EP_IN_MASK 0x001F0000 /**< IN (TX) endpoint mask */ +#define XUSBPS_EP_ALL_MASK 0x001F001F /**< Mask used for endpoint control + * registers */ +#define XUSBPS_EPCRn_OFFSET(n) \ + (XUSBPS_EPCR0_OFFSET + ((n) * XUSBPS_REG_SPACING)) + +#define XUSBPS_EPFLUSH_RX_SHIFT 0 +#define XUSBPS_EPFLUSH_TX_SHIFT 16 + +/* @} */ + + + +/** @name Endpoint Control Register (EPCR) bit positions. + * @{ + */ + +/* Definitions for TX Endpoint bits */ +#define XUSBPS_EPCR_TXT_CONTROL_MASK 0x00000000 /**< Control Endpoint - TX */ +#define XUSBPS_EPCR_TXT_ISO_MASK 0x00040000 /**< Isochronous. Endpoint */ +#define XUSBPS_EPCR_TXT_BULK_MASK 0x00080000 /**< Bulk Endpoint - TX */ +#define XUSBPS_EPCR_TXT_INTR_MASK 0x000C0000 /**< Interrupt Endpoint */ +#define XUSBPS_EPCR_TXS_MASK 0x00010000 /**< Stall TX endpoint */ +#define XUSBPS_EPCR_TXE_MASK 0x00800000 /**< Transmit enable - TX */ +#define XUSBPS_EPCR_TXR_MASK 0x00400000 /**< Data Toggle Reset Bit */ + + +/* Definitions for RX Endpoint bits */ +#define XUSBPS_EPCR_RXT_CONTROL_MASK 0x00000000 /**< Control Endpoint - RX */ +#define XUSBPS_EPCR_RXT_ISO_MASK 0x00000004 /**< Isochronous Endpoint */ +#define XUSBPS_EPCR_RXT_BULK_MASK 0x00000008 /**< Bulk Endpoint - RX */ +#define XUSBPS_EPCR_RXT_INTR_MASK 0x0000000C /**< Interrupt Endpoint */ +#define XUSBPS_EPCR_RXS_MASK 0x00000001 /**< Stall RX endpoint. */ +#define XUSBPS_EPCR_RXE_MASK 0x00000080 /**< Transmit enable. - RX */ +#define XUSBPS_EPCR_RXR_MASK 0x00000040 /**< Data Toggle Reset Bit */ +/* @} */ + + +/** @name USB Command Register (CR) bit positions. + * @{ + */ +#define XUSBPS_CMD_RS_MASK 0x00000001 /**< Run/Stop */ +#define XUSBPS_CMD_RST_MASK 0x00000002 /**< Controller RESET */ +#define XUSBPS_CMD_FS01_MASK 0x0000000C /**< Frame List Size bit 0,1 */ +#define XUSBPS_CMD_PSE_MASK 0x00000010 /**< Periodic Sched Enable */ +#define XUSBPS_CMD_ASE_MASK 0x00000020 /**< Async Sched Enable */ +#define XUSBPS_CMD_IAA_MASK 0x00000040 /**< IRQ Async Advance Doorbell */ +#define XUSBPS_CMD_ASP_MASK 0x00000300 /**< Async Sched Park Mode Cnt */ +#define XUSBPS_CMD_ASPE_MASK 0x00000800 /**< Async Sched Park Mode Enbl */ +#define XUSBPS_CMD_SUTW_MASK 0x00002000 /**< Setup TripWire */ +#define XUSBPS_CMD_ATDTW_MASK 0x00004000 /**< Add dTD TripWire */ +#define XUSBPS_CMD_FS2_MASK 0x00008000 /**< Frame List Size bit 2 */ +#define XUSBPS_CMD_ITC_MASK 0x00FF0000 /**< IRQ Threshold Control */ +/* @} */ + + +/** + * @name Interrupt Threshold + * These definitions are used by software to set the maximum rate at which the + * USB controller will generate interrupt requests. The interrupt interval is + * given in number of micro-frames. + * + * USB defines a full-speed 1 ms frame time indicated by a Start Of Frame (SOF) + * packet each and every 1ms. USB also defines a high-speed micro-frame with a + * 125us frame time. For each micro-frame a SOF (Start Of Frame) packet is + * generated. Data is sent in between the SOF packets. The interrupt threshold + * defines how many micro-frames the controller waits before issuing an + * interrupt after data has been received. + * + * For a threshold of 0 the controller will issue an interrupt immediately + * after the last byte of the data has been received. For a threshold n>0 the + * controller will wait for n micro-frames before issuing an interrupt. + * + * Therefore, a setting of 8 micro-frames (default) means that the controller + * will issue at most 1 interrupt per millisecond. + * + * @{ + */ +#define XUSBPS_CMD_ITHRESHOLD_0 0x00 /**< Immediate interrupt. */ +#define XUSBPS_CMD_ITHRESHOLD_1 0x01 /**< 1 micro-frame */ +#define XUSBPS_CMD_ITHRESHOLD_2 0x02 /**< 2 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_4 0x04 /**< 4 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_8 0x08 /**< 8 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_16 0x10 /**< 16 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_32 0x20 /**< 32 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_64 0x40 /**< 64 micro-frames */ +#define XUSBPS_CMD_ITHRESHOLD_MAX XUSBPS_CMD_ITHRESHOLD_64 +#define XUSBPS_CMD_ITHRESHOLD_DEFAULT XUSBPS_CMD_ITHRESHOLD_8 +/* @} */ + + + +/** @name USB Interrupt Status Register (ISR) / Interrupt Enable Register (IER) + * bit positions. + * @{ + */ +#define XUSBPS_IXR_UI_MASK 0x00000001 /**< USB Transaction Complete */ +#define XUSBPS_IXR_UE_MASK 0x00000002 /**< Transaction Error */ +#define XUSBPS_IXR_PC_MASK 0x00000004 /**< Port Change Detect */ +#define XUSBPS_IXR_FRE_MASK 0x00000008 /**< Frame List Rollover */ +#define XUSBPS_IXR_AA_MASK 0x00000020 /**< Async Advance */ +#define XUSBPS_IXR_UR_MASK 0x00000040 /**< RESET Received */ +#define XUSBPS_IXR_SR_MASK 0x00000080 /**< Start of Frame */ +#define XUSBPS_IXR_SLE_MASK 0x00000100 /**< Device Controller Suspend */ +#define XUSBPS_IXR_ULPI_MASK 0x00000400 /**< ULPI IRQ */ +#define XUSBPS_IXR_HCH_MASK 0x00001000 /**< Host Controller Halted + * Read Only */ +#define XUSBPS_IXR_RCL_MASK 0x00002000 /**< USB Reclamation Read Only */ +#define XUSBPS_IXR_PS_MASK 0x00004000 /**< Periodic Sched Status + * Read Only */ +#define XUSBPS_IXR_AS_MASK 0x00008000 /**< Async Sched Status Read only */ +#define XUSBPS_IXR_NAK_MASK 0x00010000 /**< NAK IRQ */ +#define XUSBPS_IXR_UA_MASK 0x00040000 /**< USB Host Async IRQ */ +#define XUSBPS_IXR_UP_MASK 0x00080000 /**< USB Host Periodic IRQ */ +#define XUSBPS_IXR_TI0_MASK 0x01000000 /**< Timer 0 Interrupt */ +#define XUSBPS_IXR_TI1_MASK 0x02000000 /**< Timer 1 Interrupt */ + +#define XUSBPS_IXR_ALL (XUSBPS_IXR_UI_MASK | \ + XUSBPS_IXR_UE_MASK | \ + XUSBPS_IXR_PC_MASK | \ + XUSBPS_IXR_FRE_MASK | \ + XUSBPS_IXR_AA_MASK | \ + XUSBPS_IXR_UR_MASK | \ + XUSBPS_IXR_SR_MASK | \ + XUSBPS_IXR_SLE_MASK | \ + XUSBPS_IXR_ULPI_MASK | \ + XUSBPS_IXR_HCH_MASK | \ + XUSBPS_IXR_RCL_MASK | \ + XUSBPS_IXR_PS_MASK | \ + XUSBPS_IXR_AS_MASK | \ + XUSBPS_IXR_NAK_MASK | \ + XUSBPS_IXR_UA_MASK | \ + XUSBPS_IXR_UP_MASK | \ + XUSBPS_IXR_TI0_MASK | \ + XUSBPS_IXR_TI1_MASK) + /**< Mask for ALL IRQ types */ +/* @} */ + + +/** @name USB Mode Register (MODE) bit positions. + * @{ + */ +#define XUSBPS_MODE_CM_MASK 0x00000003 /**< Controller Mode Select */ +#define XUSBPS_MODE_CM_IDLE_MASK 0x00000000 +#define XUSBPS_MODE_CM_DEVICE_MASK 0x00000002 +#define XUSBPS_MODE_CM_HOST_MASK 0x00000003 +#define XUSBPS_MODE_ES_MASK 0x00000004 /**< USB Endian Select */ +#define XUSBPS_MODE_SLOM_MASK 0x00000008 /**< USB Setup Lockout Mode Disable */ +#define XUSBPS_MODE_SDIS_MASK 0x00000010 +#define XUSBPS_MODE_VALID_MASK 0x0000001F + +/* @} */ + + +/** @name USB Device Address Register (DEVICEADDR) bit positions. + * @{ + */ +#define XUSBPS_DEVICEADDR_DEVICEAADV_MASK 0x01000000 + /**< Device Addr Auto Advance */ +#define XUSBPS_DEVICEADDR_ADDR_MASK 0xFE000000 + /**< Device Address */ +#define XUSBPS_DEVICEADDR_ADDR_SHIFT 25 + /**< Address shift */ +#define XUSBPS_DEVICEADDR_MAX 127 + /**< Biggest allowed address */ +/* @} */ + +/** @name USB TT Control Register (TTCTRL) bit positions. + * @{ + */ +#define XUSBPS_TTCTRL_HUBADDR_MASK 0x7F000000 /**< TT Hub Address */ +/* @} */ + + +/** @name USB Burst Size Register (BURSTSIZE) bit posisions. + * @{ + */ +#define XUSBPS_BURSTSIZE_RX_MASK 0x000000FF /**< RX Burst Length */ +#define XUSBPS_BURSTSIZE_TX_MASK 0x0000FF00 /**< TX Burst Length */ +/* @} */ + + +/** @name USB Tx Fill Tuning Register (TXFILL) bit positions. + * @{ + */ +#define XUSBPS_TXFILL_OVERHEAD_MASK 0x000000FF + /**< Scheduler Overhead */ +#define XUSBPS_TXFILL_HEALTH_MASK 0x00001F00 + /**< Scheduler Health Cntr */ +#define XUSBPS_TXFILL_BURST_MASK 0x003F0000 + /**< FIFO Burst Threshold */ +/* @} */ + + +/** @name USB ULPI Viewport Register (ULPIVIEW) bit positions. + * @{ + */ +#define XUSBPS_ULPIVIEW_DATWR_MASK 0x000000FF /**< ULPI Data Write */ +#define XUSBPS_ULPIVIEW_DATRD_MASK 0x0000FF00 /**< ULPI Data Read */ +#define XUSBPS_ULPIVIEW_ADDR_MASK 0x00FF0000 /**< ULPI Data Address */ +#define XUSBPS_ULPIVIEW_PORT_MASK 0x07000000 /**< ULPI Port Number */ +#define XUSBPS_ULPIVIEW_SS_MASK 0x08000000 /**< ULPI Synchronous State */ +#define XUSBPS_ULPIVIEW_RW_MASK 0x20000000 /**< ULPI Read/Write Control */ +#define XUSBPS_ULPIVIEW_RUN_MASK 0x40000000 /**< ULPI Run */ +#define XUSBPS_ULPIVIEW_WU_MASK 0x80000000 /**< ULPI Wakeup */ +/* @} */ + + +/** @name Port Status Control Register bit positions. + * @{ + */ +#define XUSBPS_PORTSCR_CCS_MASK 0x00000001 /**< Current Connect Status */ +#define XUSBPS_PORTSCR_CSC_MASK 0x00000002 /**< Connect Status Change */ +#define XUSBPS_PORTSCR_PE_MASK 0x00000004 /**< Port Enable/Disable */ +#define XUSBPS_PORTSCR_PEC_MASK 0x00000008 /**< Port Enable/Disable Change */ +#define XUSBPS_PORTSCR_OCA_MASK 0x00000010 /**< Over-current Active */ +#define XUSBPS_PORTSCR_OCC_MASK 0x00000020 /**< Over-current Change */ +#define XUSBPS_PORTSCR_FPR_MASK 0x00000040 /**< Force Port Resume */ +#define XUSBPS_PORTSCR_SUSP_MASK 0x00000080 /**< Suspend */ +#define XUSBPS_PORTSCR_PR_MASK 0x00000100 /**< Port Reset */ +#define XUSBPS_PORTSCR_HSP_MASK 0x00000200 /**< High Speed Port */ +#define XUSBPS_PORTSCR_LS_MASK 0x00000C00 /**< Line Status */ +#define XUSBPS_PORTSCR_PP_MASK 0x00001000 /**< Port Power */ +#define XUSBPS_PORTSCR_PO_MASK 0x00002000 /**< Port Owner */ +#define XUSBPS_PORTSCR_PIC_MASK 0x0000C000 /**< Port Indicator Control */ +#define XUSBPS_PORTSCR_PTC_MASK 0x000F0000 /**< Port Test Control */ +#define XUSBPS_PORTSCR_WKCN_MASK 0x00100000 /**< Wake on Connect Enable */ +#define XUSBPS_PORTSCR_WKDS_MASK 0x00200000 /**< Wake on Disconnect Enable */ +#define XUSBPS_PORTSCR_WKOC_MASK 0x00400000 /**< Wake on Over-current Enable */ +#define XUSBPS_PORTSCR_PHCD_MASK 0x00800000 /**< PHY Low Power Suspend - + * Clock Disable */ +#define XUSBPS_PORTSCR_PFSC_MASK 0x01000000 /**< Port Force Full Speed + * Connect */ +#define XUSBPS_PORTSCR_PSPD_MASK 0x0C000000 /**< Port Speed */ +/* @} */ + + +/** @name On-The-Go Status Control Register (OTGCSR) bit positions. + * @{ + */ +#define XUSBPS_OTGSC_VD_MASK 0x00000001 /**< VBus Discharge Bit */ +#define XUSBPS_OTGSC_VC_MASK 0x00000002 /**< VBus Charge Bit */ +#define XUSBPS_OTGSC_HAAR_MASK 0x00000004 /**< HW Assist Auto Reset + * Enable Bit */ +#define XUSBPS_OTGSC_OT_MASK 0x00000008 /**< OTG Termination Bit */ +#define XUSBPS_OTGSC_DP_MASK 0x00000010 /**< Data Pulsing Pull-up + * Enable Bit */ +#define XUSBPS_OTGSC_IDPU_MASK 0x00000020 /**< ID Pull-up Enable Bit */ +#define XUSBPS_OTGSC_HADP_MASK 0x00000040 /**< HW Assist Data Pulse + * Enable Bit */ +#define XUSBPS_OTGSC_HABA_MASK 0x00000080 /**< USB Hardware Assist + * B Disconnect to A + * Connect Enable Bit */ +#define XUSBPS_OTGSC_ID_MASK 0x00000100 /**< ID Status Flag */ +#define XUSBPS_OTGSC_AVV_MASK 0x00000200 /**< USB A VBus Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_ASV_MASK 0x00000400 /**< USB A Session Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_BSV_MASK 0x00000800 /**< USB B Session Valid Status Flag */ +#define XUSBPS_OTGSC_BSE_MASK 0x00001000 /**< USB B Session End Status Flag */ +#define XUSBPS_OTGSC_1MST_MASK 0x00002000 /**< USB 1 Millisecond Timer Status Flag */ +#define XUSBPS_OTGSC_DPS_MASK 0x00004000 /**< Data Pulse Status Flag */ +#define XUSBPS_OTGSC_IDIS_MASK 0x00010000 /**< USB ID Interrupt Status Flag */ +#define XUSBPS_OTGSC_AVVIS_MASK 0x00020000 /**< USB A VBus Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_ASVIS_MASK 0x00040000 /**< USB A Session Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_BSVIS_MASK 0x00080000 /**< USB B Session Valid Interrupt Status Flag */ +#define XUSBPS_OTGSC_BSEIS_MASK 0x00100000 /**< USB B Session End Interrupt Status Flag */ +#define XUSBPS_OTGSC_1MSS_MASK 0x00200000 /**< 1 Millisecond Timer Interrupt Status Flag */ +#define XUSBPS_OTGSC_DPIS_MASK 0x00400000 /**< Data Pulse Interrupt Status Flag */ +#define XUSBPS_OTGSC_IDIE_MASK 0x01000000 /**< ID Interrupt Enable Bit */ +#define XUSBPS_OTGSC_AVVIE_MASK 0x02000000 /**< USB A VBus Valid Interrupt Enable Bit */ +#define XUSBPS_OTGSC_ASVIE_MASK 0x04000000 /**< USB A Session Valid Interrupt Enable Bit */ +#define XUSBPS_OTGSC_BSVIE_MASK 0x08000000 /**< USB B Session Valid Interrupt Enable Bit */ +#define XUSBPS_OTGSC_BSEE_MASK 0x10000000 /**< USB B Session End Interrupt Enable Bit */ +#define XUSBPS_OTGSC_1MSE_MASK 0x20000000 /**< 1 Millisecond Timer + * Interrupt Enable Bit */ +#define XUSBPS_OTGSC_DPIE_MASK 0x40000000 /**< Data Pulse Interrupt + * Enable Bit */ + +#define XUSBPS_OTG_ISB_ALL (XUSBPS_OTGSC_IDIS_MASK |\ + XUSBPS_OTGSC_AVVIS_MASK | \ + XUSBPS_OTGSC_ASVIS_MASK | \ + XUSBPS_OTGSC_BSVIS_MASK | \ + XUSBPS_OTGSC_BSEIS_MASK | \ + XUSBPS_OTGSC_1MSS_MASK | \ + XUSBPS_OTGSC_DPIS_MASK) + /** Mask for All IRQ status masks */ + +#define XUSBPS_OTG_IEB_ALL (XUSBPS_OTGSC_IDIE_MASK |\ + XUSBPS_OTGSC_AVVIE_MASK | \ + XUSBPS_OTGSC_ASVIE_MASK | \ + XUSBPS_OTGSC_BSVIE_MASK | \ + XUSBPS_OTGSC_BSEE_IEB_MASK | \ + XUSBPS_OTGSC_1MSE_MASK | \ + XUSBPS_OTGSC_DPIE_MASK) + /** Mask for All IRQ Enable masks */ +/* @} */ + + +/**< Alignment of the Device Queue Head List BASE. */ +#define XUSBPS_dQH_BASE_ALIGN 2048 + +/**< Alignment of a Device Queue Head structure. */ +#define XUSBPS_dQH_ALIGN 64 + +/**< Alignment of a Device Transfer Descriptor structure. */ +#define XUSBPS_dTD_ALIGN 32 + +/**< Size of one RX buffer for a OUT Transfer Descriptor. */ +#define XUSBPS_dTD_BUF_SIZE 4096 + +/**< Maximum size of one RX/TX buffer. */ +#define XUSBPS_dTD_BUF_MAX_SIZE 16*1024 + +/**< Alignment requirement for Transfer Descriptor buffers. */ +#define XUSBPS_dTD_BUF_ALIGN 4096 + + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/****************************************************************************/ +/** +* +* This macro reads the given register. +* +* @param BaseAddress is the base address for the USB registers. +* @param RegOffset is the register offset to be read. +* +* @return The 32-bit value of the register. +* +* @note C-style signature: +* u32 XUsbPs_ReadReg(u32 BaseAddress, u32 RegOffset) +* +*****************************************************************************/ +#define XUsbPs_ReadReg(BaseAddress, RegOffset) \ + Xil_In32(BaseAddress + (RegOffset)) + + +/****************************************************************************/ +/** +* +* This macro writes the given register. +* +* @param BaseAddress is the the base address for the USB registers. +* @param RegOffset is the register offset to be written. +* @param Data is the the 32-bit value to write to the register. +* +* @return None. +* +* @note C-style signature: +* void XUsbPs_WriteReg(u32 BaseAddress, u32 RegOffset, u32 Data) +* + *****************************************************************************/ +#define XUsbPs_WriteReg(BaseAddress, RegOffset, Data) \ + Xil_Out32(BaseAddress + (RegOffset), (Data)) + + +/************************** Function Prototypes ******************************/ +/* + * Perform reset operation to the USB PS interface + */ +void XUsbPs_ResetHw(u32 BaseAddress); +/************************** Variable Definitions ******************************/ + +#ifdef __cplusplus +} +#endif + +#endif /* XUSBPS_L_H */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_intr.c new file mode 100755 index 000000000..96ce39f79 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_intr.c @@ -0,0 +1,476 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/******************************************************************************/ +/** + * @file xusbps_intr.c + * + * This file contains the functions that are related to interrupt processing + * for the EPB USB driver. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ---------------------------------------------------------- + * 1.00a jz 10/10/10 First release + * 1.03a nm 09/21/12 Fixed CR#678977. Added proper sequence for setup packet + * handling. + * </pre> + ******************************************************************************/ + +/***************************** Include Files **********************************/ + +#include "xusbps.h" +#include "xusbps_endpoint.h" + +/************************** Constant Definitions ******************************/ + +/**************************** Type Definitions ********************************/ + +/***************** Macros (Inline Functions) Definitions **********************/ + +/************************** Variable Definitions ******************************/ + +/************************** Function Prototypes *******************************/ + +static void XUsbPs_IntrHandleTX(XUsbPs *InstancePtr, u32 EpCompl); +static void XUsbPs_IntrHandleRX(XUsbPs *InstancePtr, u32 EpCompl); +static void XUsbPs_IntrHandleReset(XUsbPs *InstancePtr, u32 IrqSts); +static void XUsbPs_IntrHandleEp0Setup(XUsbPs *InstancePtr); + +/*****************************************************************************/ +/** +* This function is the first-level interrupt handler for the USB core. All USB +* interrupts will be handled here. Depending on the type of the interrupt, +* second level interrupt handler may be called. Second level interrupt +* handlers will be registered by the user using the: +* XUsbPs_IntrSetHandler() +* and/or +* XUsbPs_EpSetHandler() +* functions. +* +* +* @param HandlerRef is a Reference passed to the interrupt register +* function. In our case this will be a pointer to the XUsbPs +* instance. +* +* @return None +* +* @note None +* +******************************************************************************/ +void XUsbPs_IntrHandler(void *HandlerRef) +{ + XUsbPs *InstancePtr; + + u32 IrqSts; + + Xil_AssertVoid(HandlerRef != NULL); + + InstancePtr = (XUsbPs *) HandlerRef; + + /* Handle controller (non-endpoint) related interrupts. */ + IrqSts = XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_ISR_OFFSET); + + /* Clear the interrupt status register. */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_ISR_OFFSET, IrqSts); + + /* Nak interrupt, used to respond to host's IN request */ + if(IrqSts & XUSBPS_IXR_NAK_MASK) { + /* Ack the hardware */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPNAKISR_OFFSET, + XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPNAKISR_OFFSET)); + } + + + /*************************************************************** + * + * Handle general interrupts. Endpoint interrupts will be handler + * later. + * + */ + + /* RESET interrupt.*/ + if (IrqSts & XUSBPS_IXR_UR_MASK) { + XUsbPs_IntrHandleReset(InstancePtr, IrqSts); + return; + } + + /* Check if we have a user handler that needs to be called. Note that + * this is the handler for general interrupts. Endpoint interrupts will + * be handled below. + */ + if ((IrqSts & InstancePtr->HandlerMask) && InstancePtr->HandlerFunc) { + (InstancePtr->HandlerFunc)(InstancePtr->HandlerRef, IrqSts); + } + + + /*************************************************************** + * + * Handle Endpoint interrupts. + * + */ + if (IrqSts & XUSBPS_IXR_UI_MASK) { + u32 EpStat; + u32 EpCompl; + + /* ENDPOINT 0 SETUP PACKET HANDLING + * + * Check if we got a setup packet on endpoint 0. Currently we + * only check for setup packets on endpoint 0 as we would not + * expect setup packets on any other endpoint (even though it + * is possible to send setup packets on other endpoints). + */ + EpStat = XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPSTAT_OFFSET); + if (EpStat & 0x0001) { + /* Handle the setup packet */ + XUsbPs_IntrHandleEp0Setup(InstancePtr); + + /* Re-Prime the endpoint. + * Endpoint is de-primed if a setup packet comes in. + */ + XUsbPs_EpPrime(InstancePtr, 0, XUSBPS_EP_DIRECTION_OUT); + } + + /* Check for RX and TX complete interrupts. */ + EpCompl = XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPCOMPL_OFFSET); + + + /* ACK the complete interrupts. */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPCOMPL_OFFSET, EpCompl); + + /* Check OUT (RX) endpoints. */ + if (EpCompl & XUSBPS_EP_OUT_MASK) { + XUsbPs_IntrHandleRX(InstancePtr, EpCompl); + } + + /* Check IN (TX) endpoints. */ + if (EpCompl & XUSBPS_EP_IN_MASK) { + XUsbPs_IntrHandleTX(InstancePtr, EpCompl); + } + } +} + + +/*****************************************************************************/ +/** +* This function registers the user callback handler for controller +* (non-endpoint) interrupts. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param CallBackFunc is the Callback function to register. +* CallBackFunc may be NULL to clear the entry. +* @param CallBackRef is the user data reference passed to the +* callback function. CallBackRef may be NULL. +* @param Mask is the User interrupt mask. Defines which interrupts +* will cause the callback to be called. +* +* @return +* - XST_SUCCESS: Callback registered successfully. +* - XST_FAILURE: Callback could not be registered. +* +* @note None. +* +******************************************************************************/ +int XUsbPs_IntrSetHandler(XUsbPs *InstancePtr, + XUsbPs_IntrHandlerFunc CallBackFunc, + void *CallBackRef, u32 Mask) +{ + Xil_AssertNonvoid(InstancePtr != NULL); + + InstancePtr->HandlerFunc = CallBackFunc; + InstancePtr->HandlerRef = CallBackRef; + InstancePtr->HandlerMask = Mask; + + return XST_SUCCESS; +} + + +/*****************************************************************************/ +/** +* This function handles TX buffer interrupts. It is called by the interrupt +* when a transmit complete interrupt occurs. It returns buffers of completed +* descriptors to the caller. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* @param EpCompl is the Bit mask of endpoints that caused a transmit +* complete interrupt. +* +* @return None +* +* @note None. +* +******************************************************************************/ +static void XUsbPs_IntrHandleTX(XUsbPs *InstancePtr, u32 EpCompl) +{ + int Index; + u32 Mask; + int NumEp; + + /* Check all endpoints for TX complete bits. + */ + Mask = 0x00010000; + NumEp = InstancePtr->DeviceConfig.NumEndpoints; + + /* Check for every endpoint if its TX complete bit is + * set. + */ + for (Index = 0; Index < NumEp; Index++, Mask <<= 1) { + XUsbPs_EpIn *Ep; + + if (!(EpCompl & Mask)) { + continue; + } + /* The TX complete bit for this endpoint is + * set. Walk the list of descriptors to see + * which ones are completed. + */ + Ep = &InstancePtr->DeviceConfig.Ep[Index].In; + while (Ep->dTDTail != Ep->dTDHead) { + + XUsbPs_dTDInvalidateCache(Ep->dTDTail); + + /* If the descriptor is not active then the buffer has + * not been sent yet. + */ + if (XUsbPs_dTDIsActive(Ep->dTDTail)) { + break; + } + + if (Ep->HandlerFunc) { + void *BufPtr; + + BufPtr = (void *) XUsbPs_ReaddTD(Ep->dTDTail, + XUSBPS_dTDUSERDATA); + + Ep->HandlerFunc(Ep->HandlerRef, Index, + XUSBPS_EP_EVENT_DATA_TX, + BufPtr); + } + + Ep->dTDTail = XUsbPs_dTDGetNLP(Ep->dTDTail); + } + } +} + + +/*****************************************************************************/ +/** + * This function handles RX buffer interrupts. It is called by the interrupt + * when a receive complete interrupt occurs. It notifies the callback functions + * that have been registered with the individual endpoints that data has been + * received. + * + * @param InstancePtr + * Pointer to the XUsbPs instance of the controller. + * + * @param EpCompl + * Bit mask of endpoints that caused a receive complete interrupt. + * @return + * none + * + ******************************************************************************/ +static void XUsbPs_IntrHandleRX(XUsbPs *InstancePtr, u32 EpCompl) +{ + XUsbPs_EpOut *Ep; + int Index; + u32 Mask; + int NumEp; + + /* Check all endpoints for RX complete bits. */ + Mask = 0x00000001; + NumEp = InstancePtr->DeviceConfig.NumEndpoints; + + + /* Check for every endpoint if its RX complete bit is set.*/ + for (Index = 0; Index < NumEp; Index++, Mask <<= 1) { + int numP = 0; + + if (!(EpCompl & Mask)) { + continue; + } + Ep = &InstancePtr->DeviceConfig.Ep[Index].Out; + + XUsbPs_dTDInvalidateCache(Ep->dTDCurr); + + /* Handle all finished dTDs */ + while (!XUsbPs_dTDIsActive(Ep->dTDCurr)) { + numP += 1; + if (Ep->HandlerFunc) { + Ep->HandlerFunc(Ep->HandlerRef, Index, + XUSBPS_EP_EVENT_DATA_RX, NULL); + } + + Ep->dTDCurr = XUsbPs_dTDGetNLP(Ep->dTDCurr); + XUsbPs_dTDInvalidateCache(Ep->dTDCurr); + } + /* Re-Prime the endpoint.*/ + XUsbPs_EpPrime(InstancePtr, Index, XUSBPS_EP_DIRECTION_OUT); + } +} + + +/*****************************************************************************/ +/** +* This function handles a RESET interrupt. It will notify the interrupt +* handler callback of the RESET condition. +* +* @param InstancePtr is pointer to the XUsbPs instance of the controller +* @param IrqSts is the Interrupt status register content. +* To be passed on to the user. +* +* @return None +* +* @Note None. +* +******************************************************************************/ +static void XUsbPs_IntrHandleReset(XUsbPs *InstancePtr, u32 IrqSts) +{ + int Timeout; + + /* Clear all setup token semaphores by reading the + * XUSBPS_EPSTAT_OFFSET register and writing its value back to + * itself. + */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, XUSBPS_EPSTAT_OFFSET, + XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPSTAT_OFFSET)); + + /* Clear all the endpoint complete status bits by reading the + * XUSBPS_EPCOMPL_OFFSET register and writings its value back + * to itself. + */ + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPCOMPL_OFFSET, + XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPCOMPL_OFFSET)); + + /* Cancel all endpoint prime status by waiting until all bits + * in XUSBPS_EPPRIME_OFFSET are 0 and then writing 0xFFFFFFFF + * to XUSBPS_EPFLUSH_OFFSET. + * + * Avoid hanging here by using a Timeout counter... + */ + Timeout = XUSBPS_TIMEOUT_COUNTER; + while ((XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPPRIME_OFFSET) & + XUSBPS_EP_ALL_MASK) && --Timeout) { + /* NOP */ + } + XUsbPs_WriteReg(InstancePtr->Config.BaseAddress, + XUSBPS_EPFLUSH_OFFSET, 0xFFFFFFFF); + + /* Make sure that the reset bit in XUSBPS_PORTSCR1_OFFSET is + * still set at this point. If the code gets to this point and + * the reset bit has already been cleared we are in trouble and + * hardware reset is necessary. + */ + if (!(XUsbPs_ReadReg(InstancePtr->Config.BaseAddress, + XUSBPS_PORTSCR1_OFFSET) & + XUSBPS_PORTSCR_PR_MASK)) { + /* Send a notification to the user that a hardware + * RESET is required. At this point we can only hope + * that the user registered an interrupt handler and + * will issue a hardware RESET. + */ + if (InstancePtr->HandlerFunc) { + (InstancePtr->HandlerFunc)(InstancePtr->HandlerRef, + IrqSts); + } + else { + for (;;); + } + + /* If we get here there is nothing more to do. The user + * should have reset the core. + */ + return; + } + + /* Check if we have a user handler that needs to be called. + */ + if (InstancePtr->HandlerFunc) { + (InstancePtr->HandlerFunc)(InstancePtr->HandlerRef, IrqSts); + } + + /* We are done. After RESET we don't proceed in the interrupt + * handler. + */ +} + + +/*****************************************************************************/ +/** +* This function handles a Setup Packet interrupt. It will notify the interrupt +* handler callback of the RESET condition. +* +* @param InstancePtr is a pointer to the XUsbPs instance of the +* controller. +* +* @return None +* +* @Note None +* +******************************************************************************/ +static void XUsbPs_IntrHandleEp0Setup(XUsbPs *InstancePtr) +{ + + XUsbPs_EpOut *Ep; + + /* Notifiy the user. */ + Ep = &InstancePtr->DeviceConfig.Ep[0].Out; + + if (Ep->HandlerFunc) { + Ep->HandlerFunc(Ep->HandlerRef, 0, + XUSBPS_EP_EVENT_SETUP_DATA_RECEIVED, NULL); + } +} + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_sinit.c new file mode 100755 index 000000000..7e218e94e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/usbps_v1_05_a/src/xusbps_sinit.c @@ -0,0 +1,105 @@ +/****************************************************************************** +* +* (c) Copyright 2010-12 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** + * + * @file xusbps_sinit.c + * + * The implementation of the XUsbPs driver's static initialzation + * functionality. + * + * <pre> + * MODIFICATION HISTORY: + * + * Ver Who Date Changes + * ----- ---- -------- ----------------------------------------------- + * 1.00a wgr 10/10/10 First release + * </pre> + * + *****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xstatus.h" +#include "xusbps.h" +#include "xparameters.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +extern XUsbPs_Config XUsbPs_ConfigTable[]; + +/************************** Function Prototypes *****************************/ + +/****************************************************************************/ +/** +* +* Looks up the controller configuration based on the unique controller ID. A +* table contains the configuration info for each controller in the system. +* +* @param DeviceID is the ID of the controller to look up the +* configuration for. +* +* @return +* A pointer to the configuration found or NULL if the specified +* controller ID was not found. +* +******************************************************************************/ +XUsbPs_Config *XUsbPs_LookupConfig(u16 DeviceID) +{ + XUsbPs_Config *CfgPtr = NULL; + + int Index; + + for (Index = 0; Index < XPAR_XUSBPS_NUM_INSTANCES; Index++) { + if (XUsbPs_ConfigTable[Index].DeviceID == DeviceID) { + CfgPtr = &XUsbPs_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/Makefile b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/Makefile new file mode 100755 index 000000000..96aeb0c5f --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/Makefile @@ -0,0 +1,41 @@ +COMPILER= +ARCHIVER= +CP=cp +COMPILER_FLAGS= +EXTRA_COMPILER_FLAGS= +LIB=libxil.a + +CC_FLAGS = $(COMPILER_FLAGS) +ECC_FLAGS = $(EXTRA_COMPILER_FLAGS) + +RELEASEDIR=../../../lib +INCLUDEDIR=../../../include +INCLUDES=-I./. -I${INCLUDEDIR} + +OUTS = *.o + +LIBSOURCES:=*.c +INCLUDEFILES:=*.h + +OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) + +libs: banner xadcps_libs clean + +%.o: %.c + ${COMPILER} $(CC_FLAGS) $(ECC_FLAGS) $(INCLUDES) -o $@ $< + +banner: + echo "Compiling xadcps" + +xadcps_libs: ${OBJECTS} + $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OBJECTS} + +.PHONY: include +include: xadcps_includes + +xadcps_includes: + ${CP} ${INCLUDEFILES} ${INCLUDEDIR} + +clean: + rm -rf ${OBJECTS} + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps.c new file mode 100755 index 000000000..662b4c1ca --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps.c @@ -0,0 +1,1835 @@ +/****************************************************************************** +* +* (c) Copyright 2012-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps.c +* +* This file contains the driver API functions that can be used to access +* the XADC device. +* +* Refer to the xadcps.h header file for more information about this driver. +* +* @note None. +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a ssb 12/22/11 First release based on the XPS/AXI xadc driver +* 1.01a bss 02/18/13 Modified XAdcPs_SetSeqChEnables,XAdcPs_SetSeqAvgEnables +* XAdcPs_SetSeqInputMode and XAdcPs_SetSeqAcqTime APIs +* to fix CR #693371 +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xadcps.h" + +/************************** Constant Definitions ****************************/ + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Function Prototypes *****************************/ + +void XAdcPs_WriteInternalReg(XAdcPs *InstancePtr, u32 RegOffset, u32 Data); +u32 XAdcPs_ReadInternalReg(XAdcPs *InstancePtr, u32 RegOffset); + + +/************************** Variable Definitions ****************************/ + + +/*****************************************************************************/ +/** +* +* This function initializes a specific XAdcPs device/instance. This function +* must be called prior to using the XADC device. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param ConfigPtr points to the XAdcPs device configuration structure. +* @param EffectiveAddr is the device base address in the virtual memory +* address space. If the address translation is not used then the +* physical address is passed. +* Unexpected errors may occur if the address mapping is changed +* after this function is invoked. +* +* @return +* - XST_SUCCESS if successful. +* +* @note The user needs to first call the XAdcPs_LookupConfig() API +* which returns the Configuration structure pointer which is +* passed as a parameter to the XAdcPs_CfgInitialize() API. +* +******************************************************************************/ +int XAdcPs_CfgInitialize(XAdcPs *InstancePtr, XAdcPs_Config *ConfigPtr, + u32 EffectiveAddr) +{ + + u32 RegValue; + /* + * Assert the input arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(ConfigPtr != NULL); + + + /* + * Set the values read from the device config and the base address. + */ + InstancePtr->Config.DeviceId = ConfigPtr->DeviceId; + InstancePtr->Config.BaseAddress = EffectiveAddr; + + /* Write Unlock value to Device Config Unlock register */ + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, + XADCPS_UNLK_OFFSET, XADCPS_UNLK_VALUE); + + /* Enable the PS access of xadc and set FIFO thresholds */ + + RegValue = XAdcPs_ReadReg((InstancePtr)->Config.BaseAddress, + XADCPS_CFG_OFFSET); + + RegValue = RegValue | XADCPS_CFG_ENABLE_MASK | + XADCPS_CFG_CFIFOTH_MASK | XADCPS_CFG_DFIFOTH_MASK; + + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, + XADCPS_CFG_OFFSET, RegValue); + + /* Release xadc from reset */ + + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, + XADCPS_MCTL_OFFSET, 0x00); + + /* + * Indicate the instance is now ready to use and + * initialized without error. + */ + InstancePtr->IsReady = XIL_COMPONENT_IS_READY; + + return XST_SUCCESS; +} + + +/****************************************************************************/ +/** +* +* The functions sets the contents of the Config Register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Data is the 32 bit data to be written to the Register. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_SetConfigRegister(XAdcPs *InstancePtr, u32 Data) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, + XADCPS_CFG_OFFSET, Data); + +} + + +/****************************************************************************/ +/** +* +* The functions reads the contents of the Config Register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return A 32-bit value representing the contents of the Config Register. +* Use the XADCPS_SR_*_MASK constants defined in xadcps_hw.h to +* interpret the returned value. +* +* @note None. +* +*****************************************************************************/ +u32 XAdcPs_GetConfigRegister(XAdcPs *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Config Register and return the value. + */ + return XAdcPs_ReadReg((InstancePtr)->Config.BaseAddress, + XADCPS_CFG_OFFSET); +} + + +/****************************************************************************/ +/** +* +* The functions reads the contents of the Miscellaneous Status Register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return A 32-bit value representing the contents of the Miscellaneous +* Status Register. Use the XADCPS_MSTS_*_MASK constants defined +* in xadcps_hw.h to interpret the returned value. +* +* @note None. +* +*****************************************************************************/ +u32 XAdcPs_GetMiscStatus(XAdcPs *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Miscellaneous Status Register and return the value. + */ + return XAdcPs_ReadReg((InstancePtr)->Config.BaseAddress, + XADCPS_MSTS_OFFSET); +} + + +/****************************************************************************/ +/** +* +* The functions sets the contents of the Miscellaneous Control register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Data is the 32 bit data to be written to the Register. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_SetMiscCtrlRegister(XAdcPs *InstancePtr, u32 Data) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Write to the Miscellaneous control register Register. + */ + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, + XADCPS_MCTL_OFFSET, Data); +} + + +/****************************************************************************/ +/** +* +* The functions reads the contents of the Miscellaneous control register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return A 32-bit value representing the contents of the Config Register. +* Use the XADCPS_SR_*_MASK constants defined in xadcps_hw.h to +* interpret the returned value. +* +* @note None. +* +*****************************************************************************/ +u32 XAdcPs_GetMiscCtrlRegister(XAdcPs *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Miscellaneous control register and return the value. + */ + return XAdcPs_ReadReg((InstancePtr)->Config.BaseAddress, + XADCPS_MCTL_OFFSET); +} + + +/*****************************************************************************/ +/** +* +* This function resets the XADC Hard Macro in the device. +* +* @param InstancePtr is a pointer to the Xxadc instance. +* +* @return None. +* +* @note None. +* +******************************************************************************/ +void XAdcPs_Reset(XAdcPs *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Generate the reset by Control + * register and release from reset + */ + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, + XADCPS_MCTL_OFFSET, 0x10); + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, + XADCPS_MCTL_OFFSET, 0x00); +} + + +/****************************************************************************/ +/** +* +* Get the ADC converted data for the specified channel. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Channel is the channel number. Use the XADCPS_CH_* defined in +* the file xadcps.h. +* The valid channels are +* - 0 to 6 +* - 13 to 31 +* +* @return A 16-bit value representing the ADC converted data for the +* specified channel. The XADC Monitor/ADC device guarantees +* a 10 bit resolution for the ADC converted data and data is the +* 10 MSB bits of the 16 data read from the device. +* +* @note The channels 7,8,9 are used for calibration of the device and +* hence there is no associated data with this channel. +* +*****************************************************************************/ +u16 XAdcPs_GetAdcData(XAdcPs *InstancePtr, u8 Channel) +{ + + u32 RegData; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((Channel <= XADCPS_CH_VBRAM) || + ((Channel >= XADCPS_CH_VCCPINT) && + (Channel <= XADCPS_CH_AUX_MAX))); + + RegData = XAdcPs_ReadInternalReg(InstancePtr, + (XADCPS_TEMP_OFFSET + + Channel)); + return (u16) RegData; +} + +/****************************************************************************/ +/** +* +* This function gets the calibration coefficient data for the specified +* parameter. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param CoeffType specifies the calibration coefficient +* to be read. Use XADCPS_CALIB_* constants defined in xadcps.h to +* specify the calibration coefficient to be read. +* +* @return A 16-bit value representing the calibration coefficient. +* The XADC device guarantees a 10 bit resolution for +* the ADC converted data and data is the 10 MSB bits of the 16 +* data read from the device. +* +* @note None. +* +*****************************************************************************/ +u16 XAdcPs_GetCalibCoefficient(XAdcPs *InstancePtr, u8 CoeffType) +{ + u32 RegData; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(CoeffType <= XADCPS_CALIB_GAIN_ERROR_COEFF); + + /* + * Read the selected calibration coefficient. + */ + RegData = XAdcPs_ReadInternalReg(InstancePtr, + (XADCPS_ADC_A_SUPPLY_CALIB_OFFSET + + CoeffType)); + return (u16) RegData; +} + +/****************************************************************************/ +/** +* +* This function reads the Minimum/Maximum measurement for one of the +* specified parameters. Use XADCPS_MAX_* and XADCPS_MIN_* constants defined in +* xadcps.h to specify the parameters (Temperature, VccInt, VccAux, VBram, +* VccPInt, VccPAux and VccPDro). +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param MeasurementType specifies the parameter for which the +* Minimum/Maximum measurement has to be read. +* Use XADCPS_MAX_* and XADCPS_MIN_* constants defined in xadcps.h to +* specify the data to be read. +* +* @return A 16-bit value representing the maximum/minimum measurement for +* specified parameter. +* The XADC device guarantees a 10 bit resolution for +* the ADC converted data and data is the 10 MSB bits of the 16 +* data read from the device. +* +* @note None. +* +*****************************************************************************/ +u16 XAdcPs_GetMinMaxMeasurement(XAdcPs *InstancePtr, u8 MeasurementType) +{ + u32 RegData; + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((MeasurementType <= XADCPS_MAX_VCCPDRO) || + ((MeasurementType >= XADCPS_MIN_VCCPINT) && + (MeasurementType <= XADCPS_MIN_VCCPDRO))) + + /* + * Read and return the specified Minimum/Maximum measurement. + */ + RegData = XAdcPs_ReadInternalReg(InstancePtr, + (XADCPS_MAX_TEMP_OFFSET + + MeasurementType)); + return (u16) RegData; +} + +/****************************************************************************/ +/** +* +* This function sets the number of samples of averaging that is to be done for +* all the channels in both the single channel mode and sequence mode of +* operations. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Average is the number of samples of averaging programmed to the +* Configuration Register 0. Use the XADCPS_AVG_* definitions defined +* in xadcps.h file : +* - XADCPS_AVG_0_SAMPLES for no averaging +* - XADCPS_AVG_16_SAMPLES for 16 samples of averaging +* - XADCPS_AVG_64_SAMPLES for 64 samples of averaging +* - XADCPS_AVG_256_SAMPLES for 256 samples of averaging +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_SetAvg(XAdcPs *InstancePtr, u8 Average) +{ + u32 RegData; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Average <= XADCPS_AVG_256_SAMPLES); + + /* + * Write the averaging value into the Configuration Register 0. + */ + RegData = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR0_OFFSET) & + (~XADCPS_CFR0_AVG_VALID_MASK); + + RegData |= (((u32) Average << XADCPS_CFR0_AVG_SHIFT)); + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR0_OFFSET, + RegData); + +} + +/****************************************************************************/ +/** +* +* This function returns the number of samples of averaging configured for all +* the channels in the Configuration Register 0. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return The averaging read from the Configuration Register 0 is +* returned. Use the XADCPS_AVG_* bit definitions defined in +* xadcps.h file to interpret the returned value : +* - XADCPS_AVG_0_SAMPLES means no averaging +* - XADCPS_AVG_16_SAMPLES means 16 samples of averaging +* - XADCPS_AVG_64_SAMPLES means 64 samples of averaging +* - XADCPS_AVG_256_SAMPLES means 256 samples of averaging +* +* @note None. +* +*****************************************************************************/ +u8 XAdcPs_GetAvg(XAdcPs *InstancePtr) +{ + u32 Average; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the averaging value from the Configuration Register 0. + */ + Average = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR0_OFFSET) & XADCPS_CFR0_AVG_VALID_MASK; + + + return ((u8) (Average >> XADCPS_CFR0_AVG_SHIFT)); +} + +/****************************************************************************/ +/** +* +* The function sets the given parameters in the Configuration Register 0 in +* the single channel mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Channel is the channel number for the singel channel mode. +* The valid channels are 0 to 5, 8, and 16 to 31. +* If the external Mux is used then this specifies the channel +* oonnected to the external Mux. Please read the Device Spec +* to know which channels are valid. +* @param IncreaseAcqCycles is a boolean parameter which specifies whether +* the Acquisition time for the external channels has to be +* increased to 10 ADCCLK cycles (specify TRUE) or remain at the +* default 4 ADCCLK cycles (specify FALSE). This parameter is +* only valid for the external channels. +* @param IsDifferentialMode is a boolean parameter which specifies +* unipolar(specify FALSE) or differential mode (specify TRUE) for +* the analog inputs. The input mode is only valid for the +* external channels. +* +* @return +* - XST_SUCCESS if the given values were written successfully to +* the Configuration Register 0. +* - XST_FAILURE if the channel sequencer is enabled or the input +* parameters are not valid for the selected channel. +* +* @note +* - The number of samples for the averaging for all the channels +* is set by using the function XAdcPs_SetAvg. +* - The calibration of the device is done by doing a ADC +* conversion on the calibration channel(channel 8). The input +* parameters IncreaseAcqCycles, IsDifferentialMode and +* IsEventMode are not valid for this channel +* +* +*****************************************************************************/ +int XAdcPs_SetSingleChParams(XAdcPs *InstancePtr, + u8 Channel, + int IncreaseAcqCycles, + int IsEventMode, + int IsDifferentialMode) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid((Channel <= XADCPS_CH_VREFN) || + (Channel == XADCPS_CH_ADC_CALIB) || + ((Channel >= XADCPS_CH_AUX_MIN) && + (Channel <= XADCPS_CH_AUX_MAX))); + Xil_AssertNonvoid((IncreaseAcqCycles == TRUE) || + (IncreaseAcqCycles == FALSE)); + Xil_AssertNonvoid((IsEventMode == TRUE) || (IsEventMode == FALSE)); + Xil_AssertNonvoid((IsDifferentialMode == TRUE) || + (IsDifferentialMode == FALSE)); + + /* + * Check if the device is in single channel mode else return failure + */ + if ((XAdcPs_GetSequencerMode(InstancePtr) != + XADCPS_SEQ_MODE_SINGCHAN)) { + return XST_FAILURE; + } + + /* + * Read the Configuration Register 0. + */ + RegValue = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR0_OFFSET) & + XADCPS_CFR0_AVG_VALID_MASK; + + /* + * Select the number of acquisition cycles. The acquisition cycles is + * only valid for the external channels. + */ + if (IncreaseAcqCycles == TRUE) { + if (((Channel >= XADCPS_CH_AUX_MIN) && + (Channel <= XADCPS_CH_AUX_MAX)) || + (Channel == XADCPS_CH_VPVN)){ + RegValue |= XADCPS_CFR0_ACQ_MASK; + } else { + return XST_FAILURE; + } + + } + + /* + * Select the input mode. The input mode is only valid for the + * external channels. + */ + if (IsDifferentialMode == TRUE) { + + if (((Channel >= XADCPS_CH_AUX_MIN) && + (Channel <= XADCPS_CH_AUX_MAX)) || + (Channel == XADCPS_CH_VPVN)){ + RegValue |= XADCPS_CFR0_DU_MASK; + } else { + return XST_FAILURE; + } + } + + /* + * Select the ADC mode. + */ + if (IsEventMode == TRUE) { + RegValue |= XADCPS_CFR0_EC_MASK; + } + + /* + * Write the given values into the Configuration Register 0. + */ + RegValue |= (Channel & XADCPS_CFR0_CHANNEL_MASK); + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR0_OFFSET, + RegValue); + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* This function enables the alarm outputs for the specified alarms in the +* Configuration Register 1. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param AlmEnableMask is the bit-mask of the alarm outputs to be enabled +* in the Configuration Register 1. +* Bit positions of 1 will be enabled. Bit positions of 0 will be +* disabled. This mask is formed by OR'ing XADCPS_CFR1_ALM_*_MASK and +* XADCPS_CFR1_OT_MASK masks defined in xadcps_hw.h. +* +* @return None. +* +* @note The implementation of the alarm enables in the Configuration +* register 1 is such that the alarms for bit positions of 1 will +* be disabled and alarms for bit positions of 0 will be enabled. +* The alarm outputs specified by the AlmEnableMask are negated +* before writing to the Configuration Register 1. +* +* +*****************************************************************************/ +void XAdcPs_SetAlarmEnables(XAdcPs *InstancePtr, u16 AlmEnableMask) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + RegValue = XAdcPs_ReadInternalReg(InstancePtr, XADCPS_CFR1_OFFSET); + + RegValue &= (u32)~XADCPS_CFR1_ALM_ALL_MASK; + RegValue |= (~AlmEnableMask & XADCPS_CFR1_ALM_ALL_MASK); + + /* + * Enable/disables the alarm enables for the specified alarm bits in the + * Configuration Register 1. + */ + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR1_OFFSET, + RegValue); +} + +/****************************************************************************/ +/** +* +* This function gets the status of the alarm output enables in the +* Configuration Register 1. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return This is the bit-mask of the enabled alarm outputs in the +* Configuration Register 1. Use the masks XADCPS_CFR1_ALM*_* and +* XADCPS_CFR1_OT_MASK defined in xadcps_hw.h to interpret the +* returned value. +* Bit positions of 1 indicate that the alarm output is enabled. +* Bit positions of 0 indicate that the alarm output is disabled. +* +* +* @note The implementation of the alarm enables in the Configuration +* register 1 is such that alarms for the bit positions of 1 will +* be disabled and alarms for bit positions of 0 will be enabled. +* The enabled alarm outputs returned by this function is the +* negated value of the the data read from the Configuration +* Register 1. +* +*****************************************************************************/ +u16 XAdcPs_GetAlarmEnables(XAdcPs *InstancePtr) +{ + u32 RegValue; + + /* + * Assert the arguments + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the status of alarm output enables from the Configuration + * Register 1. + */ + RegValue = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR1_OFFSET) & XADCPS_CFR1_ALM_ALL_MASK; + return (u16) (~RegValue & XADCPS_CFR1_ALM_ALL_MASK); +} + +/****************************************************************************/ +/** +* +* This function enables the specified calibration in the Configuration +* Register 1 : +* +* - XADCPS_CFR1_CAL_ADC_OFFSET_MASK : Calibration 0 -ADC offset correction +* - XADCPS_CFR1_CAL_ADC_GAIN_OFFSET_MASK : Calibration 1 -ADC gain and offset +* correction +* - XADCPS_CFR1_CAL_PS_OFFSET_MASK : Calibration 2 -Power Supply sensor +* offset correction +* - XADCPS_CFR1_CAL_PS_GAIN_OFFSET_MASK : Calibration 3 -Power Supply sensor +* gain and offset correction +* - XADCPS_CFR1_CAL_DISABLE_MASK : No Calibration +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Calibration is the Calibration to be applied. +* Use XADCPS_CFR1_CAL*_* bits defined in xadcps_hw.h. +* Multiple calibrations can be enabled at a time by oring the +* XADCPS_CFR1_CAL_ADC_* and XADCPS_CFR1_CAL_PS_* bits. +* Calibration can be disabled by specifying + XADCPS_CFR1_CAL_DISABLE_MASK; +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_SetCalibEnables(XAdcPs *InstancePtr, u16 Calibration) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(((Calibration >= XADCPS_CFR1_CAL_ADC_OFFSET_MASK) && + (Calibration <= XADCPS_CFR1_CAL_VALID_MASK)) || + (Calibration == XADCPS_CFR1_CAL_DISABLE_MASK)); + + /* + * Set the specified calibration in the Configuration Register 1. + */ + RegValue = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR1_OFFSET); + + RegValue &= (~ XADCPS_CFR1_CAL_VALID_MASK); + RegValue |= (Calibration & XADCPS_CFR1_CAL_VALID_MASK); + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR1_OFFSET, + RegValue); + +} + +/****************************************************************************/ +/** +* +* This function reads the value of the calibration enables from the +* Configuration Register 1. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return The value of the calibration enables in the Configuration +* Register 1 : +* - XADCPS_CFR1_CAL_ADC_OFFSET_MASK : ADC offset correction +* - XADCPS_CFR1_CAL_ADC_GAIN_OFFSET_MASK : ADC gain and offset +* correction +* - XADCPS_CFR1_CAL_PS_OFFSET_MASK : Power Supply sensor offset +* correction +* - XADCPS_CFR1_CAL_PS_GAIN_OFFSET_MASK : Power Supply sensor +* gain and offset correction +* - XADCPS_CFR1_CAL_DISABLE_MASK : No Calibration +* +* @note None. +* +*****************************************************************************/ +u16 XAdcPs_GetCalibEnables(XAdcPs *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the calibration enables from the Configuration Register 1. + */ + return (u16) XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR1_OFFSET) & XADCPS_CFR1_CAL_VALID_MASK; + +} + +/****************************************************************************/ +/** +* +* This function sets the specified Channel Sequencer Mode in the Configuration +* Register 1 : +* - Default safe mode (XADCPS_SEQ_MODE_SAFE) +* - One pass through sequence (XADCPS_SEQ_MODE_ONEPASS) +* - Continuous channel sequencing (XADCPS_SEQ_MODE_CONTINPASS) +* - Single Channel/Sequencer off (XADCPS_SEQ_MODE_SINGCHAN) +* - Simulataneous sampling mode (XADCPS_SEQ_MODE_SIMUL_SAMPLING) +* - Independent mode (XADCPS_SEQ_MODE_INDEPENDENT) +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param SequencerMode is the sequencer mode to be set. +* Use XADCPS_SEQ_MODE_* bits defined in xadcps.h. +* @return None. +* +* @note Only one of the modes can be enabled at a time. Please +* read the Spec of the XADC for further information about the +* sequencer modes. +* +* +*****************************************************************************/ +void XAdcPs_SetSequencerMode(XAdcPs *InstancePtr, u8 SequencerMode) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((SequencerMode <= XADCPS_SEQ_MODE_SIMUL_SAMPLING) || + (SequencerMode == XADCPS_SEQ_MODE_INDEPENDENT)); + + /* + * Set the specified sequencer mode in the Configuration Register 1. + */ + RegValue = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR1_OFFSET); + RegValue &= (~ XADCPS_CFR1_SEQ_VALID_MASK); + RegValue |= ((SequencerMode << XADCPS_CFR1_SEQ_SHIFT) & + XADCPS_CFR1_SEQ_VALID_MASK); + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR1_OFFSET, + RegValue); + +} + +/****************************************************************************/ +/** +* +* This function gets the channel sequencer mode from the Configuration +* Register 1. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return The channel sequencer mode : +* - XADCPS_SEQ_MODE_SAFE : Default safe mode +* - XADCPS_SEQ_MODE_ONEPASS : One pass through sequence +* - XADCPS_SEQ_MODE_CONTINPASS : Continuous channel sequencing +* - XADCPS_SEQ_MODE_SINGCHAN : Single channel/Sequencer off +* - XADCPS_SEQ_MODE_SIMUL_SAMPLING : Simulataneous sampling mode +* - XADCPS_SEQ_MODE_INDEPENDENT : Independent mode +* +* +* @note None. +* +*****************************************************************************/ +u8 XAdcPs_GetSequencerMode(XAdcPs *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the channel sequencer mode from the Configuration Register 1. + */ + return ((u8) ((XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR1_OFFSET) & XADCPS_CFR1_SEQ_VALID_MASK) >> + XADCPS_CFR1_SEQ_SHIFT)); + +} + +/****************************************************************************/ +/** +* +* The function sets the frequency of the ADCCLK by configuring the DCLK to +* ADCCLK ratio in the Configuration Register #2 +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Divisor is clock divisor used to derive ADCCLK from DCLK. +* Valid values of the divisor are +* - 0 to 255. Values 0, 1, 2 are all mapped to 2. +* Refer to the device specification for more details +* +* @return None. +* +* @note - The ADCCLK is an internal clock used by the ADC and is +* synchronized to the DCLK clock. The ADCCLK is equal to DCLK +* divided by the user selection in the Configuration Register 2. +* - There is no Assert on the minimum value of the Divisor. +* +*****************************************************************************/ +void XAdcPs_SetAdcClkDivisor(XAdcPs *InstancePtr, u8 Divisor) +{ + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Write the divisor value into the Configuration Register #2. + */ + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR2_OFFSET, + Divisor << XADCPS_CFR2_CD_SHIFT); + +} + +/****************************************************************************/ +/** +* +* The function gets the ADCCLK divisor from the Configuration Register 2. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return The divisor read from the Configuration Register 2. +* +* @note The ADCCLK is an internal clock used by the ADC and is +* synchronized to the DCLK clock. The ADCCLK is equal to DCLK +* divided by the user selection in the Configuration Register 2. +* +*****************************************************************************/ +u8 XAdcPs_GetAdcClkDivisor(XAdcPs *InstancePtr) +{ + u16 Divisor; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the divisor value from the Configuration Register 2. + */ + Divisor = (u16) XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR2_OFFSET); + + return (u8) (Divisor >> XADCPS_CFR2_CD_SHIFT); +} + +/****************************************************************************/ +/** +* +* This function enables the specified channels in the ADC Channel Selection +* Sequencer Registers. The sequencer must be disabled before writing to these +* regsiters. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param ChEnableMask is the bit mask of all the channels to be enabled. +* Use XADCPS_SEQ_CH__* defined in xadcps_hw.h to specify the Channel +* numbers. Bit masks of 1 will be enabled and bit mask of 0 will +* be disabled. +* The ChEnableMask is a 32 bit mask that is written to the two +* 16 bit ADC Channel Selection Sequencer Registers. +* +* @return +* - XST_SUCCESS if the given values were written successfully to +* the ADC Channel Selection Sequencer Registers. +* - XST_FAILURE if the channel sequencer is enabled. +* +* @note None +* +*****************************************************************************/ +int XAdcPs_SetSeqChEnables(XAdcPs *InstancePtr, u32 ChEnableMask) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * The sequencer must be disabled for writing any of these registers + * Return XST_FAILURE if the channel sequencer is enabled. + */ + if ((XAdcPs_GetSequencerMode(InstancePtr) != XADCPS_SEQ_MODE_SAFE)) { + return XST_FAILURE; + } + + /* + * Enable the specified channels in the ADC Channel Selection Sequencer + * Registers. + */ + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_SEQ00_OFFSET, + (ChEnableMask & XADCPS_SEQ00_CH_VALID_MASK)); + + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_SEQ01_OFFSET, + (ChEnableMask >> XADCPS_SEQ_CH_AUX_SHIFT) & + XADCPS_SEQ01_CH_VALID_MASK); + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* This function gets the channel enable bits status from the ADC Channel +* Selection Sequencer Registers. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return Gets the channel enable bits. Use XADCPS_SEQ_CH__* defined in +* xadcps_hw.h to interpret the Channel numbers. Bit masks of 1 +* are the channels that are enabled and bit mask of 0 are +* the channels that are disabled. +* +* @return None +* +* @note None +* +*****************************************************************************/ +u32 XAdcPs_GetSeqChEnables(XAdcPs *InstancePtr) +{ + u32 RegValEnable; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the channel enable bits for all the channels from the ADC + * Channel Selection Register. + */ + RegValEnable = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_SEQ00_OFFSET) & + XADCPS_SEQ00_CH_VALID_MASK; + RegValEnable |= (XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_SEQ01_OFFSET) & + XADCPS_SEQ01_CH_VALID_MASK) << + XADCPS_SEQ_CH_AUX_SHIFT; + + + return RegValEnable; +} + +/****************************************************************************/ +/** +* +* This function enables the averaging for the specified channels in the ADC +* Channel Averaging Enable Sequencer Registers. The sequencer must be disabled +* before writing to these regsiters. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param AvgEnableChMask is the bit mask of all the channels for which +* averaging is to be enabled. Use XADCPS_SEQ_CH__* defined in +* xadcps_hw.h to specify the Channel numbers. Averaging will be +* enabled for bit masks of 1 and disabled for bit mask of 0. +* The AvgEnableChMask is a 32 bit mask that is written to the two +* 16 bit ADC Channel Averaging Enable Sequencer Registers. +* +* @return +* - XST_SUCCESS if the given values were written successfully to +* the ADC Channel Averaging Enables Sequencer Registers. +* - XST_FAILURE if the channel sequencer is enabled. +* +* @note None +* +*****************************************************************************/ +int XAdcPs_SetSeqAvgEnables(XAdcPs *InstancePtr, u32 AvgEnableChMask) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * The sequencer must be disabled for writing any of these registers + * Return XST_FAILURE if the channel sequencer is enabled. + */ + if ((XAdcPs_GetSequencerMode(InstancePtr) != XADCPS_SEQ_MODE_SAFE)) { + return XST_FAILURE; + } + + /* + * Enable/disable the averaging for the specified channels in the + * ADC Channel Averaging Enables Sequencer Registers. + */ + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_SEQ02_OFFSET, + (AvgEnableChMask & XADCPS_SEQ02_CH_VALID_MASK)); + + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_SEQ03_OFFSET, + (AvgEnableChMask >> XADCPS_SEQ_CH_AUX_SHIFT) & + XADCPS_SEQ03_CH_VALID_MASK); + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* This function returns the channels for which the averaging has been enabled +* in the ADC Channel Averaging Enables Sequencer Registers. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @returns The status of averaging (enabled/disabled) for all the channels. +* Use XADCPS_SEQ_CH__* defined in xadcps_hw.h to interpret the +* Channel numbers. Bit masks of 1 are the channels for which +* averaging is enabled and bit mask of 0 are the channels for +* averaging is disabled +* +* @note None +* +*****************************************************************************/ +u32 XAdcPs_GetSeqAvgEnables(XAdcPs *InstancePtr) +{ + u32 RegValAvg; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the averaging enable status for all the channels from the + * ADC Channel Averaging Enables Sequencer Registers. + */ + RegValAvg = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_SEQ02_OFFSET) & XADCPS_SEQ02_CH_VALID_MASK; + RegValAvg |= (XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_SEQ03_OFFSET) & XADCPS_SEQ03_CH_VALID_MASK) << + XADCPS_SEQ_CH_AUX_SHIFT; + + return RegValAvg; +} + +/****************************************************************************/ +/** +* +* This function sets the Analog input mode for the specified channels in the ADC +* Channel Analog-Input Mode Sequencer Registers. The sequencer must be disabled +* before writing to these regsiters. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param InputModeChMask is the bit mask of all the channels for which +* the input mode is differential mode. Use XADCPS_SEQ_CH__* defined +* in xadcps_hw.h to specify the channel numbers. Differential +* input mode will be set for bit masks of 1 and unipolar input +* mode for bit masks of 0. +* The InputModeChMask is a 32 bit mask that is written to the two +* 16 bit ADC Channel Analog-Input Mode Sequencer Registers. +* +* @return +* - XST_SUCCESS if the given values were written successfully to +* the ADC Channel Analog-Input Mode Sequencer Registers. +* - XST_FAILURE if the channel sequencer is enabled. +* +* @note None +* +*****************************************************************************/ +int XAdcPs_SetSeqInputMode(XAdcPs *InstancePtr, u32 InputModeChMask) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * The sequencer must be disabled for writing any of these registers + * Return XST_FAILURE if the channel sequencer is enabled. + */ + if ((XAdcPs_GetSequencerMode(InstancePtr) != XADCPS_SEQ_MODE_SAFE)) { + return XST_FAILURE; + } + + /* + * Set the input mode for the specified channels in the ADC Channel + * Analog-Input Mode Sequencer Registers. + */ + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_SEQ04_OFFSET, + (InputModeChMask & XADCPS_SEQ04_CH_VALID_MASK)); + + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_SEQ05_OFFSET, + (InputModeChMask >> XADCPS_SEQ_CH_AUX_SHIFT) & + XADCPS_SEQ05_CH_VALID_MASK); + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* This function gets the Analog input mode for all the channels from +* the ADC Channel Analog-Input Mode Sequencer Registers. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @returns The input mode for all the channels. +* Use XADCPS_SEQ_CH_* defined in xadcps_hw.h to interpret the +* Channel numbers. Bit masks of 1 are the channels for which +* input mode is differential and bit mask of 0 are the channels +* for which input mode is unipolar. +* +* @note None. +* +*****************************************************************************/ +u32 XAdcPs_GetSeqInputMode(XAdcPs *InstancePtr) +{ + u32 InputMode; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Get the input mode for all the channels from the ADC Channel + * Analog-Input Mode Sequencer Registers. + */ + InputMode = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_SEQ04_OFFSET) & + XADCPS_SEQ04_CH_VALID_MASK; + InputMode |= (XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_SEQ05_OFFSET) & + XADCPS_SEQ05_CH_VALID_MASK) << + XADCPS_SEQ_CH_AUX_SHIFT; + + return InputMode; +} + +/****************************************************************************/ +/** +* +* This function sets the number of Acquisition cycles in the ADC Channel +* Acquisition Time Sequencer Registers. The sequencer must be disabled +* before writing to these regsiters. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param AcqCyclesChMask is the bit mask of all the channels for which +* the number of acquisition cycles is to be extended. +* Use XADCPS_SEQ_CH__* defined in xadcps_hw.h to specify the Channel +* numbers. Acquisition cycles will be extended to 10 ADCCLK cycles +* for bit masks of 1 and will be the default 4 ADCCLK cycles for +* bit masks of 0. +* The AcqCyclesChMask is a 32 bit mask that is written to the two +* 16 bit ADC Channel Acquisition Time Sequencer Registers. +* +* @return +* - XST_SUCCESS if the given values were written successfully to +* the Channel Sequencer Registers. +* - XST_FAILURE if the channel sequencer is enabled. +* +* @note None. +* +*****************************************************************************/ +int XAdcPs_SetSeqAcqTime(XAdcPs *InstancePtr, u32 AcqCyclesChMask) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * The sequencer must be disabled for writing any of these registers + * Return XST_FAILURE if the channel sequencer is enabled. + */ + if ((XAdcPs_GetSequencerMode(InstancePtr) != + XADCPS_SEQ_MODE_SAFE)) { + return XST_FAILURE; + } + + /* + * Set the Acquisition time for the specified channels in the + * ADC Channel Acquisition Time Sequencer Registers. + */ + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_SEQ06_OFFSET, + (AcqCyclesChMask & XADCPS_SEQ06_CH_VALID_MASK)); + + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_SEQ07_OFFSET, + (AcqCyclesChMask >> XADCPS_SEQ_CH_AUX_SHIFT) & + XADCPS_SEQ07_CH_VALID_MASK); + + return XST_SUCCESS; +} + +/****************************************************************************/ +/** +* +* This function gets the status of acquisition from the ADC Channel Acquisition +* Time Sequencer Registers. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @returns The acquisition time for all the channels. +* Use XADCPS_SEQ_CH__* defined in xadcps_hw.h to interpret the +* Channel numbers. Bit masks of 1 are the channels for which +* acquisition cycles are extended and bit mask of 0 are the +* channels for which acquisition cycles are not extended. +* +* @note None +* +*****************************************************************************/ +u32 XAdcPs_GetSeqAcqTime(XAdcPs *InstancePtr) +{ + u32 RegValAcq; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Get the Acquisition cycles for the specified channels from the ADC + * Channel Acquisition Time Sequencer Registers. + */ + RegValAcq = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_SEQ06_OFFSET) & + XADCPS_SEQ06_CH_VALID_MASK; + RegValAcq |= (XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_SEQ07_OFFSET) & + XADCPS_SEQ07_CH_VALID_MASK) << + XADCPS_SEQ_CH_AUX_SHIFT; + + return RegValAcq; +} + +/****************************************************************************/ +/** +* +* This functions sets the contents of the given Alarm Threshold Register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param AlarmThrReg is the index of an Alarm Threshold Register to +* be set. Use XADCPS_ATR_* constants defined in xadcps.h to +* specify the index. +* @param Value is the 16-bit threshold value to write into the register. +* +* @return None. +* +* @note Use XAdcPs_SetOverTemp() to set the Over Temperature upper +* threshold value. +* +*****************************************************************************/ +void XAdcPs_SetAlarmThreshold(XAdcPs *InstancePtr, u8 AlarmThrReg, u16 Value) +{ + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(AlarmThrReg <= XADCPS_ATR_VCCPDRO_LOWER); + + /* + * Write the value into the specified Alarm Threshold Register. + */ + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_ATR_TEMP_UPPER_OFFSET + + AlarmThrReg,Value); + +} + +/****************************************************************************/ +/** +* +* This function returns the contents of the specified Alarm Threshold Register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param AlarmThrReg is the index of an Alarm Threshold Register +* to be read. Use XADCPS_ATR_* constants defined in xadcps_hw.h +* to specify the index. +* +* @return A 16-bit value representing the contents of the selected Alarm +* Threshold Register. +* +* @note None. +* +*****************************************************************************/ +u16 XAdcPs_GetAlarmThreshold(XAdcPs *InstancePtr, u8 AlarmThrReg) +{ + u32 RegData; + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertNonvoid(AlarmThrReg <= XADCPS_ATR_VCCPDRO_LOWER); + + /* + * Read the specified Alarm Threshold Register and return + * the value + */ + RegData = XAdcPs_ReadInternalReg(InstancePtr, + (XADCPS_ATR_TEMP_UPPER_OFFSET + AlarmThrReg)); + + return (u16) RegData; +} + + +/****************************************************************************/ +/** +* +* This function enables programming of the powerdown temperature for the +* OverTemp signal in the OT Powerdown register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_EnableUserOverTemp(XAdcPs *InstancePtr) +{ + u16 OtUpper; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the OT upper Alarm Threshold Register. + */ + OtUpper = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_ATR_OT_UPPER_OFFSET); + OtUpper &= ~(XADCPS_ATR_OT_UPPER_ENB_MASK); + + /* + * Preserve the powerdown value and write OT enable value the into the + * OT Upper Alarm Threshold Register. + */ + OtUpper |= XADCPS_ATR_OT_UPPER_ENB_VAL; + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_ATR_OT_UPPER_OFFSET, OtUpper); +} + +/****************************************************************************/ +/** +* +* This function disables programming of the powerdown temperature for the +* OverTemp signal in the OT Powerdown register. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return None. +* +* @note None. +* +* +*****************************************************************************/ +void XAdcPs_DisableUserOverTemp(XAdcPs *InstancePtr) +{ + u16 OtUpper; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the OT Upper Alarm Threshold Register. + */ + OtUpper = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_ATR_OT_UPPER_OFFSET); + OtUpper &= ~(XADCPS_ATR_OT_UPPER_ENB_MASK); + + XAdcPs_WriteInternalReg(InstancePtr, + XADCPS_ATR_OT_UPPER_OFFSET, OtUpper); +} + + +/****************************************************************************/ +/** +* +* The function enables the Event mode or Continuous mode in the sequencer mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param IsEventMode is a boolean parameter that specifies continuous +* sampling (specify FALSE) or event driven sampling mode (specify +* TRUE) for the given channel. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_SetSequencerEvent(XAdcPs *InstancePtr, int IsEventMode) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((IsEventMode == TRUE) || (IsEventMode == FALSE)); + + /* + * Read the Configuration Register 0. + */ + RegValue = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR0_OFFSET) & + (~XADCPS_CFR0_EC_MASK); + + /* + * Set the ADC mode. + */ + if (IsEventMode == TRUE) { + RegValue |= XADCPS_CFR0_EC_MASK; + } else { + RegValue &= ~XADCPS_CFR0_EC_MASK; + } + + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR0_OFFSET, + RegValue); +} + + +/****************************************************************************/ +/** +* +* This function returns the sampling mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return The sampling mode +* - 0 specifies continuous sampling +* - 1 specifies event driven sampling mode +* +* @note None. +* +*****************************************************************************/ +int XAdcPs_GetSamplingMode(XAdcPs *InstancePtr) +{ + u32 Mode; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the sampling mode from the Configuration Register 0. + */ + Mode = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR0_OFFSET) & + XADCPS_CFR0_EC_MASK; + if (Mode) { + + return 1; + } + + return (0); +} + + +/****************************************************************************/ +/** +* +* This function sets the External Mux mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param MuxMode specifies whether External Mux is used +* - FALSE specifies NO external MUX +* - TRUE specifies External Mux is used +* @param Channel specifies the channel to be used for the +* external Mux. Please read the Device Spec for which +* channels are valid for which mode. +* +* @return None. +* +* @note There is no Assert in this function for checking the channel +* number if the external Mux is used. The user should provide a +* valid channel number. +* +*****************************************************************************/ +void XAdcPs_SetMuxMode(XAdcPs *InstancePtr, int MuxMode, u8 Channel) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid((MuxMode == TRUE) || (MuxMode == FALSE)); + + /* + * Read the Configuration Register 0. + */ + RegValue = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR0_OFFSET) & + (~XADCPS_CFR0_MUX_MASK); + /* + * Select the Mux mode and the channel to be used. + */ + if (MuxMode == TRUE) { + RegValue |= XADCPS_CFR0_MUX_MASK; + RegValue |= (Channel & XADCPS_CFR0_CHANNEL_MASK); + + } + + /* + * Write the mux mode into the Configuration Register 0. + */ + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR0_OFFSET, + RegValue); +} + + +/****************************************************************************/ +/** +* +* This function sets the Power Down mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Mode specifies the Power Down Mode +* - XADCPS_PD_MODE_NONE specifies NO Power Down (Both ADC A and +* ADC B are enabled) +* - XADCPS_PD_MODE_ADCB specfies the Power Down of ADC B +* - XADCPS_PD_MODE_XADC specifies the Power Down of +* both ADC A and ADC B. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_SetPowerdownMode(XAdcPs *InstancePtr, u32 Mode) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + Xil_AssertVoid(Mode < XADCPS_PD_MODE_XADC); + + + /* + * Read the Configuration Register 2. + */ + RegValue = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR2_OFFSET) & + (~XADCPS_CFR2_PD_MASK); + /* + * Select the Power Down mode. + */ + RegValue |= (Mode << XADCPS_CFR2_PD_SHIFT); + + XAdcPs_WriteInternalReg(InstancePtr, XADCPS_CFR2_OFFSET, + RegValue); +} + +/****************************************************************************/ +/** +* +* This function gets the Power Down mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return Mode specifies the Power Down Mode +* - XADCPS_PD_MODE_NONE specifies NO Power Down (Both ADC A and +* ADC B are enabled) +* - XADCPS_PD_MODE_ADCB specfies the Power Down of ADC B +* - XADCPS_PD_MODE_XADC specifies the Power Down of +* both ADC A and ADC B. +* +* @note None. +* +*****************************************************************************/ +u32 XAdcPs_GetPowerdownMode(XAdcPs *InstancePtr) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Read the Power Down Mode. + */ + RegValue = XAdcPs_ReadInternalReg(InstancePtr, + XADCPS_CFR2_OFFSET) & + (~XADCPS_CFR2_PD_MASK); + /* + * Return the Power Down mode. + */ + return (RegValue >> XADCPS_CFR2_PD_SHIFT); + +} + +/****************************************************************************/ +/** +* +* This function is used for writing to XADC Registers using the command FIFO. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param RegOffset is the offset of the XADC register to be written. +* @param Data is the data to be written. +* +* @return None. +* +* @note None. +* +* +*****************************************************************************/ +void XAdcPs_WriteInternalReg(XAdcPs *InstancePtr, u32 RegOffset, u32 Data) +{ + u32 RegData; + + /* + * Write the Data into the FIFO Register. + */ + RegData = XAdcPs_FormatWriteData(RegOffset, Data, TRUE); + + XAdcPs_WriteFifo(InstancePtr, RegData); + + /* Read the Read FIFO after any write since for each write + * one location of Read FIFO gets updated + */ + XAdcPs_ReadFifo(InstancePtr); + +} + + +/****************************************************************************/ +/** +* +* This function is used for reading from the XADC Registers using the Data FIFO. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param RegOffset is the offset of the XADC register to be read. +* +* @return Data read from the FIFO +* +* @note None. +* +* +*****************************************************************************/ +u32 XAdcPs_ReadInternalReg(XAdcPs *InstancePtr, u32 RegOffset) +{ + + u32 RegData; + + RegData = XAdcPs_FormatWriteData(RegOffset, 0x0, FALSE); + + /* Read cmd to FIFO*/ + XAdcPs_WriteFifo(InstancePtr, RegData); + + /* Do a Dummy read */ + RegData = XAdcPs_ReadFifo(InstancePtr); + + /* Do a Dummy write to get the actual read */ + XAdcPs_WriteFifo(InstancePtr, RegData); + + /* Do the Actual read */ + RegData = XAdcPs_ReadFifo(InstancePtr); + + return RegData; + +} + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps.h new file mode 100755 index 000000000..7c53621ef --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps.h @@ -0,0 +1,566 @@ +/****************************************************************************** +* +* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps.h +* +* The XAdcPs driver supports the Xilinx XADC/ADC device. +* +* The XADC/ADC device has the following features: +* - 10-bit, 200-KSPS (kilo samples per second) +* Analog-to-Digital Converter (ADC) +* - Monitoring of on-chip supply voltages and temperature +* - 1 dedicated differential analog-input pair and +* 16 auxiliary differential analog-input pairs +* - Automatic alarms based on user defined limits for the on-chip +* supply voltages and temperature +* - Automatic Channel Sequencer, programmable averaging, programmable +* acquisition time for the external inputs, unipolar or differential +* input selection for the external inputs +* - Inbuilt Calibration +* - Optional interrupt request generation +* +* +* The user should refer to the hardware device specification for detailed +* information about the device. +* +* This header file contains the prototypes of driver functions that can +* be used to access the XADC/ADC device. +* +* +* <b> XADC Channel Sequencer Modes </b> +* +* The XADC Channel Sequencer supports the following operating modes: +* +* - <b> Default </b>: This is the default mode after power up. +* In this mode of operation the XADC operates in +* a sequence mode, monitoring the on chip sensors: +* Temperature, VCCINT, and VCCAUX. +* - <b> One pass through sequence </b>: In this mode the XADC +* converts the channels enabled in the Sequencer Channel Enable +* registers for a single pass and then stops. +* - <b> Continuous cycling of sequence </b>: In this mode the XADC +* converts the channels enabled in the Sequencer Channel Enable +* registers continuously. +* - <b> Single channel mode</b>: In this mode the XADC Channel +* Sequencer is disabled and the XADC operates in a +* Single Channel Mode. +* The XADC can operate either in a Continuous or Event +* driven sampling mode in the single channel mode. +* - <b> Simultaneous Sampling Mode</b>: In this mode the XADC Channel +* Sequencer will automatically sequence through eight fixed pairs +* of auxiliary analog input channels for simulataneous conversion. +* - <b> Independent ADC mode</b>: In this mode the first ADC (A) is used to +* is used to implement a fixed monitoring mode similar to the +* default mode but the alarm fucntions ar eenabled. +* The second ADC (B) is available to be used with external analog +* input channels only. +* +* Read the XADC spec for more information about the sequencer modes. +* +* <b> Initialization and Configuration </b> +* +* The device driver enables higher layer software (e.g., an application) to +* communicate to the XADC/ADC device. +* +* XAdcPs_CfgInitialize() API is used to initialize the XADC/ADC +* device. The user needs to first call the XAdcPs_LookupConfig() API which +* returns the Configuration structure pointer which is passed as a parameter to +* the XAdcPs_CfgInitialize() API. +* +* +* <b>Interrupts</b> +* +* The XADC/ADC device supports interrupt driven mode and the default +* operation mode is polling mode. +* +* The interrupt mode is available only if hardware is configured to support +* interrupts. +* +* This driver does not provide a Interrupt Service Routine (ISR) for the device. +* It is the responsibility of the application to provide one if needed. Refer to +* the interrupt example provided with this driver for details on using the +* device in interrupt mode. +* +* +* <b> Virtual Memory </b> +* +* This driver supports Virtual Memory. The RTOS is responsible for calculating +* the correct device base address in Virtual Memory space. +* +* +* <b> Threads </b> +* +* This driver is not thread safe. Any needs for threads or thread mutual +* exclusion must be satisfied by the layer above this driver. +* +* +* <b> Asserts </b> +* +* Asserts are used within all Xilinx drivers to enforce constraints on argument +* values. Asserts can be turned off on a system-wide basis by defining, at +* compile time, the NDEBUG identifier. By default, asserts are turned on and it +* is recommended that users leave asserts on during development. +* +* +* <b> Building the driver </b> +* +* The XAdcPs driver is composed of several source files. This allows the user +* to build and link only those parts of the driver that are necessary. +* +* <b> Limitations of the driver </b> +* +* XADC/ADC device can be accessed through the JTAG port and the PLB +* interface. The driver implementation does not support the simultaneous access +* of the device by both these interfaces. The user has to care of this situation +* in the user application code. +* +* <br><br> +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a ssb 12/22/11 First release based on the XPS/AXI xadc driver +* 1.01a bss 02/18/13 Modified XAdcPs_SetSeqChEnables,XAdcPs_SetSeqAvgEnables +* XAdcPs_SetSeqInputMode and XAdcPs_SetSeqAcqTime APIs +* in xadcps.c to fix CR #693371 +* </pre> +* +*****************************************************************************/ +#ifndef XADCPS_H /* Prevent circular inclusions */ +#define XADCPS_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xstatus.h" +#include "xadcps_hw.h" + +/************************** Constant Definitions ****************************/ + + +/** + * @name Indexes for the different channels. + * @{ + */ +#define XADCPS_CH_TEMP 0x0 /**< On Chip Temperature */ +#define XADCPS_CH_VCCINT 0x1 /**< VCCINT */ +#define XADCPS_CH_VCCAUX 0x2 /**< VCCAUX */ +#define XADCPS_CH_VPVN 0x3 /**< VP/VN Dedicated analog inputs */ +#define XADCPS_CH_VREFP 0x4 /**< VREFP */ +#define XADCPS_CH_VREFN 0x5 /**< VREFN */ +#define XADCPS_CH_VBRAM 0x6 /**< On-chip VBRAM Data Reg, 7 series */ +#define XADCPS_CH_SUPPLY_CALIB 0x07 /**< Supply Calib Data Reg */ +#define XADCPS_CH_ADC_CALIB 0x08 /**< ADC Offset Channel Reg */ +#define XADCPS_CH_GAINERR_CALIB 0x09 /**< Gain Error Channel Reg */ +#define XADCPS_CH_VCCPINT 0x0D /**< On-chip PS VCCPINT Channel , Zynq */ +#define XADCPS_CH_VCCPAUX 0x0E /**< On-chip PS VCCPAUX Channel , Zynq */ +#define XADCPS_CH_VCCPDRO 0x0F /**< On-chip PS VCCPDRO Channel , Zynq */ +#define XADCPS_CH_AUX_MIN 16 /**< Channel number for 1st Aux Channel */ +#define XADCPS_CH_AUX_MAX 31 /**< Channel number for Last Aux channel */ + +/*@}*/ + + +/** + * @name Indexes for reading the Calibration Coefficient Data. + * @{ + */ +#define XADCPS_CALIB_SUPPLY_COEFF 0 /**< Supply Offset Calib Coefficient */ +#define XADCPS_CALIB_ADC_COEFF 1 /**< ADC Offset Calib Coefficient */ +#define XADCPS_CALIB_GAIN_ERROR_COEFF 2 /**< Gain Error Calib Coefficient*/ +/*@}*/ + + +/** + * @name Indexes for reading the Minimum/Maximum Measurement Data. + * @{ + */ +#define XADCPS_MAX_TEMP 0 /**< Maximum Temperature Data */ +#define XADCPS_MAX_VCCINT 1 /**< Maximum VCCINT Data */ +#define XADCPS_MAX_VCCAUX 2 /**< Maximum VCCAUX Data */ +#define XADCPS_MAX_VBRAM 3 /**< Maximum VBRAM Data */ +#define XADCPS_MIN_TEMP 4 /**< Minimum Temperature Data */ +#define XADCPS_MIN_VCCINT 5 /**< Minimum VCCINT Data */ +#define XADCPS_MIN_VCCAUX 6 /**< Minimum VCCAUX Data */ +#define XADCPS_MIN_VBRAM 7 /**< Minimum VBRAM Data */ +#define XADCPS_MAX_VCCPINT 8 /**< Maximum VCCPINT Register , Zynq */ +#define XADCPS_MAX_VCCPAUX 9 /**< Maximum VCCPAUX Register , Zynq */ +#define XADCPS_MAX_VCCPDRO 0xA /**< Maximum VCCPDRO Register , Zynq */ +#define XADCPS_MIN_VCCPINT 0xC /**< Minimum VCCPINT Register , Zynq */ +#define XADCPS_MIN_VCCPAUX 0xD /**< Minimum VCCPAUX Register , Zynq */ +#define XADCPS_MIN_VCCPDRO 0xE /**< Minimum VCCPDRO Register , Zynq */ + +/*@}*/ + + +/** + * @name Alarm Threshold(Limit) Register (ATR) indexes. + * @{ + */ +#define XADCPS_ATR_TEMP_UPPER 0 /**< High user Temperature */ +#define XADCPS_ATR_VCCINT_UPPER 1 /**< VCCINT high voltage limit register */ +#define XADCPS_ATR_VCCAUX_UPPER 2 /**< VCCAUX high voltage limit register */ +#define XADCPS_ATR_OT_UPPER 3 /**< VCCAUX high voltage limit register */ +#define XADCPS_ATR_TEMP_LOWER 4 /**< Upper Over Temperature limit Reg */ +#define XADCPS_ATR_VCCINT_LOWER 5 /**< VCCINT high voltage limit register */ +#define XADCPS_ATR_VCCAUX_LOWER 6 /**< VCCAUX low voltage limit register */ +#define XADCPS_ATR_OT_LOWER 7 /**< Lower Over Temperature limit */ +#define XADCPS_ATR_VBRAM_UPPER_ 8 /**< VRBAM Upper Alarm Reg, 7 Series */ +#define XADCPS_ATR_VCCPINT_UPPER 9 /**< VCCPINT Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VCCPAUX_UPPER 0xA /**< VCCPAUX Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VCCPDRO_UPPER 0xB /**< VCCPDRO Upper Alarm Reg, Zynq */ +#define XADCPS_ATR_VBRAM_LOWER 0xC /**< VRBAM Lower Alarm Reg, 7 Series */ +#define XADCPS_ATR_VCCPINT_LOWER 0xD /**< VCCPINT Lower Alarm Reg , Zynq */ +#define XADCPS_ATR_VCCPAUX_LOWER 0xE /**< VCCPAUX Lower Alarm Reg , Zynq */ +#define XADCPS_ATR_VCCPDRO_LOWER 0xF /**< VCCPDRO Lower Alarm Reg , Zynq */ + +/*@}*/ + + +/** + * @name Averaging to be done for the channels. + * @{ + */ +#define XADCPS_AVG_0_SAMPLES 0 /**< No Averaging */ +#define XADCPS_AVG_16_SAMPLES 1 /**< Average 16 samples */ +#define XADCPS_AVG_64_SAMPLES 2 /**< Average 64 samples */ +#define XADCPS_AVG_256_SAMPLES 3 /**< Average 256 samples */ + +/*@}*/ + + +/** + * @name Channel Sequencer Modes of operation + * @{ + */ +#define XADCPS_SEQ_MODE_SAFE 0 /**< Default Safe Mode */ +#define XADCPS_SEQ_MODE_ONEPASS 1 /**< Onepass through Sequencer */ +#define XADCPS_SEQ_MODE_CONTINPASS 2 /**< Continuous Cycling Sequencer */ +#define XADCPS_SEQ_MODE_SINGCHAN 3 /**< Single channel -No Sequencing */ +#define XADCPS_SEQ_MODE_SIMUL_SAMPLING 4 /**< Simultaneous sampling */ +#define XADCPS_SEQ_MODE_INDEPENDENT 8 /**< Independent mode */ + +/*@}*/ + + + +/** + * @name Power Down Modes + * @{ + */ +#define XADCPS_PD_MODE_NONE 0 /**< No Power Down */ +#define XADCPS_PD_MODE_ADCB 1 /**< Power Down ADC B */ +#define XADCPS_PD_MODE_XADC 2 /**< Power Down ADC A and ADC B */ +/*@}*/ + +/**************************** Type Definitions ******************************/ + +/** + * This typedef contains configuration information for the XADC/ADC + * device. + */ +typedef struct { + u16 DeviceId; /**< Unique ID of device */ + u32 BaseAddress; /**< Device base address */ +} XAdcPs_Config; + + +/** + * The driver's instance data. The user is required to allocate a variable + * of this type for every XADC/ADC device in the system. A pointer to + * a variable of this type is then passed to the driver API functions. + */ +typedef struct { + XAdcPs_Config Config; /**< XAdcPs_Config of current device */ + u32 IsReady; /**< Device is initialized and ready */ + +} XAdcPs; + +/***************** Macros (Inline Functions) Definitions ********************/ + +/****************************************************************************/ +/** +* +* This macro checks if the XADC device is in Event Sampling mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return +* - TRUE if the device is in Event Sampling Mode. +* - FALSE if the device is in Continuous Sampling Mode. +* +* @note C-Style signature: +* int XAdcPs_IsEventSamplingMode(XAdcPs *InstancePtr); +* +*****************************************************************************/ +#define XAdcPs_IsEventSamplingModeSet(InstancePtr) \ + (((XAdcPs_ReadInternalReg(InstancePtr, \ + XADCPS_CFR0_OFFSET) & XADCPS_CFR0_EC_MASK) ? \ + TRUE : FALSE)) + + +/****************************************************************************/ +/** +* +* This macro checks if the XADC device is in External Mux mode. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return +* - TRUE if the device is in External Mux Mode. +* - FALSE if the device is NOT in External Mux Mode. +* +* @note C-Style signature: +* int XAdcPs_IsExternalMuxMode(XAdcPs *InstancePtr); +* +*****************************************************************************/ +#define XAdcPs_IsExternalMuxModeSet(InstancePtr) \ + (((XAdcPs_ReadInternalReg(InstancePtr, \ + XADCPS_CFR0_OFFSET) & XADCPS_CFR0_MUX_MASK) ? \ + TRUE : FALSE)) + +/****************************************************************************/ +/** +* +* This macro converts XADC Raw Data to Temperature(centigrades). +* +* @param AdcData is the Raw ADC Data from XADC. +* +* @return The Temperature in centigrades. +* +* @note C-Style signature: +* float XAdcPs_RawToTemperature(u32 AdcData); +* +*****************************************************************************/ +#define XAdcPs_RawToTemperature(AdcData) \ + ((((float)(AdcData)/65536.0f)/0.00198421639f ) - 273.15f) + +/****************************************************************************/ +/** +* +* This macro converts XADC/ADC Raw Data to Voltage(volts). +* +* @param AdcData is the XADC/ADC Raw Data. +* +* @return The Voltage in volts. +* +* @note C-Style signature: +* float XAdcPs_RawToVoltage(u32 AdcData); +* +*****************************************************************************/ +#define XAdcPs_RawToVoltage(AdcData) \ + ((((float)(AdcData))* (3.0f))/65536.0f) + +/****************************************************************************/ +/** +* +* This macro converts Temperature in centigrades to XADC/ADC Raw Data. +* +* @param Temperature is the Temperature in centigrades to be +* converted to XADC/ADC Raw Data. +* +* @return The XADC/ADC Raw Data. +* +* @note C-Style signature: +* int XAdcPs_TemperatureToRaw(float Temperature); +* +*****************************************************************************/ +#define XAdcPs_TemperatureToRaw(Temperature) \ + ((int)(((Temperature) + 273.15f)*65536.0f*0.00198421639f)) + +/****************************************************************************/ +/** +* +* This macro converts Voltage in Volts to XADC/ADC Raw Data. +* +* @param Voltage is the Voltage in volts to be converted to +* XADC/ADC Raw Data. +* +* @return The XADC/ADC Raw Data. +* +* @note C-Style signature: +* int XAdcPs_VoltageToRaw(float Voltage); +* +*****************************************************************************/ +#define XAdcPs_VoltageToRaw(Voltage) \ + ((int)((Voltage)*65536.0f/3.0f)) + + +/****************************************************************************/ +/** +* +* This macro is used for writing to the XADC Registers using the +* command FIFO. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return None. +* +* @note C-Style signature: +* void XAdcPs_WriteFifo(XAdcPs *InstancePtr, u32 Data); +* +*****************************************************************************/ +#define XAdcPs_WriteFifo(InstancePtr, Data) \ + XAdcPs_WriteReg((InstancePtr)->Config.BaseAddress, \ + XADCPS_CMDFIFO_OFFSET, Data); + + +/****************************************************************************/ +/** +* +* This macro is used for reading from the XADC Registers using the +* data FIFO. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return Data read from the FIFO +* +* @note C-Style signature: +* u32 XAdcPs_ReadFifo(XAdcPs *InstancePtr); +* +*****************************************************************************/ +#define XAdcPs_ReadFifo(InstancePtr) \ + XAdcPs_ReadReg((InstancePtr)->Config.BaseAddress, \ + XADCPS_RDFIFO_OFFSET); + + +/************************** Function Prototypes *****************************/ + + + +/** + * Functions in xadcps_sinit.c + */ +XAdcPs_Config *XAdcPs_LookupConfig(u16 DeviceId); + +/** + * Functions in xadcps.c + */ +int XAdcPs_CfgInitialize(XAdcPs *InstancePtr, + XAdcPs_Config *ConfigPtr, + u32 EffectiveAddr); + + +u32 XAdcPs_GetStatus(XAdcPs *InstancePtr); + +u32 XAdcPs_GetAlarmOutputStatus(XAdcPs *InstancePtr); + +void XAdcPs_StartAdcConversion(XAdcPs *InstancePtr); + +void XAdcPs_Reset(XAdcPs *InstancePtr); + +u16 XAdcPs_GetAdcData(XAdcPs *InstancePtr, u8 Channel); + +u16 XAdcPs_GetCalibCoefficient(XAdcPs *InstancePtr, u8 CoeffType); + +u16 XAdcPs_GetMinMaxMeasurement(XAdcPs *InstancePtr, u8 MeasurementType); + +void XAdcPs_SetAvg(XAdcPs *InstancePtr, u8 Average); +u8 XAdcPs_GetAvg(XAdcPs *InstancePtr); + +int XAdcPs_SetSingleChParams(XAdcPs *InstancePtr, + u8 Channel, + int IncreaseAcqCycles, + int IsEventMode, + int IsDifferentialMode); + + +void XAdcPs_SetAlarmEnables(XAdcPs *InstancePtr, u16 AlmEnableMask); +u16 XAdcPs_GetAlarmEnables(XAdcPs *InstancePtr); + +void XAdcPs_SetCalibEnables(XAdcPs *InstancePtr, u16 Calibration); +u16 XAdcPs_GetCalibEnables(XAdcPs *InstancePtr); + +void XAdcPs_SetSequencerMode(XAdcPs *InstancePtr, u8 SequencerMode); +u8 XAdcPs_GetSequencerMode(XAdcPs *InstancePtr); + +void XAdcPs_SetAdcClkDivisor(XAdcPs *InstancePtr, u8 Divisor); +u8 XAdcPs_GetAdcClkDivisor(XAdcPs *InstancePtr); + +int XAdcPs_SetSeqChEnables(XAdcPs *InstancePtr, u32 ChEnableMask); +u32 XAdcPs_GetSeqChEnables(XAdcPs *InstancePtr); + +int XAdcPs_SetSeqAvgEnables(XAdcPs *InstancePtr, u32 AvgEnableChMask); +u32 XAdcPs_GetSeqAvgEnables(XAdcPs *InstancePtr); + +int XAdcPs_SetSeqInputMode(XAdcPs *InstancePtr, u32 InputModeChMask); +u32 XAdcPs_GetSeqInputMode(XAdcPs *InstancePtr); + +int XAdcPs_SetSeqAcqTime(XAdcPs *InstancePtr, u32 AcqCyclesChMask); +u32 XAdcPs_GetSeqAcqTime(XAdcPs *InstancePtr); + +void XAdcPs_SetAlarmThreshold(XAdcPs *InstancePtr, u8 AlarmThrReg, u16 Value); +u16 XAdcPs_GetAlarmThreshold(XAdcPs *InstancePtr, u8 AlarmThrReg); + +void XAdcPs_EnableUserOverTemp(XAdcPs *InstancePtr); +void XAdcPs_DisableUserOverTemp(XAdcPs *InstancePtr); + +/** + * Functions in xadcps_selftest.c + */ +int XAdcPs_SelfTest(XAdcPs *InstancePtr); + +/** + * Functions in xadcps_intr.c + */ +void XAdcPs_IntrEnable(XAdcPs *InstancePtr, u32 Mask); +void XAdcPs_IntrDisable(XAdcPs *InstancePtr, u32 Mask); +u32 XAdcPs_IntrGetEnabled(XAdcPs *InstancePtr); + +u32 XAdcPs_IntrGetStatus(XAdcPs *InstancePtr); +void XAdcPs_IntrClear(XAdcPs *InstancePtr, u32 Mask); + + +#ifdef __cplusplus +} +#endif + +#endif /* End of protection macro. */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_g.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_g.c new file mode 100644 index 000000000..ee803820e --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_g.c @@ -0,0 +1,30 @@ + +/******************************************************************* +* +* CAUTION: This file is automatically generated by libgen. +* Version: Xilinx EDK 14.7 EDK_P.20131013 +* DO NOT EDIT. +* +* Copyright (c) 1995-2012 Xilinx, Inc. All rights reserved. + +* +* Description: Driver configuration +* +*******************************************************************/ + +#include "xparameters.h" +#include "xadcps.h" + +/* +* The configuration table for devices +*/ + +XAdcPs_Config XAdcPs_ConfigTable[] = +{ + { + XPAR_PS7_XADC_0_DEVICE_ID, + XPAR_PS7_XADC_0_BASEADDR + } +}; + + diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_hw.h b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_hw.h new file mode 100755 index 000000000..750542774 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_hw.h @@ -0,0 +1,506 @@ +/****************************************************************************** +* +* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/****************************************************************************/ +/** +* +* @file xadcps_hw.h +* +* This header file contains identifiers and basic driver functions (or +* macros) that can be used to access the XADC device through the Device +* Config Interface of the Zynq. +* +* +* Refer to the device specification for more information about this driver. +* +* @note None. +* +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a bss 12/22/11 First release based on the XPS/AXI xadc driver +* +* </pre> +* +*****************************************************************************/ +#ifndef XADCPS_HW_H /* Prevent circular inclusions */ +#define XADCPS_HW_H /* by using protection macros */ + +#ifdef __cplusplus +extern "C" { +#endif + +/***************************** Include Files ********************************/ + +#include "xil_types.h" +#include "xil_assert.h" +#include "xil_io.h" + +/************************** Constant Definitions ****************************/ + + +/**@name Register offsets of XADC in the Device Config + * + * The following constants provide access to each of the registers of the + * XADC device. + * @{ + */ + +#define XADCPS_CFG_OFFSET 0x100 /**< Configuration Register */ +#define XADCPS_INT_STS_OFFSET 0x104 /**< Interrupt Status Register */ +#define XADCPS_INT_MASK_OFFSET 0x108 /**< Interrupt Mask Register */ +#define XADCPS_MSTS_OFFSET 0x10C /**< Misc status register */ +#define XADCPS_CMDFIFO_OFFSET 0x110 /**< Command FIFO Register */ +#define XADCPS_RDFIFO_OFFSET 0x114 /**< Read FIFO Register */ +#define XADCPS_MCTL_OFFSET 0x118 /**< Misc control register */ + +/* @} */ + + + + + +/** @name XADC Config Register Bit definitions + * @{ + */ +#define XADCPS_CFG_ENABLE_MASK 0x80000000 /**< Enable access from PS mask */ +#define XADCPS_CFG_CFIFOTH_MASK 0x00F00000 /**< Command FIFO Threshold mask */ +#define XADCPS_CFG_DFIFOTH_MASK 0x000F0000 /**< Data FIFO Threshold mask */ +#define XADCPS_CFG_WEDGE_MASK 0x00002000 /**< Write Edge Mask */ +#define XADCPS_CFG_REDGE_MASK 0x00001000 /**< Read Edge Mask */ +#define XADCPS_CFG_TCKRATE_MASK 0x00000300 /**< Clock freq control */ +#define XADCPS_CFG_IGAP_MASK 0x0000001F /**< Idle Gap between + * successive commands */ +/* @} */ + + +/** @name XADC Interrupt Status/Mask Register Bit definitions + * + * The definitions are same for the Interrupt Status Register and + * Interrupt Mask Register. They are defined only once. + * @{ + */ +#define XADCPS_INTX_ALL_MASK 0x000003FF /**< Alarm Signals Mask */ +#define XADCPS_INTX_CFIFO_LTH_MASK 0x00000200 /**< CMD FIFO less than threshold */ +#define XADCPS_INTX_DFIFO_GTH_MASK 0x00000100 /**< Data FIFO greater than threshold */ +#define XADCPS_INTX_OT_MASK 0x00000080 /**< Over temperature Alarm Status */ +#define XADCPS_INTX_ALM_ALL_MASK 0x0000007F /**< Alarm Signals Mask */ +#define XADCPS_INTX_ALM6_MASK 0x00000040 /**< Alarm 6 Mask */ +#define XADCPS_INTX_ALM5_MASK 0x00000020 /**< Alarm 5 Mask */ +#define XADCPS_INTX_ALM4_MASK 0x00000010 /**< Alarm 4 Mask */ +#define XADCPS_INTX_ALM3_MASK 0x00000008 /**< Alarm 3 Mask */ +#define XADCPS_INTX_ALM2_MASK 0x00000004 /**< Alarm 2 Mask */ +#define XADCPS_INTX_ALM1_MASK 0x00000002 /**< Alarm 1 Mask */ +#define XADCPS_INTX_ALM0_MASK 0x00000001 /**< Alarm 0 Mask */ + +/* @} */ + + +/** @name XADC Miscellaneous Register Bit definitions + * @{ + */ +#define XADCPS_MSTS_CFIFO_LVL_MASK 0x000F0000 /**< Command FIFO Level mask */ +#define XADCPS_MSTS_DFIFO_LVL_MASK 0x0000F000 /**< Data FIFO Level Mask */ +#define XADCPS_MSTS_CFIFOF_MASK 0x00000800 /**< Command FIFO Full Mask */ +#define XADCPS_MSTS_CFIFOE_MASK 0x00000400 /**< Command FIFO Empty Mask */ +#define XADCPS_MSTS_DFIFOF_MASK 0x00000200 /**< Data FIFO Full Mask */ +#define XADCPS_MSTS_DFIFOE_MASK 0x00000100 /**< Data FIFO Empty Mask */ +#define XADCPS_MSTS_OT_MASK 0x00000080 /**< Over Temperature Mask */ +#define XADCPS_MSTS_ALM_MASK 0x0000007F /**< Alarms Mask */ +/* @} */ + + +/** @name XADC Miscellaneous Control Register Bit definitions + * @{ + */ +#define XADCPS_MCTL_RESET_MASK 0x00000010 /**< Reset XADC */ +#define XADCPS_MCTL_FLUSH_MASK 0x00000001 /**< Flush the FIFOs */ +/* @} */ + + +/**@name Internal Register offsets of the XADC + * + * The following constants provide access to each of the internal registers of + * the XADC device. + * @{ + */ + +/* + * XADC Internal Channel Registers + */ +#define XADCPS_TEMP_OFFSET 0x00 /**< On-chip Temperature Reg */ +#define XADCPS_VCCINT_OFFSET 0x01 /**< On-chip VCCINT Data Reg */ +#define XADCPS_VCCAUX_OFFSET 0x02 /**< On-chip VCCAUX Data Reg */ +#define XADCPS_VPVN_OFFSET 0x03 /**< ADC out of VP/VN */ +#define XADCPS_VREFP_OFFSET 0x04 /**< On-chip VREFP Data Reg */ +#define XADCPS_VREFN_OFFSET 0x05 /**< On-chip VREFN Data Reg */ +#define XADCPS_VBRAM_OFFSET 0x06 /**< On-chip VBRAM , 7 Series */ +#define XADCPS_ADC_A_SUPPLY_CALIB_OFFSET 0x08 /**< ADC A Supply Offset Reg */ +#define XADCPS_ADC_A_OFFSET_CALIB_OFFSET 0x09 /**< ADC A Offset Data Reg */ +#define XADCPS_ADC_A_GAINERR_CALIB_OFFSET 0x0A /**< ADC A Gain Error Reg */ +#define XADCPS_VCCPINT_OFFSET 0x0D /**< On-chip VCCPINT Reg, Zynq */ +#define XADCPS_VCCPAUX_OFFSET 0x0E /**< On-chip VCCPAUX Reg, Zynq */ +#define XADCPS_VCCPDRO_OFFSET 0x0F /**< On-chip VCCPDRO Reg, Zynq */ + +/* + * XADC External Channel Registers + */ +#define XADCPS_AUX00_OFFSET 0x10 /**< ADC out of VAUXP0/VAUXN0 */ +#define XADCPS_AUX01_OFFSET 0x11 /**< ADC out of VAUXP1/VAUXN1 */ +#define XADCPS_AUX02_OFFSET 0x12 /**< ADC out of VAUXP2/VAUXN2 */ +#define XADCPS_AUX03_OFFSET 0x13 /**< ADC out of VAUXP3/VAUXN3 */ +#define XADCPS_AUX04_OFFSET 0x14 /**< ADC out of VAUXP4/VAUXN4 */ +#define XADCPS_AUX05_OFFSET 0x15 /**< ADC out of VAUXP5/VAUXN5 */ +#define XADCPS_AUX06_OFFSET 0x16 /**< ADC out of VAUXP6/VAUXN6 */ +#define XADCPS_AUX07_OFFSET 0x17 /**< ADC out of VAUXP7/VAUXN7 */ +#define XADCPS_AUX08_OFFSET 0x18 /**< ADC out of VAUXP8/VAUXN8 */ +#define XADCPS_AUX09_OFFSET 0x19 /**< ADC out of VAUXP9/VAUXN9 */ +#define XADCPS_AUX10_OFFSET 0x1A /**< ADC out of VAUXP10/VAUXN10 */ +#define XADCPS_AUX11_OFFSET 0x1B /**< ADC out of VAUXP11/VAUXN11 */ +#define XADCPS_AUX12_OFFSET 0x1C /**< ADC out of VAUXP12/VAUXN12 */ +#define XADCPS_AUX13_OFFSET 0x1D /**< ADC out of VAUXP13/VAUXN13 */ +#define XADCPS_AUX14_OFFSET 0x1E /**< ADC out of VAUXP14/VAUXN14 */ +#define XADCPS_AUX15_OFFSET 0x1F /**< ADC out of VAUXP15/VAUXN15 */ + +/* + * XADC Registers for Maximum/Minimum data captured for the + * on chip Temperature/VCCINT/VCCAUX data. + */ +#define XADCPS_MAX_TEMP_OFFSET 0x20 /**< Max Temperature Reg */ +#define XADCPS_MAX_VCCINT_OFFSET 0x21 /**< Max VCCINT Register */ +#define XADCPS_MAX_VCCAUX_OFFSET 0x22 /**< Max VCCAUX Register */ +#define XADCPS_MAX_VCCBRAM_OFFSET 0x23 /**< Max BRAM Register, 7 series */ +#define XADCPS_MIN_TEMP_OFFSET 0x24 /**< Min Temperature Reg */ +#define XADCPS_MIN_VCCINT_OFFSET 0x25 /**< Min VCCINT Register */ +#define XADCPS_MIN_VCCAUX_OFFSET 0x26 /**< Min VCCAUX Register */ +#define XADCPS_MIN_VCCBRAM_OFFSET 0x27 /**< Min BRAM Register, 7 series */ +#define XADCPS_MAX_VCCPINT_OFFSET 0x28 /**< Max VCCPINT Register, Zynq */ +#define XADCPS_MAX_VCCPAUX_OFFSET 0x29 /**< Max VCCPAUX Register, Zynq */ +#define XADCPS_MAX_VCCPDRO_OFFSET 0x2A /**< Max VCCPDRO Register, Zynq */ +#define XADCPS_MIN_VCCPINT_OFFSET 0x2C /**< Min VCCPINT Register, Zynq */ +#define XADCPS_MIN_VCCPAUX_OFFSET 0x2D /**< Min VCCPAUX Register, Zynq */ +#define XADCPS_MIN_VCCPDRO_OFFSET 0x2E /**< Min VCCPDRO Register,Zynq */ + /* Undefined 0x2F to 0x3E */ +#define XADCPS_FLAG_OFFSET 0x3F /**< Flag Register */ + +/* + * XADC Configuration Registers + */ +#define XADCPS_CFR0_OFFSET 0x40 /**< Configuration Register 0 */ +#define XADCPS_CFR1_OFFSET 0x41 /**< Configuration Register 1 */ +#define XADCPS_CFR2_OFFSET 0x42 /**< Configuration Register 2 */ + +/* Test Registers 0x43 to 0x47 */ + +/* + * XADC Sequence Registers + */ +#define XADCPS_SEQ00_OFFSET 0x48 /**< Seq Reg 00 Adc Channel Selection */ +#define XADCPS_SEQ01_OFFSET 0x49 /**< Seq Reg 01 Adc Channel Selection */ +#define XADCPS_SEQ02_OFFSET 0x4A /**< Seq Reg 02 Adc Average Enable */ +#define XADCPS_SEQ03_OFFSET 0x4B /**< Seq Reg 03 Adc Average Enable */ +#define XADCPS_SEQ04_OFFSET 0x4C /**< Seq Reg 04 Adc Input Mode Select */ +#define XADCPS_SEQ05_OFFSET 0x4D /**< Seq Reg 05 Adc Input Mode Select */ +#define XADCPS_SEQ06_OFFSET 0x4E /**< Seq Reg 06 Adc Acquisition Select */ +#define XADCPS_SEQ07_OFFSET 0x4F /**< Seq Reg 07 Adc Acquisition Select */ + +/* + * XADC Alarm Threshold/Limit Registers (ATR) + */ +#define XADCPS_ATR_TEMP_UPPER_OFFSET 0x50 /**< Temp Upper Alarm Register */ +#define XADCPS_ATR_VCCINT_UPPER_OFFSET 0x51 /**< VCCINT Upper Alarm Reg */ +#define XADCPS_ATR_VCCAUX_UPPER_OFFSET 0x52 /**< VCCAUX Upper Alarm Reg */ +#define XADCPS_ATR_OT_UPPER_OFFSET 0x53 /**< Over Temp Upper Alarm Reg */ +#define XADCPS_ATR_TEMP_LOWER_OFFSET 0x54 /**< Temp Lower Alarm Register */ +#define XADCPS_ATR_VCCINT_LOWER_OFFSET 0x55 /**< VCCINT Lower Alarm Reg */ +#define XADCPS_ATR_VCCAUX_LOWER_OFFSET 0x56 /**< VCCAUX Lower Alarm Reg */ +#define XADCPS_ATR_OT_LOWER_OFFSET 0x57 /**< Over Temp Lower Alarm Reg */ +#define XADCPS_ATR_VBRAM_UPPER_OFFSET 0x58 /**< VBRAM Upper Alarm, 7 series */ +#define XADCPS_ATR_VCCPINT_UPPER_OFFSET 0x59 /**< VCCPINT Upper Alarm, Zynq */ +#define XADCPS_ATR_VCCPAUX_UPPER_OFFSET 0x5A /**< VCCPAUX Upper Alarm, Zynq */ +#define XADCPS_ATR_VCCPDRO_UPPER_OFFSET 0x5B /**< VCCPDRO Upper Alarm, Zynq */ +#define XADCPS_ATR_VBRAM_LOWER_OFFSET 0x5C /**< VRBAM Lower Alarm, 7 Series */ +#define XADCPS_ATR_VCCPINT_LOWER_OFFSET 0x5D /**< VCCPINT Lower Alarm, Zynq */ +#define XADCPS_ATR_VCCPAUX_LOWER_OFFSET 0x5E /**< VCCPAUX Lower Alarm, Zynq */ +#define XADCPS_ATR_VCCPDRO_LOWER_OFFSET 0x5F /**< VCCPDRO Lower Alarm, Zynq */ + +/* Undefined 0x60 to 0x7F */ + +/*@}*/ + + + +/** + * @name Configuration Register 0 (CFR0) mask(s) + * @{ + */ +#define XADCPS_CFR0_CAL_AVG_MASK 0x8000 /**< Averaging enable Mask */ +#define XADCPS_CFR0_AVG_VALID_MASK 0x3000 /**< Averaging bit Mask */ +#define XADCPS_CFR0_AVG1_MASK 0x0000 /**< No Averaging */ +#define XADCPS_CFR0_AVG16_MASK 0x1000 /**< Average 16 samples */ +#define XADCPS_CFR0_AVG64_MASK 0x2000 /**< Average 64 samples */ +#define XADCPS_CFR0_AVG256_MASK 0x3000 /**< Average 256 samples */ +#define XADCPS_CFR0_AVG_SHIFT 12 /**< Averaging bits shift */ +#define XADCPS_CFR0_MUX_MASK 0x0800 /**< External Mask Enable */ +#define XADCPS_CFR0_DU_MASK 0x0400 /**< Bipolar/Unipolar mode */ +#define XADCPS_CFR0_EC_MASK 0x0200 /**< Event driven/ + * Continuous mode selection + */ +#define XADCPS_CFR0_ACQ_MASK 0x0100 /**< Add acquisition by 6 ADCCLK */ +#define XADCPS_CFR0_CHANNEL_MASK 0x001F /**< Channel number bit Mask */ + +/*@}*/ + +/** + * @name Configuration Register 1 (CFR1) mask(s) + * @{ + */ +#define XADCPS_CFR1_SEQ_VALID_MASK 0xF000 /**< Sequence bit Mask */ +#define XADCPS_CFR1_SEQ_SAFEMODE_MASK 0x0000 /**< Default Safe Mode */ +#define XADCPS_CFR1_SEQ_ONEPASS_MASK 0x1000 /**< Onepass through Seq */ +#define XADCPS_CFR1_SEQ_CONTINPASS_MASK 0x2000 /**< Continuous Cycling Seq */ +#define XADCPS_CFR1_SEQ_SINGCHAN_MASK 0x3000 /**< Single channel - No Seq */ +#define XADCPS_CFR1_SEQ_SIMUL_SAMPLING_MASK 0x4000 /**< Simulataneous Sampling Mask */ +#define XADCPS_CFR1_SEQ_INDEPENDENT_MASK 0x8000 /**< Independent Mode */ +#define XADCPS_CFR1_SEQ_SHIFT 12 /**< Sequence bit shift */ +#define XADCPS_CFR1_ALM_VCCPDRO_MASK 0x0800 /**< Alm 6 - VCCPDRO, Zynq */ +#define XADCPS_CFR1_ALM_VCCPAUX_MASK 0x0400 /**< Alm 5 - VCCPAUX, Zynq */ +#define XADCPS_CFR1_ALM_VCCPINT_MASK 0x0200 /**< Alm 4 - VCCPINT, Zynq */ +#define XADCPS_CFR1_ALM_VBRAM_MASK 0x0100 /**< Alm 3 - VBRAM, 7 series */ +#define XADCPS_CFR1_CAL_VALID_MASK 0x00F0 /**< Valid Calibration Mask */ +#define XADCPS_CFR1_CAL_PS_GAIN_OFFSET_MASK 0x0080 /**< Calibration 3 -Power + Supply Gain/Offset + Enable */ +#define XADCPS_CFR1_CAL_PS_OFFSET_MASK 0x0040 /**< Calibration 2 -Power + Supply Offset Enable */ +#define XADCPS_CFR1_CAL_ADC_GAIN_OFFSET_MASK 0x0020 /**< Calibration 1 -ADC Gain + Offset Enable */ +#define XADCPS_CFR1_CAL_ADC_OFFSET_MASK 0x0010 /**< Calibration 0 -ADC Offset + Enable */ +#define XADCPS_CFR1_CAL_DISABLE_MASK 0x0000 /**< No Calibration */ +#define XADCPS_CFR1_ALM_ALL_MASK 0x0F0F /**< Mask for all alarms */ +#define XADCPS_CFR1_ALM_VCCAUX_MASK 0x0008 /**< Alarm 2 - VCCAUX Enable */ +#define XADCPS_CFR1_ALM_VCCINT_MASK 0x0004 /**< Alarm 1 - VCCINT Enable */ +#define XADCPS_CFR1_ALM_TEMP_MASK 0x0002 /**< Alarm 0 - Temperature */ +#define XADCPS_CFR1_OT_MASK 0x0001 /**< Over Temperature Enable */ + +/*@}*/ + +/** + * @name Configuration Register 2 (CFR2) mask(s) + * @{ + */ +#define XADCPS_CFR2_CD_VALID_MASK 0xFF00 /**<Clock Divisor bit Mask */ +#define XADCPS_CFR2_CD_SHIFT 8 /**<Num of shift on division */ +#define XADCPS_CFR2_CD_MIN 8 /**<Minimum value of divisor */ +#define XADCPS_CFR2_CD_MAX 255 /**<Maximum value of divisor */ + +#define XADCPS_CFR2_CD_MIN 8 /**<Minimum value of divisor */ +#define XADCPS_CFR2_PD_MASK 0x0030 /**<Power Down Mask */ +#define XADCPS_CFR2_PD_XADC_MASK 0x0030 /**<Power Down XADC Mask */ +#define XADCPS_CFR2_PD_ADC1_MASK 0x0020 /**<Power Down ADC1 Mask */ +#define XADCPS_CFR2_PD_SHIFT 4 /**<Power Down Shift */ +/*@}*/ + +/** + * @name Sequence Register (SEQ) Bit Definitions + * @{ + */ +#define XADCPS_SEQ_CH_CALIB 0x00000001 /**< ADC Calibration Channel */ +#define XADCPS_SEQ_CH_VCCPINT 0x00000020 /**< VCCPINT, Zynq Only */ +#define XADCPS_SEQ_CH_VCCPAUX 0x00000040 /**< VCCPAUX, Zynq Only */ +#define XADCPS_SEQ_CH_VCCPDRO 0x00000080 /**< VCCPDRO, Zynq Only */ +#define XADCPS_SEQ_CH_TEMP 0x00000100 /**< On Chip Temperature Channel */ +#define XADCPS_SEQ_CH_VCCINT 0x00000200 /**< VCCINT Channel */ +#define XADCPS_SEQ_CH_VCCAUX 0x00000400 /**< VCCAUX Channel */ +#define XADCPS_SEQ_CH_VPVN 0x00000800 /**< VP/VN analog inputs Channel */ +#define XADCPS_SEQ_CH_VREFP 0x00001000 /**< VREFP Channel */ +#define XADCPS_SEQ_CH_VREFN 0x00002000 /**< VREFN Channel */ +#define XADCPS_SEQ_CH_VBRAM 0x00004000 /**< VBRAM Channel, 7 series */ +#define XADCPS_SEQ_CH_AUX00 0x00010000 /**< 1st Aux Channel */ +#define XADCPS_SEQ_CH_AUX01 0x00020000 /**< 2nd Aux Channel */ +#define XADCPS_SEQ_CH_AUX02 0x00040000 /**< 3rd Aux Channel */ +#define XADCPS_SEQ_CH_AUX03 0x00080000 /**< 4th Aux Channel */ +#define XADCPS_SEQ_CH_AUX04 0x00100000 /**< 5th Aux Channel */ +#define XADCPS_SEQ_CH_AUX05 0x00200000 /**< 6th Aux Channel */ +#define XADCPS_SEQ_CH_AUX06 0x00400000 /**< 7th Aux Channel */ +#define XADCPS_SEQ_CH_AUX07 0x00800000 /**< 8th Aux Channel */ +#define XADCPS_SEQ_CH_AUX08 0x01000000 /**< 9th Aux Channel */ +#define XADCPS_SEQ_CH_AUX09 0x02000000 /**< 10th Aux Channel */ +#define XADCPS_SEQ_CH_AUX10 0x04000000 /**< 11th Aux Channel */ +#define XADCPS_SEQ_CH_AUX11 0x08000000 /**< 12th Aux Channel */ +#define XADCPS_SEQ_CH_AUX12 0x10000000 /**< 13th Aux Channel */ +#define XADCPS_SEQ_CH_AUX13 0x20000000 /**< 14th Aux Channel */ +#define XADCPS_SEQ_CH_AUX14 0x40000000 /**< 15th Aux Channel */ +#define XADCPS_SEQ_CH_AUX15 0x80000000 /**< 16th Aux Channel */ + +#define XADCPS_SEQ00_CH_VALID_MASK 0x7FE1 /**< Mask for the valid channels */ +#define XADCPS_SEQ01_CH_VALID_MASK 0xFFFF /**< Mask for the valid channels */ + +#define XADCPS_SEQ02_CH_VALID_MASK 0x7FE0 /**< Mask for the valid channels */ +#define XADCPS_SEQ03_CH_VALID_MASK 0xFFFF /**< Mask for the valid channels */ + +#define XADCPS_SEQ04_CH_VALID_MASK 0x0800 /**< Mask for the valid channels */ +#define XADCPS_SEQ05_CH_VALID_MASK 0xFFFF /**< Mask for the valid channels */ + +#define XADCPS_SEQ06_CH_VALID_MASK 0x0800 /**< Mask for the valid channels */ +#define XADCPS_SEQ07_CH_VALID_MASK 0xFFFF /**< Mask for the valid channels */ + + +#define XADCPS_SEQ_CH_AUX_SHIFT 16 /**< Shift for the Aux Channel */ + +/*@}*/ + +/** + * @name OT Upper Alarm Threshold Register Bit Definitions + * @{ + */ + +#define XADCPS_ATR_OT_UPPER_ENB_MASK 0x000F /**< Mask for OT enable */ +#define XADCPS_ATR_OT_UPPER_VAL_MASK 0xFFF0 /**< Mask for OT value */ +#define XADCPS_ATR_OT_UPPER_VAL_SHIFT 4 /**< Shift for OT value */ +#define XADCPS_ATR_OT_UPPER_ENB_VAL 0x0003 /**< Value for OT enable */ +#define XADCPS_ATR_OT_UPPER_VAL_MAX 0x0FFF /**< Max OT value */ + +/*@}*/ + + +/** + * @name JTAG DRP Bit Definitions + * @{ + */ +#define XADCPS_JTAG_DATA_MASK 0x0000FFFF /**< Mask for the Data */ +#define XADCPS_JTAG_ADDR_MASK 0x03FF0000 /**< Mask for the Addr */ +#define XADCPS_JTAG_ADDR_SHIFT 16 /**< Shift for the Addr */ +#define XADCPS_JTAG_CMD_MASK 0x3C000000 /**< Mask for the Cmd */ +#define XADCPS_JTAG_CMD_WRITE_MASK 0x08000000 /**< Mask for CMD Write */ +#define XADCPS_JTAG_CMD_READ_MASK 0x04000000 /**< Mask for CMD Read */ +#define XADCPS_JTAG_CMD_SHIFT 26 /**< Shift for the Cmd */ + +/*@}*/ + +/** @name Unlock Register Definitions + * @{ + */ + #define XADCPS_UNLK_OFFSET 0x034 /**< Unlock Register */ + #define XADCPS_UNLK_VALUE 0x757BDF0D /**< Unlock Value */ + + /* @} */ + + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/*****************************************************************************/ +/** +* +* Read a register of the XADC device. This macro provides register +* access to all registers using the register offsets defined above. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset is the offset of the register to read. +* +* @return The contents of the register. +* +* @note C-style Signature: +* u32 XAdcPs_ReadReg(u32 BaseAddress, u32 RegOffset); +* +******************************************************************************/ +#define XAdcPs_ReadReg(BaseAddress, RegOffset) \ + (Xil_In32((BaseAddress) + (RegOffset))) + +/*****************************************************************************/ +/** +* +* Write a register of the XADC device. This macro provides +* register access to all registers using the register offsets defined above. +* +* @param BaseAddress contains the base address of the device. +* @param RegOffset is the offset of the register to write. +* @param Data is the value to write to the register. +* +* @return None. +* +* @note C-style Signature: +* void XAdcPs_WriteReg(u32 BaseAddress, +* u32 RegOffset,u32 Data) +* +******************************************************************************/ +#define XAdcPs_WriteReg(BaseAddress, RegOffset, Data) \ + (Xil_Out32((BaseAddress) + (RegOffset), (Data))) + +/************************** Function Prototypes ******************************/ + + +/*****************************************************************************/ +/** +* +* Formats the data to be written to the the XADC registers. +* +* @param RegOffset is the offset of the Register +* @param Data is the data to be written to the Register if it is +* a write. +* @param ReadWrite specifies whether it is a Read or a Write. +* Use 0 for Read, 1 for Write. +* +* @return None. +* +* @note C-style Signature: +* void XAdcPs_FormatWriteData(u32 RegOffset, +* u16 Data, int ReadWrite) +* +******************************************************************************/ +#define XAdcPs_FormatWriteData(RegOffset, Data, ReadWrite) \ + ((ReadWrite ? XADCPS_JTAG_CMD_WRITE_MASK : XADCPS_JTAG_CMD_READ_MASK ) | \ + ((RegOffset << XADCPS_JTAG_ADDR_SHIFT) & XADCPS_JTAG_ADDR_MASK) | \ + (Data & XADCPS_JTAG_DATA_MASK)) + + + +#ifdef __cplusplus +} +#endif + +#endif /* End of protection macro. */ diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_intr.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_intr.c new file mode 100755 index 000000000..c66c58454 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_intr.c @@ -0,0 +1,256 @@ +/****************************************************************************** +* +* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xadcps_intr.c +* +* This file contains interrupt handling API functions of the XADC +* device. +* +* The device must be configured at hardware build time to support interrupt +* for all the functions in this file to work. +* +* Refer to xadcps.h header file and device specification for more information. +* +* @note +* +* Calling the interrupt functions without including the interrupt component will +* result in asserts if asserts are enabled, and will result in a unpredictable +* behavior if the asserts are not enabled. +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a ssb 12/22/11 First release based on the XPS/AXI xadc driver +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xadcps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ + + +/****************************************************************************/ +/** +* +* This function enables the specified interrupts in the device. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Mask is the bit-mask of the interrupts to be enabled. +* Bit positions of 1 will be enabled. Bit positions of 0 will +* keep the previous setting. This mask is formed by OR'ing +* XADCPS_INTX_* bits defined in xadcps_hw.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_IntrEnable(XAdcPs *InstancePtr, u32 Mask) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Disable the specified interrupts in the IPIER. + */ + RegValue = XAdcPs_ReadReg(InstancePtr->Config.BaseAddress, + XADCPS_INT_MASK_OFFSET); + RegValue &= ~(Mask & XADCPS_INTX_ALL_MASK); + XAdcPs_WriteReg(InstancePtr->Config.BaseAddress, + XADCPS_INT_MASK_OFFSET, + RegValue); +} + + +/****************************************************************************/ +/** +* +* This function disables the specified interrupts in the device. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Mask is the bit-mask of the interrupts to be disabled. +* Bit positions of 1 will be disabled. Bit positions of 0 will +* keep the previous setting. This mask is formed by OR'ing +* XADCPS_INTX_* bits defined in xadcps_hw.h. +* +* @return None. +* +* @note None +* +*****************************************************************************/ +void XAdcPs_IntrDisable(XAdcPs *InstancePtr, u32 Mask) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Enable the specified interrupts in the IPIER. + */ + RegValue = XAdcPs_ReadReg(InstancePtr->Config.BaseAddress, + XADCPS_INT_MASK_OFFSET); + RegValue |= (Mask & XADCPS_INTX_ALL_MASK); + XAdcPs_WriteReg(InstancePtr->Config.BaseAddress, + XADCPS_INT_MASK_OFFSET, + RegValue); +} +/****************************************************************************/ +/** +* +* This function returns the enabled interrupts read from the Interrupt Mask +* Register (IPIER). Use the XADCPS_IPIXR_* constants defined in xadcps_hw.h to +* interpret the returned value. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return A 32-bit value representing the contents of the I. +* +* @note None. +* +*****************************************************************************/ +u32 XAdcPs_IntrGetEnabled(XAdcPs *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Return the value read from the Interrupt Enable Register. + */ + return (~ XAdcPs_ReadReg(InstancePtr->Config.BaseAddress, + XADCPS_INT_MASK_OFFSET) & XADCPS_INTX_ALL_MASK); +} + +/****************************************************************************/ +/** +* +* This function returns the interrupt status read from Interrupt Status +* Register(IPISR). Use the XADCPS_IPIXR_* constants defined in xadcps_hw.h +* to interpret the returned value. +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return A 32-bit value representing the contents of the IPISR. +* +* @note The device must be configured at hardware build time to include +* interrupt component for this function to work. +* +*****************************************************************************/ +u32 XAdcPs_IntrGetStatus(XAdcPs *InstancePtr) +{ + /* + * Assert the arguments. + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Return the value read from the Interrupt Status register. + */ + return XAdcPs_ReadReg(InstancePtr->Config.BaseAddress, + XADCPS_INT_STS_OFFSET) & XADCPS_INTX_ALL_MASK; +} + +/****************************************************************************/ +/** +* +* This function clears the specified interrupts in the Interrupt Status +* Register (IPISR). +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* @param Mask is the bit-mask of the interrupts to be cleared. +* Bit positions of 1 will be cleared. Bit positions of 0 will not +* change the previous interrupt status. This mask is formed by +* OR'ing XADCPS_IPIXR_* bits which are defined in xadcps_hw.h. +* +* @return None. +* +* @note None. +* +*****************************************************************************/ +void XAdcPs_IntrClear(XAdcPs *InstancePtr, u32 Mask) +{ + u32 RegValue; + + /* + * Assert the arguments. + */ + Xil_AssertVoid(InstancePtr != NULL); + Xil_AssertVoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + /* + * Clear the specified interrupts in the Interrupt Status register. + */ + RegValue = XAdcPs_ReadReg(InstancePtr->Config.BaseAddress, + XADCPS_INT_STS_OFFSET); + RegValue &= (Mask & XADCPS_INTX_ALL_MASK); + XAdcPs_WriteReg(InstancePtr->Config.BaseAddress, XADCPS_INT_STS_OFFSET, + RegValue); + +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_selftest.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_selftest.c new file mode 100755 index 000000000..9a6d97e57 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_selftest.c @@ -0,0 +1,147 @@ +/****************************************************************************** +* +* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xadcps_selftest.c +* +* This file contains a diagnostic self test function for the XAdcPs driver. +* The self test function does a simple read/write test of the Alarm Threshold +* Register. +* +* See xadcps.h for more information. +* +* @note None. +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a ssb 12/22/11 First release based on the XPS/AXI xadc driver +* +* </pre> +* +*****************************************************************************/ + +/***************************** Include Files ********************************/ + +#include "xadcps.h" + +/************************** Constant Definitions ****************************/ + +/* + * The following constant defines the test value to be written + * to the Alarm Threshold Register + */ +#define XADCPS_ATR_TEST_VALUE 0x55 + +/**************************** Type Definitions ******************************/ + +/***************** Macros (Inline Functions) Definitions ********************/ + +/************************** Variable Definitions ****************************/ + +/************************** Function Prototypes *****************************/ + +/*****************************************************************************/ +/** +* +* Run a self-test on the driver/device. The test +* - Resets the device, +* - Writes a value into the Alarm Threshold register and reads it back +* for comparison. +* - Resets the device again. +* +* +* @param InstancePtr is a pointer to the XAdcPs instance. +* +* @return +* - XST_SUCCESS if the value read from the Alarm Threshold +* register is the same as the value written. +* - XST_FAILURE Otherwise +* +* @note This is a destructive test in that resets of the device are +* performed. Refer to the device specification for the +* device status after the reset operation. +* +******************************************************************************/ +int XAdcPs_SelfTest(XAdcPs *InstancePtr) +{ + int Status; + u32 RegValue; + + /* + * Assert the argument + */ + Xil_AssertNonvoid(InstancePtr != NULL); + Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY); + + + /* + * Reset the device to get it back to its default state + */ + XAdcPs_Reset(InstancePtr); + + /* + * Write a value into the Alarm Threshold registers, read it back, and + * do the comparison + */ + XAdcPs_SetAlarmThreshold(InstancePtr, XADCPS_ATR_VCCINT_UPPER, + XADCPS_ATR_TEST_VALUE); + RegValue = XAdcPs_GetAlarmThreshold(InstancePtr, XADCPS_ATR_VCCINT_UPPER); + + if (RegValue == XADCPS_ATR_TEST_VALUE) { + Status = XST_SUCCESS; + } else { + Status = XST_FAILURE; + } + + /* + * Reset the device again to its default state. + */ + XAdcPs_Reset(InstancePtr); + /* + * Return the test result. + */ + return Status; +} diff --git a/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_sinit.c b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_sinit.c new file mode 100755 index 000000000..3ba9409a2 --- /dev/null +++ b/quad/zybo_fsbl_bsp/ps7_cortexa9_0/libsrc/xadcps_v1_02_a/src/xadcps_sinit.c @@ -0,0 +1,109 @@ +/****************************************************************************** +* +* (c) Copyright 2011-2013 Xilinx, Inc. All rights reserved. +* +* This file contains confidential and proprietary information of Xilinx, Inc. +* and is protected under U.S. and international copyright and other +* intellectual property laws. +* +* DISCLAIMER +* This disclaimer is not a license and does not grant any rights to the +* materials distributed herewith. Except as otherwise provided in a valid +* license issued to you by Xilinx, and to the maximum extent permitted by +* applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL +* FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS, +* IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF +* MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; +* and (2) Xilinx shall not be liable (whether in contract or tort, including +* negligence, or under any other theory of liability) for any loss or damage +* of any kind or nature related to, arising under or in connection with these +* materials, including for any direct, or any indirect, special, incidental, +* or consequential loss or damage (including loss of data, profits, goodwill, +* or any type of loss or damage suffered as a result of any action brought by +* a third party) even if such damage or loss was reasonably foreseeable or +* Xilinx had been advised of the possibility of the same. +* +* CRITICAL APPLICATIONS +* Xilinx products are not designed or intended to be fail-safe, or for use in +* any application requiring fail-safe performance, such as life-support or +* safety devices or systems, Class III medical devices, nuclear facilities, +* applications related to the deployment of airbags, or any other applications +* that could lead to death, personal injury, or severe property or +* environmental damage (individually and collectively, "Critical +* Applications"). Customer assumes the sole risk and liability of any use of +* Xilinx products in Critical Applications, subject only to applicable laws +* and regulations governing limitations on product liability. +* +* THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE +* AT ALL TIMES. +* +******************************************************************************/ +/*****************************************************************************/ +/** +* +* @file xadcps_sinit.c +* +* This file contains the implementation of the XAdcPs driver's static +* initialization functionality. +* +* @note None. +* +* <pre> +* +* MODIFICATION HISTORY: +* +* Ver Who Date Changes +* ----- ----- -------- ----------------------------------------------------- +* 1.00a ssb 12/22/11 First release based on the XPS/AXI XADC driver +* +* </pre> +* +******************************************************************************/ + +/***************************** Include Files *********************************/ + +#include "xparameters.h" +#include "xadcps.h" + +/************************** Constant Definitions *****************************/ + +/**************************** Type Definitions *******************************/ + +/***************** Macros (Inline Functions) Definitions *********************/ + +/************************** Function Prototypes ******************************/ + +/************************** Variable Definitions *****************************/ +extern XAdcPs_Config XAdcPs_ConfigTable[]; + +/*****************************************************************************/ +/** +* +* This function looks up the device configuration based on the unique device ID. +* The table XAdcPs_ConfigTable contains the configuration info for each device +* in the system. +* +* @param DeviceId contains the ID of the device for which the +* device configuration pointer is to be returned. +* +* @return +* - A pointer to the configuration found. +* - NULL if the specified device ID was not found. +* +* @note None. +* +******************************************************************************/ +XAdcPs_Config *XAdcPs_LookupConfig(u16 DeviceId) +{ + XAdcPs_Config *CfgPtr = NULL; + u32 Index; + + for (Index=0; Index < 1; Index++) { + if (XAdcPs_ConfigTable[Index].DeviceId == DeviceId) { + CfgPtr = &XAdcPs_ConfigTable[Index]; + break; + } + } + + return CfgPtr; +} diff --git a/quad/zybo_fsbl_bsp/system.mss b/quad/zybo_fsbl_bsp/system.mss new file mode 100644 index 000000000..ceb921a9a --- /dev/null +++ b/quad/zybo_fsbl_bsp/system.mss @@ -0,0 +1,291 @@ + + PARAMETER VERSION = 2.2.0 + + +BEGIN OS + PARAMETER OS_NAME = standalone + PARAMETER OS_VER = 3.11.a + PARAMETER PROC_INSTANCE = ps7_cortexa9_0 + PARAMETER STDIN = ps7_uart_1 + PARAMETER STDOUT = ps7_uart_1 +END + + +BEGIN PROCESSOR + PARAMETER DRIVER_NAME = cpu_cortexa9 + PARAMETER DRIVER_VER = 1.01.a + PARAMETER HW_INSTANCE = ps7_cortexa9_0 +END + + +BEGIN DRIVER + PARAMETER DRIVER_NAME = tmrctr + PARAMETER DRIVER_VER = 2.05.a + PARAMETER HW_INSTANCE = axi_timer_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = gpio + PARAMETER DRIVER_VER = 3.01.a + PARAMETER HW_INSTANCE = btns_4bits_tri_io +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_afi_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_afi_1 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_afi_2 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_afi_3 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_coresight_comp_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_ddr_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_ddrc_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = devcfg + PARAMETER DRIVER_VER = 2.04.a + PARAMETER HW_INSTANCE = ps7_dev_cfg_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = dmaps + PARAMETER DRIVER_VER = 1.06.a + PARAMETER HW_INSTANCE = ps7_dma_ns +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = dmaps + PARAMETER DRIVER_VER = 1.06.a + PARAMETER HW_INSTANCE = ps7_dma_s +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = emacps + PARAMETER DRIVER_VER = 1.05.a + PARAMETER HW_INSTANCE = ps7_ethernet_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_globaltimer_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = gpiops + PARAMETER DRIVER_VER = 1.02.a + PARAMETER HW_INSTANCE = ps7_gpio_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_gpv_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = iicps + PARAMETER DRIVER_VER = 1.04.a + PARAMETER HW_INSTANCE = ps7_i2c_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_intc_dist_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_iop_bus_config_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_l2cachec_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_ocmc_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = qspips + PARAMETER DRIVER_VER = 2.03.a + PARAMETER HW_INSTANCE = ps7_qspi_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_qspi_linear_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_ram_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_ram_1 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_scuc_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = scugic + PARAMETER DRIVER_VER = 1.05.a + PARAMETER HW_INSTANCE = ps7_scugic_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = scutimer + PARAMETER DRIVER_VER = 1.02.a + PARAMETER HW_INSTANCE = ps7_scutimer_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = scuwdt + PARAMETER DRIVER_VER = 1.02.a + PARAMETER HW_INSTANCE = ps7_scuwdt_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_sd_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = ps7_slcr_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = uartps + PARAMETER DRIVER_VER = 1.05.a + PARAMETER HW_INSTANCE = ps7_uart_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = uartps + PARAMETER DRIVER_VER = 1.05.a + PARAMETER HW_INSTANCE = ps7_uart_1 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = usbps + PARAMETER DRIVER_VER = 1.05.a + PARAMETER HW_INSTANCE = ps7_usb_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = xadcps + PARAMETER DRIVER_VER = 1.02.a + PARAMETER HW_INSTANCE = ps7_xadc_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_recorder_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_recorder_1 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_recorder_2 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_recorder_3 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_recorder_4 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_recorder_5 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_signal_out_wkillswitch_0 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_signal_out_wkillswitch_1 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_signal_out_wkillswitch_2 +END + +BEGIN DRIVER + PARAMETER DRIVER_NAME = generic + PARAMETER DRIVER_VER = 1.00.a + PARAMETER HW_INSTANCE = pwm_signal_out_wkillswitch_3 +END + + -- GitLab